From adc12c4b587941c1a952cf936f8de3f410ac5fcf Mon Sep 17 00:00:00 2001 From: ahgamut <41098605+ahgamut@users.noreply.github.com> Date: Tue, 26 Oct 2021 23:19:30 +0530 Subject: [PATCH 1/3] add make-4.3.tar.gz --- third_party/make/ABOUT-NLS | 1282 + third_party/make/AUTHORS | 90 + third_party/make/Basic.mk | 246 + third_party/make/COPYING | 674 + third_party/make/ChangeLog | 2684 +++ third_party/make/Makefile.am | 182 + third_party/make/Makefile.in | 2030 ++ third_party/make/NEWS | 1635 ++ third_party/make/README | 188 + third_party/make/README.Amiga | 80 + third_party/make/README.DOS | 296 + third_party/make/README.OS2 | 176 + third_party/make/README.VMS | 515 + third_party/make/README.W32 | 361 + third_party/make/README.cosmo | 4 + third_party/make/README.customs | 112 + third_party/make/SCOPTIONS | 13 + third_party/make/aclocal.m4 | 1493 ++ third_party/make/build-aux/compile | 348 + third_party/make/build-aux/config.guess | 1667 ++ third_party/make/build-aux/config.rpath | 684 + third_party/make/build-aux/config.sub | 1793 ++ third_party/make/build-aux/depcomp | 791 + third_party/make/build-aux/install-sh | 529 + third_party/make/build-aux/mdate-sh | 228 + third_party/make/build-aux/missing | 215 + third_party/make/build-aux/texinfo.tex | 11620 +++++++++ third_party/make/build.cfg.in | 38 + third_party/make/build.sh | 149 + third_party/make/build_w32.bat | 402 + third_party/make/builddos.bat | 95 + third_party/make/configure | 19666 ++++++++++++++++ third_party/make/configure.ac | 538 + third_party/make/doc/Makefile.am | 24 + third_party/make/doc/Makefile.in | 1324 ++ third_party/make/doc/fdl.texi | 505 + third_party/make/doc/make-stds.texi | 1173 + third_party/make/doc/make.1 | 379 + third_party/make/doc/make.info | 207 + third_party/make/doc/make.info-1 | 7224 ++++++ third_party/make/doc/make.info-2 | 6463 +++++ third_party/make/doc/make.texi | 13061 ++++++++++ third_party/make/doc/stamp-vti | 4 + third_party/make/doc/version.texi | 4 + third_party/make/lib/Makefile.am | 1169 + third_party/make/lib/Makefile.in | 2118 ++ third_party/make/lib/_Noreturn.h | 40 + third_party/make/lib/access.c | 31 + third_party/make/lib/alloca.c | 478 + third_party/make/lib/alloca.in.h | 71 + third_party/make/lib/arg-nonnull.h | 26 + third_party/make/lib/basename-lgpl.c | 75 + third_party/make/lib/c++defs.h | 316 + third_party/make/lib/close.c | 71 + third_party/make/lib/concat-filename.c | 73 + third_party/make/lib/concat-filename.h | 41 + third_party/make/lib/dirname-lgpl.c | 86 + third_party/make/lib/dirname.h | 54 + third_party/make/lib/dosname.h | 52 + third_party/make/lib/dup2.c | 235 + third_party/make/lib/errno.in.h | 279 + third_party/make/lib/error.c | 411 + third_party/make/lib/error.h | 75 + third_party/make/lib/exitfail.c | 24 + third_party/make/lib/exitfail.h | 18 + third_party/make/lib/fcntl.c | 627 + third_party/make/lib/fcntl.in.h | 392 + third_party/make/lib/fd-hook.c | 116 + third_party/make/lib/fd-hook.h | 119 + third_party/make/lib/filename.h | 54 + third_party/make/lib/findprog-in.c | 251 + third_party/make/lib/findprog.h | 71 + third_party/make/lib/fnmatch.c | 489 + third_party/make/lib/fnmatch.in.h | 85 + third_party/make/lib/getdtablesize.c | 124 + third_party/make/lib/getloadavg.c | 953 + third_party/make/lib/getprogname.c | 260 + third_party/make/lib/getprogname.h | 40 + third_party/make/lib/gettext.h | 301 + third_party/make/lib/glob.c | 1437 ++ third_party/make/lib/glob.in.h | 210 + third_party/make/lib/intprops.h | 584 + third_party/make/lib/limits.in.h | 104 + third_party/make/lib/malloc.c | 56 + third_party/make/lib/msvc-inval.c | 129 + third_party/make/lib/msvc-inval.h | 222 + third_party/make/lib/msvc-nothrow.c | 51 + third_party/make/lib/msvc-nothrow.h | 43 + third_party/make/lib/stdbool.in.h | 132 + third_party/make/lib/stddef.in.h | 121 + third_party/make/lib/stdint.in.h | 746 + third_party/make/lib/stdio.in.h | 1444 ++ third_party/make/lib/stdlib.in.h | 1112 + third_party/make/lib/stpcpy.c | 49 + third_party/make/lib/strerror-override.c | 302 + third_party/make/lib/strerror-override.h | 56 + third_party/make/lib/strerror.c | 71 + third_party/make/lib/string.in.h | 1067 + third_party/make/lib/stripslash.c | 45 + third_party/make/lib/sys_types.in.h | 106 + third_party/make/lib/unistd.c | 4 + third_party/make/lib/unistd.in.h | 1719 ++ third_party/make/lib/verify.h | 301 + third_party/make/lib/warn-on-use.h | 131 + third_party/make/lib/xalloc-die.c | 41 + third_party/make/lib/xalloc-oversized.h | 60 + third_party/make/lib/xalloc.h | 262 + third_party/make/lib/xconcat-filename.c | 41 + third_party/make/lib/xmalloc.c | 122 + third_party/make/m4/00gnulib.m4 | 46 + third_party/make/m4/absolute-header.m4 | 102 + third_party/make/m4/access.m4 | 16 + third_party/make/m4/acinclude.m4 | 132 + third_party/make/m4/alloca.m4 | 128 + third_party/make/m4/asm-underscore.m4 | 72 + third_party/make/m4/close.m4 | 35 + third_party/make/m4/dirname.m4 | 19 + third_party/make/m4/dospaths.m4 | 33 + third_party/make/m4/double-slash-root.m4 | 38 + third_party/make/m4/dup2.m4 | 117 + third_party/make/m4/eaccess.m4 | 12 + third_party/make/m4/errno_h.m4 | 133 + third_party/make/m4/error.m4 | 27 + third_party/make/m4/extensions.m4 | 189 + third_party/make/m4/extern-inline.m4 | 114 + third_party/make/m4/fcntl-o.m4 | 139 + third_party/make/m4/fcntl.m4 | 126 + third_party/make/m4/fcntl_h.m4 | 52 + third_party/make/m4/findprog-in.m4 | 11 + third_party/make/m4/getdtablesize.m4 | 60 + third_party/make/m4/getloadavg.m4 | 159 + third_party/make/m4/getprogname.m4 | 43 + third_party/make/m4/gettext.m4 | 401 + third_party/make/m4/gnulib-cache.m4 | 69 + third_party/make/m4/gnulib-common.m4 | 459 + third_party/make/m4/gnulib-comp.m4 | 481 + third_party/make/m4/host-cpu-c-abi.m4 | 675 + third_party/make/m4/iconv.m4 | 271 + third_party/make/m4/include_next.m4 | 224 + third_party/make/m4/intlmacosx.m4 | 56 + third_party/make/m4/lib-ld.m4 | 119 + third_party/make/m4/lib-link.m4 | 777 + third_party/make/m4/lib-prefix.m4 | 224 + third_party/make/m4/limits-h.m4 | 43 + third_party/make/m4/longlong.m4 | 113 + third_party/make/m4/malloc.m4 | 104 + third_party/make/m4/msvc-inval.m4 | 19 + third_party/make/m4/msvc-nothrow.m4 | 10 + third_party/make/m4/multiarch.m4 | 62 + third_party/make/m4/nls.m4 | 32 + third_party/make/m4/off_t.m4 | 18 + third_party/make/m4/po.m4 | 453 + third_party/make/m4/progtest.m4 | 91 + third_party/make/m4/ssize_t.m4 | 23 + third_party/make/m4/stdbool.m4 | 122 + third_party/make/m4/stddef_h.m4 | 72 + third_party/make/m4/stdint.m4 | 535 + third_party/make/m4/stdio_h.m4 | 225 + third_party/make/m4/stdlib_h.m4 | 136 + third_party/make/m4/stpcpy.m4 | 25 + third_party/make/m4/strerror.m4 | 102 + third_party/make/m4/string_h.m4 | 122 + third_party/make/m4/sys_socket_h.m4 | 188 + third_party/make/m4/sys_types_h.m4 | 60 + third_party/make/m4/unistd_h.m4 | 201 + third_party/make/m4/warn-on-use.m4 | 51 + third_party/make/m4/wchar_t.m4 | 24 + third_party/make/m4/wint_t.m4 | 74 + third_party/make/m4/xalloc.m4 | 7 + third_party/make/makefile.com | 171 + third_party/make/mk/Amiga.mk | 45 + third_party/make/mk/VMS.mk | 97 + third_party/make/mk/Windows32.mk | 122 + third_party/make/mk/msdosdjgpp.mk | 43 + third_party/make/po/LINGUAS | 29 + third_party/make/po/Makefile.in.in | 475 + third_party/make/po/Makevars | 87 + third_party/make/po/POTFILES.in | 47 + third_party/make/po/Rules-quot | 58 + third_party/make/po/be.gmo | Bin 0 -> 6580 bytes third_party/make/po/be.po | 2223 ++ third_party/make/po/bg.gmo | Bin 0 -> 59330 bytes third_party/make/po/bg.po | 2293 ++ third_party/make/po/boldquot.sed | 10 + third_party/make/po/cs.gmo | Bin 0 -> 45689 bytes third_party/make/po/cs.po | 2390 ++ third_party/make/po/da.gmo | Bin 0 -> 41220 bytes third_party/make/po/da.po | 2430 ++ third_party/make/po/de.gmo | Bin 0 -> 45198 bytes third_party/make/po/de.po | 2547 ++ third_party/make/po/en@boldquot.header | 25 + third_party/make/po/en@quot.header | 22 + third_party/make/po/es.gmo | Bin 0 -> 45980 bytes third_party/make/po/es.po | 2884 +++ third_party/make/po/fi.gmo | Bin 0 -> 31939 bytes third_party/make/po/fi.po | 2362 ++ third_party/make/po/fr.gmo | Bin 0 -> 44911 bytes third_party/make/po/fr.po | 2686 +++ third_party/make/po/ga.gmo | Bin 0 -> 43490 bytes third_party/make/po/ga.po | 2362 ++ third_party/make/po/gl.gmo | Bin 0 -> 21543 bytes third_party/make/po/gl.po | 2664 +++ third_party/make/po/he.gmo | Bin 0 -> 10151 bytes third_party/make/po/he.po | 2411 ++ third_party/make/po/hr.gmo | Bin 0 -> 46070 bytes third_party/make/po/hr.po | 2522 ++ third_party/make/po/id.gmo | Bin 0 -> 40284 bytes third_party/make/po/id.po | 2472 ++ third_party/make/po/insert-header.sin | 23 + third_party/make/po/it.gmo | Bin 0 -> 45544 bytes third_party/make/po/it.po | 2293 ++ third_party/make/po/ja.gmo | Bin 0 -> 48996 bytes third_party/make/po/ja.po | 2409 ++ third_party/make/po/ko.gmo | Bin 0 -> 46973 bytes third_party/make/po/ko.po | 2258 ++ third_party/make/po/lt.gmo | Bin 0 -> 7037 bytes third_party/make/po/lt.po | 2204 ++ third_party/make/po/make.pot | 2123 ++ third_party/make/po/nl.gmo | Bin 0 -> 44391 bytes third_party/make/po/nl.po | 2372 ++ third_party/make/po/pl.gmo | Bin 0 -> 44530 bytes third_party/make/po/pl.po | 2252 ++ third_party/make/po/pt.gmo | Bin 0 -> 43530 bytes third_party/make/po/pt.po | 2266 ++ third_party/make/po/pt_BR.gmo | Bin 0 -> 44043 bytes third_party/make/po/pt_BR.po | 2494 ++ third_party/make/po/quot.sed | 6 + third_party/make/po/remove-potcdate.sin | 19 + third_party/make/po/ru.gmo | Bin 0 -> 56673 bytes third_party/make/po/ru.po | 2409 ++ third_party/make/po/sr.gmo | Bin 0 -> 53185 bytes third_party/make/po/sr.po | 2274 ++ third_party/make/po/stamp-po | 1 + third_party/make/po/sv.gmo | Bin 0 -> 43480 bytes third_party/make/po/sv.po | 2245 ++ third_party/make/po/tr.gmo | Bin 0 -> 18996 bytes third_party/make/po/tr.po | 2446 ++ third_party/make/po/uk.gmo | Bin 0 -> 56014 bytes third_party/make/po/uk.po | 2354 ++ third_party/make/po/vi.gmo | Bin 0 -> 47388 bytes third_party/make/po/vi.po | 2392 ++ third_party/make/po/zh_CN.gmo | Bin 0 -> 42126 bytes third_party/make/po/zh_CN.po | 2430 ++ third_party/make/po/zh_TW.gmo | Bin 0 -> 42268 bytes third_party/make/po/zh_TW.po | 2222 ++ third_party/make/src/amiga.c | 117 + third_party/make/src/amiga.h | 18 + third_party/make/src/ar.c | 328 + third_party/make/src/arscan.c | 961 + third_party/make/src/commands.c | 711 + third_party/make/src/commands.h | 42 + third_party/make/src/config.ami | 337 + third_party/make/src/config.h-vms | 433 + third_party/make/src/config.h.W32 | 554 + third_party/make/src/config.h.in | 1132 + third_party/make/src/configh.dos | 116 + third_party/make/src/debug.h | 39 + third_party/make/src/default.c | 757 + third_party/make/src/dep.h | 133 + third_party/make/src/dir.c | 1351 ++ third_party/make/src/expand.c | 597 + third_party/make/src/file.c | 1202 + third_party/make/src/filedef.h | 218 + third_party/make/src/function.c | 2699 +++ third_party/make/src/getopt.c | 1026 + third_party/make/src/getopt.h | 130 + third_party/make/src/getopt1.c | 176 + third_party/make/src/gettext.h | 57 + third_party/make/src/gmk-default.h | 28 + third_party/make/src/gmk-default.scm | 53 + third_party/make/src/gnumake.h | 79 + third_party/make/src/guile.c | 159 + third_party/make/src/hash.c | 495 + third_party/make/src/hash.h | 234 + third_party/make/src/implicit.c | 1017 + third_party/make/src/job.c | 3738 +++ third_party/make/src/job.h | 93 + third_party/make/src/load.c | 267 + third_party/make/src/loadapi.c | 82 + third_party/make/src/main.c | 3510 +++ third_party/make/src/makeint.h | 808 + third_party/make/src/misc.c | 847 + third_party/make/src/os.h | 93 + third_party/make/src/output.c | 682 + third_party/make/src/output.h | 106 + third_party/make/src/posixos.c | 512 + third_party/make/src/read.c | 3471 +++ third_party/make/src/remake.c | 1755 ++ third_party/make/src/remote-cstms.c | 300 + third_party/make/src/remote-stub.c | 99 + third_party/make/src/rule.c | 560 + third_party/make/src/rule.h | 57 + third_party/make/src/signame.c | 254 + third_party/make/src/strcache.c | 330 + third_party/make/src/variable.c | 1826 ++ third_party/make/src/variable.h | 241 + third_party/make/src/version.c | 33 + third_party/make/src/vms_exit.c | 95 + third_party/make/src/vms_export_symbol.c | 527 + third_party/make/src/vms_progname.c | 463 + third_party/make/src/vmsdir.h | 76 + third_party/make/src/vmsfunctions.c | 226 + third_party/make/src/vmsify.c | 1005 + third_party/make/src/vmsjobs.c | 1465 ++ third_party/make/src/vpath.c | 637 + third_party/make/src/w32/compat/dirent.c | 195 + third_party/make/src/w32/compat/posixfcn.c | 486 + third_party/make/src/w32/include/dirent.h | 84 + third_party/make/src/w32/include/dlfcn.h | 29 + third_party/make/src/w32/include/pathstuff.h | 25 + third_party/make/src/w32/include/sub_proc.h | 64 + third_party/make/src/w32/include/w32err.h | 26 + third_party/make/src/w32/pathstuff.c | 266 + third_party/make/src/w32/subproc/misc.c | 83 + third_party/make/src/w32/subproc/proc.h | 29 + third_party/make/src/w32/subproc/sub_proc.c | 1564 ++ third_party/make/src/w32/subproc/w32err.c | 85 + third_party/make/src/w32/w32os.c | 218 + third_party/make/tests/README | 102 + third_party/make/tests/config-flags.pm.W32 | 9 + third_party/make/tests/config-flags.pm.in | 20 + third_party/make/tests/config_flags_pm.com | 54 + third_party/make/tests/guile.supp | 31 + third_party/make/tests/mkshadow | 57 + third_party/make/tests/run_make_tests | 2 + third_party/make/tests/run_make_tests.bat | 21 + third_party/make/tests/run_make_tests.pl | 697 + .../make/tests/scripts/features/archives | 241 + .../make/tests/scripts/features/comments | 35 + .../make/tests/scripts/features/conditionals | 162 + .../make/tests/scripts/features/default_names | 44 + .../make/tests/scripts/features/double_colon | 220 + .../make/tests/scripts/features/echoing | 64 + .../make/tests/scripts/features/errors | 105 + .../make/tests/scripts/features/escape | 103 + third_party/make/tests/scripts/features/exec | 63 + .../make/tests/scripts/features/export | 186 + .../tests/scripts/features/grouped_targets | 133 + .../make/tests/scripts/features/include | 263 + .../make/tests/scripts/features/jobserver | 109 + third_party/make/tests/scripts/features/load | 118 + .../make/tests/scripts/features/loadapi | 127 + .../make/tests/scripts/features/mult_rules | 78 + .../make/tests/scripts/features/mult_targets | 46 + .../make/tests/scripts/features/order_only | 118 + .../make/tests/scripts/features/output-sync | 342 + .../make/tests/scripts/features/override | 45 + .../make/tests/scripts/features/parallelism | 253 + .../tests/scripts/features/patspecific_vars | 148 + .../make/tests/scripts/features/patternrules | 252 + .../make/tests/scripts/features/quoting | 31 + .../make/tests/scripts/features/recursion | 67 + .../make/tests/scripts/features/reinvoke | 82 + .../make/tests/scripts/features/rule_glob | 37 + .../make/tests/scripts/features/se_explicit | 203 + .../make/tests/scripts/features/se_implicit | 266 + .../make/tests/scripts/features/se_statpat | 107 + .../tests/scripts/features/shell_assignment | 65 + .../tests/scripts/features/statipattrules | 111 + .../make/tests/scripts/features/suffixrules | 99 + .../make/tests/scripts/features/targetvars | 302 + third_party/make/tests/scripts/features/utf8 | 11 + .../make/tests/scripts/features/varnesting | 35 + third_party/make/tests/scripts/features/vpath | 81 + .../make/tests/scripts/features/vpath2 | 45 + .../make/tests/scripts/features/vpath3 | 41 + .../make/tests/scripts/features/vpathgpath | 66 + .../make/tests/scripts/features/vpathplus | 131 + .../make/tests/scripts/functions/abspath | 84 + .../make/tests/scripts/functions/addprefix | 44 + .../make/tests/scripts/functions/addsuffix | 36 + .../make/tests/scripts/functions/andor | 50 + .../make/tests/scripts/functions/basename | 44 + third_party/make/tests/scripts/functions/call | 92 + third_party/make/tests/scripts/functions/dir | 44 + .../make/tests/scripts/functions/error | 71 + third_party/make/tests/scripts/functions/eval | 169 + third_party/make/tests/scripts/functions/file | 151 + .../make/tests/scripts/functions/filter-out | 42 + .../make/tests/scripts/functions/findstring | 47 + .../make/tests/scripts/functions/flavor | 44 + .../make/tests/scripts/functions/foreach | 95 + .../make/tests/scripts/functions/guile | 116 + third_party/make/tests/scripts/functions/if | 33 + third_party/make/tests/scripts/functions/join | 44 + .../make/tests/scripts/functions/notdir | 44 + .../make/tests/scripts/functions/origin | 51 + .../make/tests/scripts/functions/realpath | 92 + .../make/tests/scripts/functions/shell | 90 + third_party/make/tests/scripts/functions/sort | 51 + .../make/tests/scripts/functions/strip | 57 + .../make/tests/scripts/functions/substitution | 38 + .../make/tests/scripts/functions/suffix | 57 + .../make/tests/scripts/functions/value | 30 + .../make/tests/scripts/functions/warning | 83 + .../make/tests/scripts/functions/wildcard | 163 + third_party/make/tests/scripts/functions/word | 167 + third_party/make/tests/scripts/misc/bs-nl | 232 + .../make/tests/scripts/misc/close_stdout | 9 + .../make/tests/scripts/misc/fopen-fail | 18 + third_party/make/tests/scripts/misc/general1 | 51 + third_party/make/tests/scripts/misc/general2 | 50 + third_party/make/tests/scripts/misc/general3 | 347 + third_party/make/tests/scripts/misc/general4 | 121 + third_party/make/tests/scripts/misc/utf8 | 14 + third_party/make/tests/scripts/options/dash-B | 87 + third_party/make/tests/scripts/options/dash-C | 66 + third_party/make/tests/scripts/options/dash-I | 61 + third_party/make/tests/scripts/options/dash-W | 91 + third_party/make/tests/scripts/options/dash-e | 24 + third_party/make/tests/scripts/options/dash-f | 85 + third_party/make/tests/scripts/options/dash-k | 116 + third_party/make/tests/scripts/options/dash-l | 50 + third_party/make/tests/scripts/options/dash-n | 100 + third_party/make/tests/scripts/options/dash-q | 86 + third_party/make/tests/scripts/options/dash-s | 26 + third_party/make/tests/scripts/options/dash-t | 58 + third_party/make/tests/scripts/options/eval | 44 + .../make/tests/scripts/options/general | 30 + .../tests/scripts/options/print-directory | 33 + .../make/tests/scripts/options/symlinks | 69 + .../scripts/options/warn-undefined-variables | 25 + .../make/tests/scripts/targets/DEFAULT | 35 + .../tests/scripts/targets/DELETE_ON_ERROR | 22 + third_party/make/tests/scripts/targets/FORCE | 19 + .../make/tests/scripts/targets/INTERMEDIATE | 108 + .../make/tests/scripts/targets/ONESHELL | 94 + third_party/make/tests/scripts/targets/PHONY | 42 + third_party/make/tests/scripts/targets/POSIX | 55 + .../make/tests/scripts/targets/SECONDARY | 189 + third_party/make/tests/scripts/targets/SILENT | 33 + third_party/make/tests/scripts/targets/clean | 31 + third_party/make/tests/scripts/test_template | 29 + .../make/tests/scripts/variables/CURDIR | 16 + .../make/tests/scripts/variables/DEFAULT_GOAL | 87 + .../tests/scripts/variables/EXTRA_PREREQS | 151 + .../make/tests/scripts/variables/GNUMAKEFLAGS | 42 + .../make/tests/scripts/variables/INCLUDE_DIRS | 46 + .../make/tests/scripts/variables/LIBPATTERNS | 38 + third_party/make/tests/scripts/variables/MAKE | 24 + .../make/tests/scripts/variables/MAKECMDGOALS | 52 + .../make/tests/scripts/variables/MAKEFILES | 47 + .../make/tests/scripts/variables/MAKEFLAGS | 45 + .../make/tests/scripts/variables/MAKELEVEL | 33 + .../tests/scripts/variables/MAKE_RESTARTS | 61 + .../make/tests/scripts/variables/MFILE_LIST | 40 + .../make/tests/scripts/variables/SHELL | 112 + .../make/tests/scripts/variables/automatic | 122 + .../make/tests/scripts/variables/define | 282 + .../make/tests/scripts/variables/flavors | 156 + .../make/tests/scripts/variables/negative | 46 + .../make/tests/scripts/variables/private | 122 + .../make/tests/scripts/variables/special | 149 + .../make/tests/scripts/variables/undefine | 73 + third_party/make/tests/scripts/vms/library | 73 + third_party/make/tests/test_driver.pl | 1459 ++ third_party/make/tests/thelp.pl | 113 + third_party/make/vms_export_symbol_test.com | 37 + 458 files changed, 239669 insertions(+) create mode 100644 third_party/make/ABOUT-NLS create mode 100644 third_party/make/AUTHORS create mode 100644 third_party/make/Basic.mk create mode 100644 third_party/make/COPYING create mode 100644 third_party/make/ChangeLog create mode 100644 third_party/make/Makefile.am create mode 100644 third_party/make/Makefile.in create mode 100644 third_party/make/NEWS create mode 100644 third_party/make/README create mode 100644 third_party/make/README.Amiga create mode 100644 third_party/make/README.DOS create mode 100644 third_party/make/README.OS2 create mode 100644 third_party/make/README.VMS create mode 100644 third_party/make/README.W32 create mode 100644 third_party/make/README.cosmo create mode 100644 third_party/make/README.customs create mode 100644 third_party/make/SCOPTIONS create mode 100644 third_party/make/aclocal.m4 create mode 100755 third_party/make/build-aux/compile create mode 100755 third_party/make/build-aux/config.guess create mode 100755 third_party/make/build-aux/config.rpath create mode 100755 third_party/make/build-aux/config.sub create mode 100755 third_party/make/build-aux/depcomp create mode 100755 third_party/make/build-aux/install-sh create mode 100755 third_party/make/build-aux/mdate-sh create mode 100755 third_party/make/build-aux/missing create mode 100644 third_party/make/build-aux/texinfo.tex create mode 100644 third_party/make/build.cfg.in create mode 100755 third_party/make/build.sh create mode 100755 third_party/make/build_w32.bat create mode 100644 third_party/make/builddos.bat create mode 100755 third_party/make/configure create mode 100644 third_party/make/configure.ac create mode 100644 third_party/make/doc/Makefile.am create mode 100644 third_party/make/doc/Makefile.in create mode 100644 third_party/make/doc/fdl.texi create mode 100644 third_party/make/doc/make-stds.texi create mode 100644 third_party/make/doc/make.1 create mode 100644 third_party/make/doc/make.info create mode 100644 third_party/make/doc/make.info-1 create mode 100644 third_party/make/doc/make.info-2 create mode 100644 third_party/make/doc/make.texi create mode 100644 third_party/make/doc/stamp-vti create mode 100644 third_party/make/doc/version.texi create mode 100644 third_party/make/lib/Makefile.am create mode 100644 third_party/make/lib/Makefile.in create mode 100644 third_party/make/lib/_Noreturn.h create mode 100644 third_party/make/lib/access.c create mode 100644 third_party/make/lib/alloca.c create mode 100644 third_party/make/lib/alloca.in.h create mode 100644 third_party/make/lib/arg-nonnull.h create mode 100644 third_party/make/lib/basename-lgpl.c create mode 100644 third_party/make/lib/c++defs.h create mode 100644 third_party/make/lib/close.c create mode 100644 third_party/make/lib/concat-filename.c create mode 100644 third_party/make/lib/concat-filename.h create mode 100644 third_party/make/lib/dirname-lgpl.c create mode 100644 third_party/make/lib/dirname.h create mode 100644 third_party/make/lib/dosname.h create mode 100644 third_party/make/lib/dup2.c create mode 100644 third_party/make/lib/errno.in.h create mode 100644 third_party/make/lib/error.c create mode 100644 third_party/make/lib/error.h create mode 100644 third_party/make/lib/exitfail.c create mode 100644 third_party/make/lib/exitfail.h create mode 100644 third_party/make/lib/fcntl.c create mode 100644 third_party/make/lib/fcntl.in.h create mode 100644 third_party/make/lib/fd-hook.c create mode 100644 third_party/make/lib/fd-hook.h create mode 100644 third_party/make/lib/filename.h create mode 100644 third_party/make/lib/findprog-in.c create mode 100644 third_party/make/lib/findprog.h create mode 100644 third_party/make/lib/fnmatch.c create mode 100644 third_party/make/lib/fnmatch.in.h create mode 100644 third_party/make/lib/getdtablesize.c create mode 100644 third_party/make/lib/getloadavg.c create mode 100644 third_party/make/lib/getprogname.c create mode 100644 third_party/make/lib/getprogname.h create mode 100644 third_party/make/lib/gettext.h create mode 100644 third_party/make/lib/glob.c create mode 100644 third_party/make/lib/glob.in.h create mode 100644 third_party/make/lib/intprops.h create mode 100644 third_party/make/lib/limits.in.h create mode 100644 third_party/make/lib/malloc.c create mode 100644 third_party/make/lib/msvc-inval.c create mode 100644 third_party/make/lib/msvc-inval.h create mode 100644 third_party/make/lib/msvc-nothrow.c create mode 100644 third_party/make/lib/msvc-nothrow.h create mode 100644 third_party/make/lib/stdbool.in.h create mode 100644 third_party/make/lib/stddef.in.h create mode 100644 third_party/make/lib/stdint.in.h create mode 100644 third_party/make/lib/stdio.in.h create mode 100644 third_party/make/lib/stdlib.in.h create mode 100644 third_party/make/lib/stpcpy.c create mode 100644 third_party/make/lib/strerror-override.c create mode 100644 third_party/make/lib/strerror-override.h create mode 100644 third_party/make/lib/strerror.c create mode 100644 third_party/make/lib/string.in.h create mode 100644 third_party/make/lib/stripslash.c create mode 100644 third_party/make/lib/sys_types.in.h create mode 100644 third_party/make/lib/unistd.c create mode 100644 third_party/make/lib/unistd.in.h create mode 100644 third_party/make/lib/verify.h create mode 100644 third_party/make/lib/warn-on-use.h create mode 100644 third_party/make/lib/xalloc-die.c create mode 100644 third_party/make/lib/xalloc-oversized.h create mode 100644 third_party/make/lib/xalloc.h create mode 100644 third_party/make/lib/xconcat-filename.c create mode 100644 third_party/make/lib/xmalloc.c create mode 100644 third_party/make/m4/00gnulib.m4 create mode 100644 third_party/make/m4/absolute-header.m4 create mode 100644 third_party/make/m4/access.m4 create mode 100644 third_party/make/m4/acinclude.m4 create mode 100644 third_party/make/m4/alloca.m4 create mode 100644 third_party/make/m4/asm-underscore.m4 create mode 100644 third_party/make/m4/close.m4 create mode 100644 third_party/make/m4/dirname.m4 create mode 100644 third_party/make/m4/dospaths.m4 create mode 100644 third_party/make/m4/double-slash-root.m4 create mode 100644 third_party/make/m4/dup2.m4 create mode 100644 third_party/make/m4/eaccess.m4 create mode 100644 third_party/make/m4/errno_h.m4 create mode 100644 third_party/make/m4/error.m4 create mode 100644 third_party/make/m4/extensions.m4 create mode 100644 third_party/make/m4/extern-inline.m4 create mode 100644 third_party/make/m4/fcntl-o.m4 create mode 100644 third_party/make/m4/fcntl.m4 create mode 100644 third_party/make/m4/fcntl_h.m4 create mode 100644 third_party/make/m4/findprog-in.m4 create mode 100644 third_party/make/m4/getdtablesize.m4 create mode 100644 third_party/make/m4/getloadavg.m4 create mode 100644 third_party/make/m4/getprogname.m4 create mode 100644 third_party/make/m4/gettext.m4 create mode 100644 third_party/make/m4/gnulib-cache.m4 create mode 100644 third_party/make/m4/gnulib-common.m4 create mode 100644 third_party/make/m4/gnulib-comp.m4 create mode 100644 third_party/make/m4/host-cpu-c-abi.m4 create mode 100644 third_party/make/m4/iconv.m4 create mode 100644 third_party/make/m4/include_next.m4 create mode 100644 third_party/make/m4/intlmacosx.m4 create mode 100644 third_party/make/m4/lib-ld.m4 create mode 100644 third_party/make/m4/lib-link.m4 create mode 100644 third_party/make/m4/lib-prefix.m4 create mode 100644 third_party/make/m4/limits-h.m4 create mode 100644 third_party/make/m4/longlong.m4 create mode 100644 third_party/make/m4/malloc.m4 create mode 100644 third_party/make/m4/msvc-inval.m4 create mode 100644 third_party/make/m4/msvc-nothrow.m4 create mode 100644 third_party/make/m4/multiarch.m4 create mode 100644 third_party/make/m4/nls.m4 create mode 100644 third_party/make/m4/off_t.m4 create mode 100644 third_party/make/m4/po.m4 create mode 100644 third_party/make/m4/progtest.m4 create mode 100644 third_party/make/m4/ssize_t.m4 create mode 100644 third_party/make/m4/stdbool.m4 create mode 100644 third_party/make/m4/stddef_h.m4 create mode 100644 third_party/make/m4/stdint.m4 create mode 100644 third_party/make/m4/stdio_h.m4 create mode 100644 third_party/make/m4/stdlib_h.m4 create mode 100644 third_party/make/m4/stpcpy.m4 create mode 100644 third_party/make/m4/strerror.m4 create mode 100644 third_party/make/m4/string_h.m4 create mode 100644 third_party/make/m4/sys_socket_h.m4 create mode 100644 third_party/make/m4/sys_types_h.m4 create mode 100644 third_party/make/m4/unistd_h.m4 create mode 100644 third_party/make/m4/warn-on-use.m4 create mode 100644 third_party/make/m4/wchar_t.m4 create mode 100644 third_party/make/m4/wint_t.m4 create mode 100644 third_party/make/m4/xalloc.m4 create mode 100644 third_party/make/makefile.com create mode 100644 third_party/make/mk/Amiga.mk create mode 100644 third_party/make/mk/VMS.mk create mode 100644 third_party/make/mk/Windows32.mk create mode 100644 third_party/make/mk/msdosdjgpp.mk create mode 100644 third_party/make/po/LINGUAS create mode 100644 third_party/make/po/Makefile.in.in create mode 100644 third_party/make/po/Makevars create mode 100644 third_party/make/po/POTFILES.in create mode 100644 third_party/make/po/Rules-quot create mode 100644 third_party/make/po/be.gmo create mode 100644 third_party/make/po/be.po create mode 100644 third_party/make/po/bg.gmo create mode 100644 third_party/make/po/bg.po create mode 100644 third_party/make/po/boldquot.sed create mode 100644 third_party/make/po/cs.gmo create mode 100644 third_party/make/po/cs.po create mode 100644 third_party/make/po/da.gmo create mode 100644 third_party/make/po/da.po create mode 100644 third_party/make/po/de.gmo create mode 100644 third_party/make/po/de.po create mode 100644 third_party/make/po/en@boldquot.header create mode 100644 third_party/make/po/en@quot.header create mode 100644 third_party/make/po/es.gmo create mode 100644 third_party/make/po/es.po create mode 100644 third_party/make/po/fi.gmo create mode 100644 third_party/make/po/fi.po create mode 100644 third_party/make/po/fr.gmo create mode 100644 third_party/make/po/fr.po create mode 100644 third_party/make/po/ga.gmo create mode 100644 third_party/make/po/ga.po create mode 100644 third_party/make/po/gl.gmo create mode 100644 third_party/make/po/gl.po create mode 100644 third_party/make/po/he.gmo create mode 100644 third_party/make/po/he.po create mode 100644 third_party/make/po/hr.gmo create mode 100644 third_party/make/po/hr.po create mode 100644 third_party/make/po/id.gmo create mode 100644 third_party/make/po/id.po create mode 100644 third_party/make/po/insert-header.sin create mode 100644 third_party/make/po/it.gmo create mode 100644 third_party/make/po/it.po create mode 100644 third_party/make/po/ja.gmo create mode 100644 third_party/make/po/ja.po create mode 100644 third_party/make/po/ko.gmo create mode 100644 third_party/make/po/ko.po create mode 100644 third_party/make/po/lt.gmo create mode 100644 third_party/make/po/lt.po create mode 100644 third_party/make/po/make.pot create mode 100644 third_party/make/po/nl.gmo create mode 100644 third_party/make/po/nl.po create mode 100644 third_party/make/po/pl.gmo create mode 100644 third_party/make/po/pl.po create mode 100644 third_party/make/po/pt.gmo create mode 100644 third_party/make/po/pt.po create mode 100644 third_party/make/po/pt_BR.gmo create mode 100644 third_party/make/po/pt_BR.po create mode 100644 third_party/make/po/quot.sed create mode 100644 third_party/make/po/remove-potcdate.sin create mode 100644 third_party/make/po/ru.gmo create mode 100644 third_party/make/po/ru.po create mode 100644 third_party/make/po/sr.gmo create mode 100644 third_party/make/po/sr.po create mode 100644 third_party/make/po/stamp-po create mode 100644 third_party/make/po/sv.gmo create mode 100644 third_party/make/po/sv.po create mode 100644 third_party/make/po/tr.gmo create mode 100644 third_party/make/po/tr.po create mode 100644 third_party/make/po/uk.gmo create mode 100644 third_party/make/po/uk.po create mode 100644 third_party/make/po/vi.gmo create mode 100644 third_party/make/po/vi.po create mode 100644 third_party/make/po/zh_CN.gmo create mode 100644 third_party/make/po/zh_CN.po create mode 100644 third_party/make/po/zh_TW.gmo create mode 100644 third_party/make/po/zh_TW.po create mode 100644 third_party/make/src/amiga.c create mode 100644 third_party/make/src/amiga.h create mode 100644 third_party/make/src/ar.c create mode 100644 third_party/make/src/arscan.c create mode 100644 third_party/make/src/commands.c create mode 100644 third_party/make/src/commands.h create mode 100644 third_party/make/src/config.ami create mode 100644 third_party/make/src/config.h-vms create mode 100644 third_party/make/src/config.h.W32 create mode 100644 third_party/make/src/config.h.in create mode 100644 third_party/make/src/configh.dos create mode 100644 third_party/make/src/debug.h create mode 100644 third_party/make/src/default.c create mode 100644 third_party/make/src/dep.h create mode 100644 third_party/make/src/dir.c create mode 100644 third_party/make/src/expand.c create mode 100644 third_party/make/src/file.c create mode 100644 third_party/make/src/filedef.h create mode 100644 third_party/make/src/function.c create mode 100644 third_party/make/src/getopt.c create mode 100644 third_party/make/src/getopt.h create mode 100644 third_party/make/src/getopt1.c create mode 100644 third_party/make/src/gettext.h create mode 100644 third_party/make/src/gmk-default.h create mode 100644 third_party/make/src/gmk-default.scm create mode 100644 third_party/make/src/gnumake.h create mode 100644 third_party/make/src/guile.c create mode 100644 third_party/make/src/hash.c create mode 100644 third_party/make/src/hash.h create mode 100644 third_party/make/src/implicit.c create mode 100644 third_party/make/src/job.c create mode 100644 third_party/make/src/job.h create mode 100644 third_party/make/src/load.c create mode 100644 third_party/make/src/loadapi.c create mode 100644 third_party/make/src/main.c create mode 100644 third_party/make/src/makeint.h create mode 100644 third_party/make/src/misc.c create mode 100644 third_party/make/src/os.h create mode 100644 third_party/make/src/output.c create mode 100644 third_party/make/src/output.h create mode 100644 third_party/make/src/posixos.c create mode 100644 third_party/make/src/read.c create mode 100644 third_party/make/src/remake.c create mode 100644 third_party/make/src/remote-cstms.c create mode 100644 third_party/make/src/remote-stub.c create mode 100644 third_party/make/src/rule.c create mode 100644 third_party/make/src/rule.h create mode 100644 third_party/make/src/signame.c create mode 100644 third_party/make/src/strcache.c create mode 100644 third_party/make/src/variable.c create mode 100644 third_party/make/src/variable.h create mode 100644 third_party/make/src/version.c create mode 100644 third_party/make/src/vms_exit.c create mode 100644 third_party/make/src/vms_export_symbol.c create mode 100644 third_party/make/src/vms_progname.c create mode 100644 third_party/make/src/vmsdir.h create mode 100644 third_party/make/src/vmsfunctions.c create mode 100644 third_party/make/src/vmsify.c create mode 100644 third_party/make/src/vmsjobs.c create mode 100644 third_party/make/src/vpath.c create mode 100644 third_party/make/src/w32/compat/dirent.c create mode 100644 third_party/make/src/w32/compat/posixfcn.c create mode 100644 third_party/make/src/w32/include/dirent.h create mode 100644 third_party/make/src/w32/include/dlfcn.h create mode 100644 third_party/make/src/w32/include/pathstuff.h create mode 100644 third_party/make/src/w32/include/sub_proc.h create mode 100644 third_party/make/src/w32/include/w32err.h create mode 100644 third_party/make/src/w32/pathstuff.c create mode 100644 third_party/make/src/w32/subproc/misc.c create mode 100644 third_party/make/src/w32/subproc/proc.h create mode 100644 third_party/make/src/w32/subproc/sub_proc.c create mode 100644 third_party/make/src/w32/subproc/w32err.c create mode 100644 third_party/make/src/w32/w32os.c create mode 100644 third_party/make/tests/README create mode 100644 third_party/make/tests/config-flags.pm.W32 create mode 100644 third_party/make/tests/config-flags.pm.in create mode 100755 third_party/make/tests/config_flags_pm.com create mode 100644 third_party/make/tests/guile.supp create mode 100755 third_party/make/tests/mkshadow create mode 100755 third_party/make/tests/run_make_tests create mode 100644 third_party/make/tests/run_make_tests.bat create mode 100644 third_party/make/tests/run_make_tests.pl create mode 100644 third_party/make/tests/scripts/features/archives create mode 100644 third_party/make/tests/scripts/features/comments create mode 100644 third_party/make/tests/scripts/features/conditionals create mode 100644 third_party/make/tests/scripts/features/default_names create mode 100644 third_party/make/tests/scripts/features/double_colon create mode 100644 third_party/make/tests/scripts/features/echoing create mode 100644 third_party/make/tests/scripts/features/errors create mode 100644 third_party/make/tests/scripts/features/escape create mode 100644 third_party/make/tests/scripts/features/exec create mode 100644 third_party/make/tests/scripts/features/export create mode 100644 third_party/make/tests/scripts/features/grouped_targets create mode 100644 third_party/make/tests/scripts/features/include create mode 100644 third_party/make/tests/scripts/features/jobserver create mode 100644 third_party/make/tests/scripts/features/load create mode 100644 third_party/make/tests/scripts/features/loadapi create mode 100644 third_party/make/tests/scripts/features/mult_rules create mode 100644 third_party/make/tests/scripts/features/mult_targets create mode 100644 third_party/make/tests/scripts/features/order_only create mode 100644 third_party/make/tests/scripts/features/output-sync create mode 100644 third_party/make/tests/scripts/features/override create mode 100644 third_party/make/tests/scripts/features/parallelism create mode 100644 third_party/make/tests/scripts/features/patspecific_vars create mode 100644 third_party/make/tests/scripts/features/patternrules create mode 100644 third_party/make/tests/scripts/features/quoting create mode 100644 third_party/make/tests/scripts/features/recursion create mode 100644 third_party/make/tests/scripts/features/reinvoke create mode 100644 third_party/make/tests/scripts/features/rule_glob create mode 100644 third_party/make/tests/scripts/features/se_explicit create mode 100644 third_party/make/tests/scripts/features/se_implicit create mode 100644 third_party/make/tests/scripts/features/se_statpat create mode 100644 third_party/make/tests/scripts/features/shell_assignment create mode 100644 third_party/make/tests/scripts/features/statipattrules create mode 100644 third_party/make/tests/scripts/features/suffixrules create mode 100644 third_party/make/tests/scripts/features/targetvars create mode 100644 third_party/make/tests/scripts/features/utf8 create mode 100644 third_party/make/tests/scripts/features/varnesting create mode 100644 third_party/make/tests/scripts/features/vpath create mode 100644 third_party/make/tests/scripts/features/vpath2 create mode 100644 third_party/make/tests/scripts/features/vpath3 create mode 100644 third_party/make/tests/scripts/features/vpathgpath create mode 100644 third_party/make/tests/scripts/features/vpathplus create mode 100644 third_party/make/tests/scripts/functions/abspath create mode 100644 third_party/make/tests/scripts/functions/addprefix create mode 100644 third_party/make/tests/scripts/functions/addsuffix create mode 100644 third_party/make/tests/scripts/functions/andor create mode 100644 third_party/make/tests/scripts/functions/basename create mode 100644 third_party/make/tests/scripts/functions/call create mode 100644 third_party/make/tests/scripts/functions/dir create mode 100644 third_party/make/tests/scripts/functions/error create mode 100644 third_party/make/tests/scripts/functions/eval create mode 100644 third_party/make/tests/scripts/functions/file create mode 100644 third_party/make/tests/scripts/functions/filter-out create mode 100644 third_party/make/tests/scripts/functions/findstring create mode 100644 third_party/make/tests/scripts/functions/flavor create mode 100644 third_party/make/tests/scripts/functions/foreach create mode 100644 third_party/make/tests/scripts/functions/guile create mode 100644 third_party/make/tests/scripts/functions/if create mode 100644 third_party/make/tests/scripts/functions/join create mode 100644 third_party/make/tests/scripts/functions/notdir create mode 100644 third_party/make/tests/scripts/functions/origin create mode 100644 third_party/make/tests/scripts/functions/realpath create mode 100644 third_party/make/tests/scripts/functions/shell create mode 100644 third_party/make/tests/scripts/functions/sort create mode 100644 third_party/make/tests/scripts/functions/strip create mode 100644 third_party/make/tests/scripts/functions/substitution create mode 100644 third_party/make/tests/scripts/functions/suffix create mode 100644 third_party/make/tests/scripts/functions/value create mode 100644 third_party/make/tests/scripts/functions/warning create mode 100644 third_party/make/tests/scripts/functions/wildcard create mode 100644 third_party/make/tests/scripts/functions/word create mode 100644 third_party/make/tests/scripts/misc/bs-nl create mode 100644 third_party/make/tests/scripts/misc/close_stdout create mode 100644 third_party/make/tests/scripts/misc/fopen-fail create mode 100644 third_party/make/tests/scripts/misc/general1 create mode 100644 third_party/make/tests/scripts/misc/general2 create mode 100644 third_party/make/tests/scripts/misc/general3 create mode 100644 third_party/make/tests/scripts/misc/general4 create mode 100644 third_party/make/tests/scripts/misc/utf8 create mode 100644 third_party/make/tests/scripts/options/dash-B create mode 100644 third_party/make/tests/scripts/options/dash-C create mode 100644 third_party/make/tests/scripts/options/dash-I create mode 100644 third_party/make/tests/scripts/options/dash-W create mode 100644 third_party/make/tests/scripts/options/dash-e create mode 100644 third_party/make/tests/scripts/options/dash-f create mode 100644 third_party/make/tests/scripts/options/dash-k create mode 100644 third_party/make/tests/scripts/options/dash-l create mode 100644 third_party/make/tests/scripts/options/dash-n create mode 100644 third_party/make/tests/scripts/options/dash-q create mode 100644 third_party/make/tests/scripts/options/dash-s create mode 100644 third_party/make/tests/scripts/options/dash-t create mode 100644 third_party/make/tests/scripts/options/eval create mode 100644 third_party/make/tests/scripts/options/general create mode 100644 third_party/make/tests/scripts/options/print-directory create mode 100644 third_party/make/tests/scripts/options/symlinks create mode 100644 third_party/make/tests/scripts/options/warn-undefined-variables create mode 100644 third_party/make/tests/scripts/targets/DEFAULT create mode 100644 third_party/make/tests/scripts/targets/DELETE_ON_ERROR create mode 100644 third_party/make/tests/scripts/targets/FORCE create mode 100644 third_party/make/tests/scripts/targets/INTERMEDIATE create mode 100644 third_party/make/tests/scripts/targets/ONESHELL create mode 100644 third_party/make/tests/scripts/targets/PHONY create mode 100644 third_party/make/tests/scripts/targets/POSIX create mode 100644 third_party/make/tests/scripts/targets/SECONDARY create mode 100644 third_party/make/tests/scripts/targets/SILENT create mode 100644 third_party/make/tests/scripts/targets/clean create mode 100644 third_party/make/tests/scripts/test_template create mode 100644 third_party/make/tests/scripts/variables/CURDIR create mode 100644 third_party/make/tests/scripts/variables/DEFAULT_GOAL create mode 100644 third_party/make/tests/scripts/variables/EXTRA_PREREQS create mode 100644 third_party/make/tests/scripts/variables/GNUMAKEFLAGS create mode 100644 third_party/make/tests/scripts/variables/INCLUDE_DIRS create mode 100644 third_party/make/tests/scripts/variables/LIBPATTERNS create mode 100644 third_party/make/tests/scripts/variables/MAKE create mode 100644 third_party/make/tests/scripts/variables/MAKECMDGOALS create mode 100644 third_party/make/tests/scripts/variables/MAKEFILES create mode 100644 third_party/make/tests/scripts/variables/MAKEFLAGS create mode 100644 third_party/make/tests/scripts/variables/MAKELEVEL create mode 100644 third_party/make/tests/scripts/variables/MAKE_RESTARTS create mode 100644 third_party/make/tests/scripts/variables/MFILE_LIST create mode 100644 third_party/make/tests/scripts/variables/SHELL create mode 100644 third_party/make/tests/scripts/variables/automatic create mode 100644 third_party/make/tests/scripts/variables/define create mode 100644 third_party/make/tests/scripts/variables/flavors create mode 100644 third_party/make/tests/scripts/variables/negative create mode 100644 third_party/make/tests/scripts/variables/private create mode 100644 third_party/make/tests/scripts/variables/special create mode 100644 third_party/make/tests/scripts/variables/undefine create mode 100644 third_party/make/tests/scripts/vms/library create mode 100644 third_party/make/tests/test_driver.pl create mode 100755 third_party/make/tests/thelp.pl create mode 100644 third_party/make/vms_export_symbol_test.com diff --git a/third_party/make/ABOUT-NLS b/third_party/make/ABOUT-NLS new file mode 100644 index 00000000000..b1de1b6832d --- /dev/null +++ b/third_party/make/ABOUT-NLS @@ -0,0 +1,1282 @@ +1 Notes on the Free Translation Project +*************************************** + +Free software is going international! The Free Translation Project is +a way to get maintainers of free software, translators, and users all +together, so that free software will gradually become able to speak many +languages. A few packages already provide translations for their +messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work on translations can contact the appropriate team. + +1.1 INSTALL Matters +=================== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU `gettext'. Other packages have their own ways to +internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. Installers may use special +options at configuration time for changing the default behaviour. The +command: + + ./configure --disable-nls + +will _totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl' library +and will decide to use it. If not, you may have to to use the +`--with-libintl-prefix' option to tell `configure' where to look for it. + + Internationalized packages usually have many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +1.2 Using This Package +====================== + +As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. If you happen to have the `LC_ALL' or some other +`LC_xxx' environment variables set, you should unset them before +setting `LANG', otherwise the setting of `LANG' will not have the +desired effect. Here `LL' is an ISO 639 two-letter language code, and +`CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your language by running the +command `locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from `no' to `nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under `nb' and some older ones under `no', it's recommended +for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and +older translations are used. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +1.3 Translating Teams +===================== + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://translationproject.org/', in the "Teams" area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `coordinator@translationproject.org' to +reach the coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skills are praised more than +programming skills, here. + +1.4 Available Packages +====================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of June +2010. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am an ar as ast az be be@latin bg bn_IN bs ca + +--------------------------------------------------+ + a2ps | [] [] | + aegis | | + ant-phone | | + anubis | | + aspell | [] [] | + bash | | + bfd | | + bibshelf | [] | + binutils | | + bison | | + bison-runtime | [] | + bluez-pin | [] [] | + bombono-dvd | | + buzztard | | + cflow | | + clisp | | + coreutils | [] [] | + cpio | | + cppi | | + cpplib | [] | + cryptsetup | | + dfarc | | + dialog | [] [] | + dico | | + diffutils | [] | + dink | | + doodle | | + e2fsprogs | [] | + enscript | [] | + exif | | + fetchmail | [] | + findutils | [] | + flex | [] | + freedink | | + gas | | + gawk | [] [] | + gcal | [] | + gcc | | + gettext-examples | [] [] [] [] | + gettext-runtime | [] [] | + gettext-tools | [] [] | + gip | [] | + gjay | | + gliv | [] | + glunarclock | [] [] | + gnubiff | | + gnucash | [] | + gnuedu | | + gnulib | | + gnunet | | + gnunet-gtk | | + gnutls | | + gold | | + gpe-aerial | | + gpe-beam | | + gpe-bluetooth | | + gpe-calendar | | + gpe-clock | [] | + gpe-conf | | + gpe-contacts | | + gpe-edit | | + gpe-filemanager | | + gpe-go | | + gpe-login | | + gpe-ownerinfo | [] | + gpe-package | | + gpe-sketchbook | | + gpe-su | [] | + gpe-taskmanager | [] | + gpe-timesheet | [] | + gpe-today | [] | + gpe-todo | | + gphoto2 | | + gprof | [] | + gpsdrive | | + gramadoir | | + grep | | + grub | [] [] | + gsasl | | + gss | | + gst-plugins-bad | [] | + gst-plugins-base | [] | + gst-plugins-good | [] | + gst-plugins-ugly | [] | + gstreamer | [] [] [] | + gtick | | + gtkam | [] | + gtkorphan | [] | + gtkspell | [] [] [] | + gutenprint | | + hello | [] | + help2man | | + hylafax | | + idutils | | + indent | [] [] | + iso_15924 | | + iso_3166 | [] [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | | + iso_639 | [] [] [] [] | + iso_639_3 | | + jwhois | | + kbd | | + keytouch | [] | + keytouch-editor | | + keytouch-keyboa... | [] | + klavaro | [] | + latrine | | + ld | [] | + leafpad | [] [] | + libc | [] [] | + libexif | () | + libextractor | | + libgnutls | | + libgpewidget | | + libgpg-error | | + libgphoto2 | | + libgphoto2_port | | + libgsasl | | + libiconv | [] | + libidn | | + lifelines | | + liferea | [] [] | + lilypond | | + linkdr | [] | + lordsawar | | + lprng | | + lynx | [] | + m4 | | + mailfromd | | + mailutils | | + make | | + man-db | | + man-db-manpages | | + minicom | | + mkisofs | | + myserver | | + nano | [] [] | + opcodes | | + parted | | + pies | | + popt | | + psmisc | | + pspp | [] | + pwdutils | | + radius | [] | + recode | [] [] | + rosegarden | | + rpm | | + rush | | + sarg | | + screem | | + scrollkeeper | [] [] [] | + sed | [] [] | + sharutils | [] [] | + shishi | | + skencil | | + solfege | | + solfege-manual | | + soundtracker | | + sp | | + sysstat | | + tar | [] | + texinfo | | + tin | | + unicode-han-tra... | | + unicode-transla... | | + util-linux-ng | [] | + vice | | + vmm | | + vorbis-tools | | + wastesedge | | + wdiff | | + wget | [] [] | + wyslij-po | | + xchat | [] [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] | + +--------------------------------------------------+ + af am an ar as ast az be be@latin bg bn_IN bs ca + 6 0 1 2 3 19 1 10 3 28 3 1 38 + + crh cs da de el en en_GB en_ZA eo es et eu fa + +-------------------------------------------------+ + a2ps | [] [] [] [] [] [] [] | + aegis | [] [] [] | + ant-phone | [] () | + anubis | [] [] | + aspell | [] [] [] [] [] | + bash | [] [] [] | + bfd | [] | + bibshelf | [] [] [] | + binutils | [] | + bison | [] [] | + bison-runtime | [] [] [] [] | + bluez-pin | [] [] [] [] [] [] | + bombono-dvd | [] | + buzztard | [] [] [] | + cflow | [] [] | + clisp | [] [] [] [] | + coreutils | [] [] [] [] | + cpio | | + cppi | | + cpplib | [] [] [] | + cryptsetup | [] | + dfarc | [] [] [] | + dialog | [] [] [] [] [] | + dico | | + diffutils | [] [] [] [] [] [] | + dink | [] [] [] | + doodle | [] | + e2fsprogs | [] [] [] | + enscript | [] [] [] | + exif | () [] [] | + fetchmail | [] [] () [] [] [] | + findutils | [] [] [] | + flex | [] [] | + freedink | [] [] [] | + gas | [] | + gawk | [] [] [] | + gcal | [] | + gcc | [] [] | + gettext-examples | [] [] [] [] | + gettext-runtime | [] [] [] [] | + gettext-tools | [] [] [] | + gip | [] [] [] [] | + gjay | [] | + gliv | [] [] [] | + glunarclock | [] [] | + gnubiff | () | + gnucash | [] () () () () | + gnuedu | [] [] | + gnulib | [] [] | + gnunet | | + gnunet-gtk | [] | + gnutls | [] [] | + gold | [] | + gpe-aerial | [] [] [] [] | + gpe-beam | [] [] [] [] | + gpe-bluetooth | [] [] | + gpe-calendar | [] | + gpe-clock | [] [] [] [] | + gpe-conf | [] [] [] | + gpe-contacts | [] [] [] | + gpe-edit | [] [] | + gpe-filemanager | [] [] [] | + gpe-go | [] [] [] [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] [] [] | + gpe-package | [] [] [] | + gpe-sketchbook | [] [] [] [] | + gpe-su | [] [] [] [] | + gpe-taskmanager | [] [] [] [] | + gpe-timesheet | [] [] [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] [] [] | + gphoto2 | [] [] () [] [] [] | + gprof | [] [] [] | + gpsdrive | [] [] [] | + gramadoir | [] [] [] | + grep | [] | + grub | [] [] | + gsasl | [] | + gss | | + gst-plugins-bad | [] [] [] [] [] | + gst-plugins-base | [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] | + gtick | [] () [] | + gtkam | [] [] () [] [] | + gtkorphan | [] [] [] [] | + gtkspell | [] [] [] [] [] [] [] | + gutenprint | [] [] [] | + hello | [] [] [] [] | + help2man | [] | + hylafax | [] [] | + idutils | [] [] | + indent | [] [] [] [] [] [] [] | + iso_15924 | [] () [] [] | + iso_3166 | [] [] [] [] () [] [] [] () | + iso_3166_2 | () | + iso_4217 | [] [] [] () [] [] | + iso_639 | [] [] [] [] () [] [] | + iso_639_3 | [] | + jwhois | [] | + kbd | [] [] [] [] [] | + keytouch | [] [] | + keytouch-editor | [] [] | + keytouch-keyboa... | [] | + klavaro | [] [] [] [] | + latrine | [] () | + ld | [] [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] | + libexif | [] [] () | + libextractor | | + libgnutls | [] | + libgpewidget | [] [] | + libgpg-error | [] [] | + libgphoto2 | [] () | + libgphoto2_port | [] () [] | + libgsasl | | + libiconv | [] [] [] [] [] | + libidn | [] [] [] | + lifelines | [] () | + liferea | [] [] [] [] [] | + lilypond | [] [] [] | + linkdr | [] [] [] | + lordsawar | [] | + lprng | | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailfromd | | + mailutils | [] | + make | [] [] [] | + man-db | | + man-db-manpages | | + minicom | [] [] [] [] | + mkisofs | | + myserver | | + nano | [] [] [] | + opcodes | [] [] | + parted | [] [] | + pies | | + popt | [] [] [] [] [] | + psmisc | [] [] [] | + pspp | [] | + pwdutils | [] | + radius | [] | + recode | [] [] [] [] [] [] | + rosegarden | () () () | + rpm | [] [] [] | + rush | | + sarg | | + screem | | + scrollkeeper | [] [] [] [] [] | + sed | [] [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | | + skencil | [] () [] | + solfege | [] [] [] | + solfege-manual | [] [] | + soundtracker | [] [] [] | + sp | [] | + sysstat | [] [] [] | + tar | [] [] [] [] | + texinfo | [] [] [] | + tin | [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux-ng | [] [] [] [] | + vice | () () | + vmm | [] | + vorbis-tools | [] [] | + wastesedge | [] | + wdiff | [] [] | + wget | [] [] [] | + wyslij-po | | + xchat | [] [] [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] [] [] | + +-------------------------------------------------+ + crh cs da de el en en_GB en_ZA eo es et eu fa + 5 64 105 117 18 1 8 0 28 89 18 19 0 + + fi fr ga gl gu he hi hr hu hy id is it ja ka kn + +----------------------------------------------------+ + a2ps | [] [] [] [] | + aegis | [] [] | + ant-phone | [] [] | + anubis | [] [] [] [] | + aspell | [] [] [] [] | + bash | [] [] [] [] | + bfd | [] [] [] | + bibshelf | [] [] [] [] [] | + binutils | [] [] [] | + bison | [] [] [] [] | + bison-runtime | [] [] [] [] [] [] | + bluez-pin | [] [] [] [] [] [] [] [] | + bombono-dvd | [] | + buzztard | [] | + cflow | [] [] [] | + clisp | [] | + coreutils | [] [] [] [] [] | + cpio | [] [] [] [] | + cppi | [] [] | + cpplib | [] [] [] | + cryptsetup | [] [] [] | + dfarc | [] [] [] | + dialog | [] [] [] [] [] [] [] | + dico | | + diffutils | [] [] [] [] [] [] [] [] [] | + dink | [] | + doodle | [] [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] | + exif | [] [] [] [] [] [] | + fetchmail | [] [] [] [] | + findutils | [] [] [] [] [] [] | + flex | [] [] [] | + freedink | [] [] [] | + gas | [] [] | + gawk | [] [] [] [] () [] | + gcal | [] | + gcc | [] | + gettext-examples | [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] | + gettext-tools | [] [] [] [] | + gip | [] [] [] [] [] [] | + gjay | [] | + gliv | [] () | + glunarclock | [] [] [] [] | + gnubiff | () [] () | + gnucash | () () () () () [] | + gnuedu | [] [] | + gnulib | [] [] [] [] [] [] | + gnunet | | + gnunet-gtk | [] | + gnutls | [] [] | + gold | [] [] | + gpe-aerial | [] [] [] | + gpe-beam | [] [] [] [] | + gpe-bluetooth | [] [] [] [] | + gpe-calendar | [] [] | + gpe-clock | [] [] [] [] [] | + gpe-conf | [] [] [] [] | + gpe-contacts | [] [] [] [] | + gpe-edit | [] [] [] | + gpe-filemanager | [] [] [] [] | + gpe-go | [] [] [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] [] [] [] | + gpe-package | [] [] [] | + gpe-sketchbook | [] [] [] [] | + gpe-su | [] [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] | + gpe-timesheet | [] [] [] [] [] | + gpe-today | [] [] [] [] [] [] [] | + gpe-todo | [] [] [] | + gphoto2 | [] [] [] [] [] [] | + gprof | [] [] [] [] | + gpsdrive | [] [] [] | + gramadoir | [] [] [] | + grep | [] [] | + grub | [] [] [] [] | + gsasl | [] [] [] [] [] | + gss | [] [] [] [] [] | + gst-plugins-bad | [] [] [] [] [] [] | + gst-plugins-base | [] [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] | + gtick | [] [] [] [] [] | + gtkam | [] [] [] [] [] | + gtkorphan | [] [] [] | + gtkspell | [] [] [] [] [] [] [] [] [] | + gutenprint | [] [] [] [] | + hello | [] [] [] | + help2man | [] [] | + hylafax | [] | + idutils | [] [] [] [] [] [] | + indent | [] [] [] [] [] [] [] [] | + iso_15924 | [] () [] [] | + iso_3166 | [] () [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | () [] [] [] | + iso_4217 | [] () [] [] [] [] | + iso_639 | [] () [] [] [] [] [] [] [] | + iso_639_3 | () [] [] | + jwhois | [] [] [] [] [] | + kbd | [] [] | + keytouch | [] [] [] [] [] [] | + keytouch-editor | [] [] [] [] [] | + keytouch-keyboa... | [] [] [] [] [] | + klavaro | [] [] | + latrine | [] [] [] | + ld | [] [] [] [] | + leafpad | [] [] [] [] [] [] [] () | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | | + libgnutls | [] [] | + libgpewidget | [] [] [] [] | + libgpg-error | [] [] | + libgphoto2 | [] [] [] | + libgphoto2_port | [] [] [] | + libgsasl | [] [] [] [] [] | + libiconv | [] [] [] [] [] [] | + libidn | [] [] [] [] | + lifelines | () | + liferea | [] [] [] [] | + lilypond | [] [] | + linkdr | [] [] [] [] [] | + lordsawar | | + lprng | [] | + lynx | [] [] [] [] [] | + m4 | [] [] [] [] [] [] | + mailfromd | | + mailutils | [] [] | + make | [] [] [] [] [] [] [] [] [] | + man-db | [] [] | + man-db-manpages | [] | + minicom | [] [] [] [] [] | + mkisofs | [] [] [] [] | + myserver | | + nano | [] [] [] [] [] [] | + opcodes | [] [] [] [] | + parted | [] [] [] [] | + pies | | + popt | [] [] [] [] [] [] [] [] [] | + psmisc | [] [] [] | + pspp | | + pwdutils | [] [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] [] | + rosegarden | () () () () () | + rpm | [] [] | + rush | | + sarg | [] | + screem | [] [] | + scrollkeeper | [] [] [] [] | + sed | [] [] [] [] [] [] [] [] | + sharutils | [] [] [] [] [] [] [] | + shishi | [] | + skencil | [] | + solfege | [] [] [] [] | + solfege-manual | [] [] | + soundtracker | [] [] | + sp | [] () | + sysstat | [] [] [] [] [] | + tar | [] [] [] [] [] [] [] | + texinfo | [] [] [] [] | + tin | [] | + unicode-han-tra... | | + unicode-transla... | [] [] | + util-linux-ng | [] [] [] [] [] [] | + vice | () () () | + vmm | [] | + vorbis-tools | [] | + wastesedge | () () | + wdiff | [] | + wget | [] [] [] [] [] [] [] [] | + wyslij-po | [] [] [] | + xchat | [] [] [] [] [] [] [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] [] | + +----------------------------------------------------+ + fi fr ga gl gu he hi hr hu hy id is it ja ka kn + 105 121 53 20 4 8 3 5 53 2 120 5 84 67 0 4 + + ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne + +-----------------------------------------------+ + a2ps | [] | + aegis | | + ant-phone | | + anubis | [] [] | + aspell | [] | + bash | | + bfd | | + bibshelf | [] [] | + binutils | | + bison | [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] | + bombono-dvd | | + buzztard | | + cflow | | + clisp | | + coreutils | [] | + cpio | | + cppi | | + cpplib | | + cryptsetup | | + dfarc | [] | + dialog | [] [] [] [] [] | + dico | | + diffutils | [] [] | + dink | | + doodle | | + e2fsprogs | | + enscript | | + exif | [] | + fetchmail | | + findutils | | + flex | | + freedink | [] | + gas | | + gawk | | + gcal | | + gcc | | + gettext-examples | [] [] [] [] | + gettext-runtime | [] | + gettext-tools | [] | + gip | [] [] | + gjay | | + gliv | | + glunarclock | [] | + gnubiff | | + gnucash | () () () () | + gnuedu | | + gnulib | | + gnunet | | + gnunet-gtk | | + gnutls | [] | + gold | | + gpe-aerial | [] | + gpe-beam | [] | + gpe-bluetooth | [] [] | + gpe-calendar | [] | + gpe-clock | [] [] [] [] [] | + gpe-conf | [] [] | + gpe-contacts | [] [] | + gpe-edit | [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] | + gpe-login | [] | + gpe-ownerinfo | [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] [] | + gpe-timesheet | [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] [] | + gphoto2 | | + gprof | [] | + gpsdrive | | + gramadoir | | + grep | | + grub | | + gsasl | | + gss | | + gst-plugins-bad | [] [] [] [] | + gst-plugins-base | [] [] | + gst-plugins-good | [] [] | + gst-plugins-ugly | [] [] [] [] [] | + gstreamer | | + gtick | | + gtkam | [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] [] [] [] | + gutenprint | | + hello | [] [] [] | + help2man | | + hylafax | | + idutils | | + indent | | + iso_15924 | [] [] | + iso_3166 | [] [] () [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] [] | + iso_639 | [] [] | + iso_639_3 | [] | + jwhois | [] | + kbd | | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + klavaro | [] | + latrine | [] | + ld | | + leafpad | [] [] [] | + libc | [] | + libexif | | + libextractor | | + libgnutls | [] | + libgpewidget | [] [] | + libgpg-error | | + libgphoto2 | | + libgphoto2_port | | + libgsasl | | + libiconv | | + libidn | | + lifelines | | + liferea | | + lilypond | | + linkdr | | + lordsawar | | + lprng | | + lynx | | + m4 | | + mailfromd | | + mailutils | | + make | [] | + man-db | | + man-db-manpages | | + minicom | [] | + mkisofs | | + myserver | | + nano | [] [] | + opcodes | | + parted | | + pies | | + popt | [] [] [] | + psmisc | | + pspp | | + pwdutils | | + radius | | + recode | | + rosegarden | | + rpm | | + rush | | + sarg | | + screem | | + scrollkeeper | [] [] | + sed | | + sharutils | | + shishi | | + skencil | | + solfege | [] | + solfege-manual | | + soundtracker | | + sp | | + sysstat | [] | + tar | [] | + texinfo | [] | + tin | | + unicode-han-tra... | | + unicode-transla... | | + util-linux-ng | | + vice | | + vmm | | + vorbis-tools | | + wastesedge | | + wdiff | | + wget | [] | + wyslij-po | | + xchat | [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + +-----------------------------------------------+ + ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne + 20 5 10 1 13 48 4 2 2 4 24 10 20 3 1 + + nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr + +---------------------------------------------------+ + a2ps | [] [] [] [] [] [] [] [] | + aegis | [] [] [] | + ant-phone | [] [] | + anubis | [] [] [] | + aspell | [] [] [] [] [] | + bash | [] [] | + bfd | [] | + bibshelf | [] [] | + binutils | [] [] | + bison | [] [] [] | + bison-runtime | [] [] [] [] [] [] [] | + bluez-pin | [] [] [] [] [] [] [] [] | + bombono-dvd | [] () | + buzztard | [] [] | + cflow | [] | + clisp | [] [] | + coreutils | [] [] [] [] [] [] | + cpio | [] [] [] | + cppi | [] | + cpplib | [] | + cryptsetup | [] | + dfarc | [] | + dialog | [] [] [] [] | + dico | [] | + diffutils | [] [] [] [] [] [] | + dink | () | + doodle | [] [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] [] | + exif | [] [] [] () [] | + fetchmail | [] [] [] [] | + findutils | [] [] [] [] [] | + flex | [] [] [] [] [] | + freedink | [] [] | + gas | | + gawk | [] [] [] [] | + gcal | | + gcc | [] | + gettext-examples | [] [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] [] | + gip | [] [] [] [] [] | + gjay | | + gliv | [] [] [] [] [] [] | + glunarclock | [] [] [] [] [] | + gnubiff | [] () | + gnucash | [] () () () | + gnuedu | [] | + gnulib | [] [] [] [] | + gnunet | | + gnunet-gtk | | + gnutls | [] [] | + gold | | + gpe-aerial | [] [] [] [] [] [] [] | + gpe-beam | [] [] [] [] [] [] [] | + gpe-bluetooth | [] [] | + gpe-calendar | [] [] [] [] | + gpe-clock | [] [] [] [] [] [] [] [] | + gpe-conf | [] [] [] [] [] [] [] | + gpe-contacts | [] [] [] [] [] | + gpe-edit | [] [] [] | + gpe-filemanager | [] [] [] | + gpe-go | [] [] [] [] [] [] [] [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] [] [] [] [] [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] [] [] [] [] [] | + gpe-su | [] [] [] [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] [] [] [] | + gpe-timesheet | [] [] [] [] [] [] [] [] | + gpe-today | [] [] [] [] [] [] [] [] | + gpe-todo | [] [] [] [] [] | + gphoto2 | [] [] [] [] [] [] [] [] | + gprof | [] [] [] | + gpsdrive | [] [] | + gramadoir | [] [] | + grep | [] [] [] [] | + grub | [] [] [] | + gsasl | [] [] [] [] | + gss | [] [] [] | + gst-plugins-bad | [] [] [] [] [] [] | + gst-plugins-base | [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] | + gtick | [] [] [] | + gtkam | [] [] [] [] [] [] | + gtkorphan | [] | + gtkspell | [] [] [] [] [] [] [] [] [] [] | + gutenprint | [] [] | + hello | [] [] [] [] | + help2man | [] [] | + hylafax | [] | + idutils | [] [] [] [] [] | + indent | [] [] [] [] [] [] [] | + iso_15924 | [] [] [] [] | + iso_3166 | [] [] [] [] [] () [] [] [] [] [] [] [] [] | + iso_3166_2 | [] [] [] | + iso_4217 | [] [] [] [] [] [] [] [] | + iso_639 | [] [] [] [] [] [] [] [] [] | + iso_639_3 | [] [] | + jwhois | [] [] [] [] | + kbd | [] [] [] | + keytouch | [] [] [] | + keytouch-editor | [] [] [] | + keytouch-keyboa... | [] [] [] | + klavaro | [] [] | + latrine | [] [] | + ld | | + leafpad | [] [] [] [] [] [] [] [] [] | + libc | [] [] [] [] | + libexif | [] [] () [] | + libextractor | | + libgnutls | [] [] | + libgpewidget | [] [] [] | + libgpg-error | [] [] | + libgphoto2 | [] [] | + libgphoto2_port | [] [] [] [] [] | + libgsasl | [] [] [] [] [] | + libiconv | [] [] [] [] [] | + libidn | [] [] | + lifelines | [] [] | + liferea | [] [] [] [] [] () () [] | + lilypond | [] | + linkdr | [] [] [] | + lordsawar | | + lprng | [] | + lynx | [] [] [] | + m4 | [] [] [] [] [] | + mailfromd | [] | + mailutils | [] | + make | [] [] [] [] | + man-db | [] [] [] | + man-db-manpages | [] [] [] | + minicom | [] [] [] [] | + mkisofs | [] [] [] | + myserver | | + nano | [] [] [] [] | + opcodes | [] [] | + parted | [] [] [] [] | + pies | [] | + popt | [] [] [] [] | + psmisc | [] [] [] | + pspp | [] [] | + pwdutils | [] | + radius | [] [] [] | + recode | [] [] [] [] [] [] [] [] | + rosegarden | () () | + rpm | [] [] [] | + rush | [] [] | + sarg | | + screem | | + scrollkeeper | [] [] [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | [] | + skencil | [] [] | + solfege | [] [] [] [] | + solfege-manual | [] [] [] | + soundtracker | [] | + sp | | + sysstat | [] [] [] [] | + tar | [] [] [] [] | + texinfo | [] [] [] [] | + tin | [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux-ng | [] [] [] [] [] | + vice | [] | + vmm | [] | + vorbis-tools | [] [] | + wastesedge | [] | + wdiff | [] [] | + wget | [] [] [] [] [] [] [] | + wyslij-po | [] [] [] | + xchat | [] [] [] [] [] [] [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + +---------------------------------------------------+ + nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr + 135 10 4 7 105 1 29 62 47 91 3 54 46 9 37 + + sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW + +---------------------------------------------------+ + a2ps | [] [] [] [] [] | 27 + aegis | [] | 9 + ant-phone | [] [] [] [] | 9 + anubis | [] [] [] [] | 15 + aspell | [] [] [] | 20 + bash | [] [] [] | 12 + bfd | [] | 6 + bibshelf | [] [] [] | 16 + binutils | [] [] | 8 + bison | [] [] | 12 + bison-runtime | [] [] [] [] [] [] | 29 + bluez-pin | [] [] [] [] [] [] [] [] | 37 + bombono-dvd | [] | 4 + buzztard | [] | 7 + cflow | [] [] [] | 9 + clisp | | 10 + coreutils | [] [] [] [] | 22 + cpio | [] [] [] [] [] [] | 13 + cppi | [] [] | 5 + cpplib | [] [] [] [] [] [] | 14 + cryptsetup | [] [] | 7 + dfarc | [] | 9 + dialog | [] [] [] [] [] [] [] | 30 + dico | [] | 2 + diffutils | [] [] [] [] [] [] | 30 + dink | | 4 + doodle | [] [] | 7 + e2fsprogs | [] [] [] | 11 + enscript | [] [] [] [] | 17 + exif | [] [] [] | 16 + fetchmail | [] [] [] | 17 + findutils | [] [] [] [] [] | 20 + flex | [] [] [] [] | 15 + freedink | [] | 10 + gas | [] | 4 + gawk | [] [] [] [] | 18 + gcal | [] [] | 5 + gcc | [] [] [] | 7 + gettext-examples | [] [] [] [] [] [] [] | 34 + gettext-runtime | [] [] [] [] [] [] [] | 29 + gettext-tools | [] [] [] [] [] [] | 22 + gip | [] [] [] [] | 22 + gjay | [] | 3 + gliv | [] [] [] | 14 + glunarclock | [] [] [] [] [] | 19 + gnubiff | [] [] | 4 + gnucash | () [] () [] () | 10 + gnuedu | [] [] | 7 + gnulib | [] [] [] [] | 16 + gnunet | [] | 1 + gnunet-gtk | [] [] [] | 5 + gnutls | [] [] [] | 10 + gold | [] | 4 + gpe-aerial | [] [] [] | 18 + gpe-beam | [] [] [] | 19 + gpe-bluetooth | [] [] [] | 13 + gpe-calendar | [] [] [] [] | 12 + gpe-clock | [] [] [] [] [] | 28 + gpe-conf | [] [] [] [] | 20 + gpe-contacts | [] [] [] | 17 + gpe-edit | [] [] [] | 12 + gpe-filemanager | [] [] [] [] | 16 + gpe-go | [] [] [] [] [] | 25 + gpe-login | [] [] [] | 11 + gpe-ownerinfo | [] [] [] [] [] | 25 + gpe-package | [] [] [] | 13 + gpe-sketchbook | [] [] [] | 20 + gpe-su | [] [] [] [] [] | 30 + gpe-taskmanager | [] [] [] [] [] | 29 + gpe-timesheet | [] [] [] [] [] | 25 + gpe-today | [] [] [] [] [] [] | 30 + gpe-todo | [] [] [] [] | 17 + gphoto2 | [] [] [] [] [] | 24 + gprof | [] [] [] | 15 + gpsdrive | [] [] [] | 11 + gramadoir | [] [] [] | 11 + grep | [] [] [] | 10 + grub | [] [] [] | 14 + gsasl | [] [] [] [] | 14 + gss | [] [] [] | 11 + gst-plugins-bad | [] [] [] [] | 26 + gst-plugins-base | [] [] [] [] [] | 24 + gst-plugins-good | [] [] [] [] | 24 + gst-plugins-ugly | [] [] [] [] [] | 29 + gstreamer | [] [] [] [] | 22 + gtick | [] [] [] | 13 + gtkam | [] [] [] | 20 + gtkorphan | [] [] [] | 14 + gtkspell | [] [] [] [] [] [] [] [] [] | 45 + gutenprint | [] | 10 + hello | [] [] [] [] [] [] | 21 + help2man | [] [] | 7 + hylafax | [] | 5 + idutils | [] [] [] [] | 17 + indent | [] [] [] [] [] [] | 30 + iso_15924 | () [] () [] [] | 16 + iso_3166 | [] [] () [] [] () [] [] [] () | 53 + iso_3166_2 | () [] () [] | 9 + iso_4217 | [] () [] [] () [] [] | 26 + iso_639 | [] [] [] () [] () [] [] [] [] | 38 + iso_639_3 | [] () | 8 + jwhois | [] [] [] [] [] | 16 + kbd | [] [] [] [] [] | 15 + keytouch | [] [] [] | 16 + keytouch-editor | [] [] [] | 14 + keytouch-keyboa... | [] [] [] | 14 + klavaro | [] | 11 + latrine | [] [] [] | 10 + ld | [] [] [] [] | 11 + leafpad | [] [] [] [] [] [] | 33 + libc | [] [] [] [] [] | 21 + libexif | [] () | 7 + libextractor | [] | 1 + libgnutls | [] [] [] | 9 + libgpewidget | [] [] [] | 14 + libgpg-error | [] [] [] | 9 + libgphoto2 | [] [] | 8 + libgphoto2_port | [] [] [] [] | 14 + libgsasl | [] [] [] | 13 + libiconv | [] [] [] [] | 21 + libidn | () [] [] | 11 + lifelines | [] | 4 + liferea | [] [] [] | 21 + lilypond | [] | 7 + linkdr | [] [] [] [] [] | 17 + lordsawar | | 1 + lprng | [] | 3 + lynx | [] [] [] [] | 17 + m4 | [] [] [] [] | 19 + mailfromd | [] [] | 3 + mailutils | [] | 5 + make | [] [] [] [] | 21 + man-db | [] [] [] | 8 + man-db-manpages | | 4 + minicom | [] [] | 16 + mkisofs | [] [] | 9 + myserver | | 0 + nano | [] [] [] [] | 21 + opcodes | [] [] [] | 11 + parted | [] [] [] [] [] | 15 + pies | [] [] | 3 + popt | [] [] [] [] [] [] | 27 + psmisc | [] [] | 11 + pspp | | 4 + pwdutils | [] [] | 6 + radius | [] [] | 9 + recode | [] [] [] [] | 28 + rosegarden | () | 0 + rpm | [] [] [] | 11 + rush | [] [] | 4 + sarg | | 1 + screem | [] | 3 + scrollkeeper | [] [] [] [] [] | 27 + sed | [] [] [] [] [] | 30 + sharutils | [] [] [] [] [] | 22 + shishi | [] | 3 + skencil | [] [] | 7 + solfege | [] [] [] [] | 16 + solfege-manual | [] | 8 + soundtracker | [] [] [] | 9 + sp | [] | 3 + sysstat | [] [] | 15 + tar | [] [] [] [] [] [] | 23 + texinfo | [] [] [] [] [] | 17 + tin | | 4 + unicode-han-tra... | | 0 + unicode-transla... | | 2 + util-linux-ng | [] [] [] [] | 20 + vice | () () | 1 + vmm | [] | 4 + vorbis-tools | [] | 6 + wastesedge | | 2 + wdiff | [] [] | 7 + wget | [] [] [] [] [] | 26 + wyslij-po | [] [] | 8 + xchat | [] [] [] [] [] [] | 36 + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | 63 + xkeyboard-config | [] [] [] | 22 + +---------------------------------------------------+ + 85 teams sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW + 178 domains 119 1 3 3 0 10 65 51 155 17 98 7 41 2618 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If June 2010 seems to be old, you may fetch a more recent copy of +this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date +matrix with full percentage details can be found at +`http://translationproject.org/extra/matrix.html'. + +1.5 Using `gettext' in new packages +=================================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`coordinator@translationproject.org' to make the `.pot' files available +to the translation teams. + diff --git a/third_party/make/AUTHORS b/third_party/make/AUTHORS new file mode 100644 index 00000000000..dc9127e468e --- /dev/null +++ b/third_party/make/AUTHORS @@ -0,0 +1,90 @@ +----------------------------------- + +GNU make development up to version 3.75 by: + Roland McGrath + + +Development starting with GNU make 3.76 by: + Paul D. Smith + + Additional development starting with GNU make 3.81 by: + Boris Kolpackov + + +GNU Make User's Manual + Written by: + Richard M. Stallman + + Edited by: + Roland McGrath + Bob Chassell + Melissa Weisshaus + Paul D. Smith + +----------------------------------- +GNU make porting efforts: + + Port to VMS by: + Klaus Kaempf + Hartmut Becker + Archive support/Bug fixes by: + John W. Eaton + Martin Zinser + + Port to Amiga by: + Aaron Digulla + + Port to MS-DOS (DJGPP), OS/2, and MS-Windows (native/MinGW) by: + DJ Delorie + Rob Tulloh + Eli Zaretskii + Jonathan Grant + Andreas Beuning + Earnie Boyd + Troy Runkel + +----------------------------------- +Other contributors: + + Janet Carson + Howard Chu + Ludovic Courtès + Paul Eggert + Ramon Garcia Fernandez + Klaus Heinz + Michael Joosten + Jim Kelton + David Lubbren + Tim Magill + Markus Mauhart + Greg McGary + Thien-Thi Nguyen + Thomas Riedl + Han-Wen Nienhuys + Andreas Schwab + Carl Staelin (Princeton University) + Ian Stewartson (Data Logic Limited) + David A. Wheeler + David Boyce + Frank Heckenbach + Kaz Kylheku + Christof Warlich + +With suggestions/comments/bug reports from a cast of ... well ... +hundreds, anyway :) + +------------------------------------------------------------------------------- +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 +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 . diff --git a/third_party/make/Basic.mk b/third_party/make/Basic.mk new file mode 100644 index 00000000000..3de3d3f4363 --- /dev/null +++ b/third_party/make/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 . + +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,,) +COMPILE.cmd = $(CC) $(extra_CFLAGS) $(CFLAGS) $(extra_CPPFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $(OUTPUT_OPTION) $(C_SOURCE) $1 + +# $(call LINK.cmd,) +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 $() +MKDIR.cmd = mkdir -p $1 + +# $(call RM.cmd,) +RM.cmd = rm -f $1 + +# $(call CP.cmd,,) +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 diff --git a/third_party/make/COPYING b/third_party/make/COPYING new file mode 100644 index 00000000000..94a9ed024d3 --- /dev/null +++ b/third_party/make/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + + + Copyright (C) + + 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 . + +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: + + Copyright (C) + 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 +. + + 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 +. diff --git a/third_party/make/ChangeLog b/third_party/make/ChangeLog new file mode 100644 index 00000000000..dce824b09cd --- /dev/null +++ b/third_party/make/ChangeLog @@ -0,0 +1,2684 @@ +2020-01-19 Paul Smith + + 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 + + [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 + + * tests/test_driver.pl: Enhance error messages + +2020-01-04 Paul Smith + + * 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 + + * 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 + + Support the .EXTRA_PREREQS special variable + Initial implementation by Christof Warlich + + * 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 + + * 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 + + * NEWS: Remove info about disabled /proc/loadavg usage. + +2019-12-27 Paul Smith + + [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 + + Original implementation of the regression tests provided by + Dmitry Goncharov + + * 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 + + [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 + + * src/misc.c (spin): On WINDOWS32 use Sleep() instead of sleep() + + * bootstrap.bat: Fix typo in batch file name + +2019-12-18 Paul Smith + + * src/config.h.W32.template: [SV 57152] MinGW32 doesn't support d_type + +2019-12-18 Jouke Witteveen + + [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 + + * 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 + + * 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 + + * 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 + + 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 + + Release GNU make 4.2.92 + * NEWS: Update the release and date + * configure.ac: Update the release number + +2019-10-06 Paul Smith + + * doc/make.text (Reading Makefiles): Rewrite to be more clear. + +2019-10-05 Paul Smith + + * 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 . + + * tests/run_make_tests.pl (valid_option): Add missing File::Spec + +2019-09-23 Paul Smith + + * src/function.c (func_realpath) [AIX]: Remove trailing slashes. + +2019-09-22 Paul Smith + + * 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 . + +2019-09-22 Florian Weimer (tiny change) + + * configure.ac (HAVE_GETTIMEOFDAY): Avoid undeclared exit function. + +2019-09-22 Paul Smith + + * 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 + + * 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 + + [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 + + * 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 + + * 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 + + 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 + + * 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 + + 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 + + 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 + + * gl/modules/make-glob: Move local glob configure.ac to here + * configure.ac: from here. + +2019-09-08 Paul Smith + + [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 + + * 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 + + 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 + + * doc/make.tex (Substitution Refs): Clarify patsubst relationship. + + * src/job.c (start_job_command) [VMS]: Correct VMS comment. + +2019-09-07 Paul Smith + + 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 + + * 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 + + 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 + + * 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 + +2019-09-02 Paul Eggert + + 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 + + * NEWS: Fix incorrect notes. + + * src/read.c (parse_file_seq): [SV 52076] Don't reverse glob() results. + +2019-08-28 Eli Zaretskii + + 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 + + * NEWS: Update for pre-release + +2019-08-26 Paul Smith + + 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 + + * 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 + + * 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 + + * 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 (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 + + * src/read.c (parse_file_seq): Update comments. + +2019-07-13 Mike Haboustak (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 + + 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 + + * doc/make.texi: [SV 51974] Clarify makefile parsing operations. + + * doc/make.texi: [SV 54116] Document whitespace removal trick. + Discovered and explained by Michael Henry + * tests/scripts/variables/flavors: Add a test to preserve the behavior. + +2019-05-19 Paul Smith + + [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 + + * 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 + + 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 + + [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 + + * src/hash.c (jash_string): [SV 54980] Avoid ASAN error + +2019-05-19 Paul Smith + + [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 + + Update copyright statements for 2019 + +2019-05-12 Kaz Kylheku + + [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 + + * 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 + + * 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 + + * 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 . Fix suggested + on the bug-make mailing list by Mike Shal . + * 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 + + * NEWS: Update for the latest changes. + +2018-08-04 Paul Smith + + [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 + + * 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 + + * src/read.c (parse_file_seq): [SV 52076] Sort wildcard results. + +2018-08-04 Paul Smith + + * tests/scripts/features/archives: [SV 54395] Test long archive names. + +2018-08-04 Ben Hutchings + + * 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 + +2018-08-04 Paul Smith + + * lib/glob.c (glob_in_dir): [SV 53465] Allow symlinks to directories. + Fix from Rich Felker 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 + + * job.c (child_execute_job): Prefer posix_spawn() over fork()/exec() + +2018-08-04 Paul Smith + + 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 + + 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 + + * 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 (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 + + * 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 + + 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 + + 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 + + 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 + + * Makefile.ami, glob/Makefile.ami: Remove obsolete files + +2018-07-01 Ola Olsson + + * doc/make.texi: Updated language + +2018-07-01 Paul Smith + + * all: Update Copyright statements for 2018 + + * scripts/copyright-update: Maintainer's script for copyright mgmt + +2018-02-10 Paul Smith + + * build_w32.bat: Support Visual Studio 17. + +2017-11-19 Paul Smith + + * configure.ac: Support GLIBC glob interface version 2 + +2017-11-19 Paul Smith + + 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 + + * 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 . + + * tests/scripts/features/output-sync: Revert bad change in 0c5a9f9b92a + +2017-11-18 Paul Smith + + 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 + + * Makefile.am: Add jhelp.pl to remote test setup. + +2017-11-11 Paolo Bonzini + + 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 + + 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 + + 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 + + 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 + + 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 + + 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 + + * 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 + + * 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 + +2017-10-30 Paul Eggert + + 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 + + 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 + +2017-09-30 Eli Zaretskii + + 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 + + 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 + + [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 + +2017-07-01 Paul Smith + + * 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 + + 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 . + +2017-06-04 Paul Smith + + [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 (tiny change) + + * read.c (read_all_makefiles): [SV 50909] Add MAKEFILES to strcache + +2017-06-04 Paul Smith + + * 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 + + * tests/run_make_tests.pl: [SV 50902] Find Perl modules + +2017-01-11 Eli Zaretskii + + [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 + + * 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 + + * job.c (child_execute_job): [SV 49938] Avoid spurious GCC warning. + + * main.c (main): [SV 49935] Fix uninitialized variable. + +2016-12-26 Paul Smith + + [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 + + * main.c (switches): [SV 48809] Accept obsolete jobserver flag. + +2016-12-26 Paul Smith + + * 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 + + [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 + + * expand.c (variable_append): [SV 49113] Possible null ptr deref + + * w32/*/dirent.*: [SV 49111] Remove unused telldir() + +2016-12-25 Paul Smith + + Add more GCC warnings to the maintainer build. + * arscan.c: [SV 49112] Correct TEST printf() formatting. + Recommended by Jaak Ristioja + * 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 + + 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 + + * NEWS: Mention the extended support for -jN on MS-Windows. + +2016-11-12 Marc Ullman + + 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 + + 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 + + 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 + + * 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 + + GNU Make release 4.2.1. + +2016-06-06 Paul Smith + + * maintMakefile: TP recommends rsync for retrieving PO files. + +2016-05-31 Jeremy Devenport (tiny change) + + * main.c (main): [SV 48009] Reset stack limit for make re-exec. + +2016-05-31 Paul Smith + + [SV 47995] Ensure forced double-colon rules work with -j. + The fix for SV 44742 had a side-effect that some double-colon targets + were skipped. This happens because the "considered" facility assumed + that all targets would be visited on each walk through the dependency + graph: we used a bit for considered and toggled it on each pass; if + we didn't walk the entire graph on every pass the bit would get out + of sync. The new behavior after SV 44742 might return early without + walking the entire graph. To fix this I changed the considered value + to an integer which is monotonically increasing: it is then never + possible to incorrectly determine that a previous pass through the + graph already considered the current target. + + * filedef.h (struct file): make CONSIDERED an unsigned int. + * main.c (main): No longer need to reset CONSIDERED. + * remake.c (update_goal_chain): increment CONSIDERED rather than + inverting it between 0<->1. + (update_file_1): Reset CONSIDERED to 0 so it's re-considered. + (check_dep): Ditto. + * tests/scripts/features/double_colon: Add a regression test. + +2016-05-31 Paul Smith + + * DELETE_ON_ERROR: [SV 48061] Use "exit 1" for portability. + Reported by Joel Fredrikson + + * w32/pathstuff.c: [SV 47996] Use ISBLANK() not isblank(). + +2016-05-28 Eli Zaretskii + + Fix printing time stamps on MS-Windows + * dir.c (print_dir_data_base) [WINDOWS32]: Use %I64u format for + printing unsigned 64-bit data types, as %ull is not universally + supported. + +2016-05-27 Luke Allardyce (tiny change) + + [SV 48037] Fix MinGW build with Posix configury tools + * w32/Makefile.am (libw32_a_CPPFLAGS): Add -I$(srcdir)/glob. + +2016-05-22 Paul Smith + + GNU Make release 4.2. + +2016-05-21 Joe Crayne (tiny change) + + [SV 44742] Fix double-colon rules plus parallel builds. + * remake.c (update_file): Don't update double-colon target status + if we're still building targets. + (ftime_t): Don't propagate timestamps for double-colon targets that + we've not examined yet. + * tests/scripts/features/double_colon: Add parallel build tests. + +2016-05-21 Paul Smith + + * read.c (eval): [SV 47960] Skip record waiting files when ignoring. + * tests/scripts/features/conditionals: Test this scenario. + + Separate the GNU make load ABI from internal types. + Create an internal type "floc" and convert all users to that type. + * gnumake.h (gmk_floc): Remove the offset field from this type. + * loadapi.c (gmk_eval): Convert gmk_floc to internal floc. + +2016-05-21 Paul Eggert + + Fixes for enhanced GCC warnings. + Move function prototypes into header files and out of .c files. + Use void argument lists for functions that accept no args. + Remove unused macros. Make private functions static. Align + types with printf format characters. + +2016-05-21 Paul Smith + + Fix compile issues with Windows and VMS. + * main.c (initialize_stopchar_map): isblank() is not part of C89. + Install bits for space and tab directly. + * makeint.h: Don't define vfork; autoconf handles this for us. + * vmsjobs.c: Rename NEXT_TOKEN to V_NEXT_TOKEN to avoid conflicts. + * dir.c (print_dir_data_base): Visual Studio C doesn't have int64_t. + * w32/subproc/sub_proc.c (process_begin): Missing arg to memset(). + * build_w32.bat: Don't use obsolete Visual Studio flags. + + Allow compiling with an ISO C 1989/1990 compiler. + * posixos.c (jobserver_post_child): Use C89 for loop syntax. + * remake.c (update_goal_chain): Ditto. + * variable.c (parse_variable_definition): Ditto. + +2016-05-17 Eli Zaretskii + + [SV 47942] Avoid random crashes in subordinate programs on MS-Windows + * w32/subproc/sub_proc.c (process_begin): Zero out startInfo + before using it. Fixes crashes in Intel Fortran compiler invoked + by Make. + +2016-04-24 Eli Zaretskii + + Fix the MS-Windows MinGW build + * build_w32.bat (GccCompile): Use -std=gnu99, as some code uses + C99 features ('for' loop initial declarations). + + * dir.c (print_dir_data_base) [WINDOWS32]: Cast 'mtime' to + 'int64_t', and use %I64d to print it, to avoid compile-time + warning about printing a 'time_t' value, which could be either + a 32-bit or a 64 bit integral type. + +2016-04-23 Paul Smith + + * tests/scripts/features/output-sync: increase test timeout. + I'm getting random failures with a timeout of 10s; increase to 30s. + +2016-04-11 Paul Smith + + * NEWS: Update for pre-release + + * dep.h, makeint.h (show_goal_error): Move to makeint.h. + +2016-04-11 Paul Smith + + [SV 46433] Show recipe line offsets in line number messages. + While displaying line numbers, show the relevant line number inside + the recipe not just the first line of the entire recipe. + Sample changes suggested by Brian Vandenberg + + * gnumake.h (gmk_floc): Add an 'offset' to track the recipe offset. + * read.c (eval, eval_makefile, eval_buffer): Initialize 'offset'. + (record_files, install_pattern_rule): Ditto. + * job.c (new_job, job_next_command): Update 'offset' based on the + line of the recipe we're expanding or invoking. + (child_error): Add 'offset' when showing the line number. + * function.c (func_shell_base): Ditto. + * output.c (error, fatal): Ditto. + * NEWS: Mention the new ability. + * tests/scripts/features/errors: Check the line number on errors. + * tests/scripts/functions/warning: Check the line number on warnings. + * tests/scripts/features/output-sync, + tests/scripts/features/parallelism, tests/scripts/functions/shell, + tests/scripts/functions/error: Update line numbers. + +2016-04-09 Paul Smith + + * maintMakefile: Add a rule for storing preprocessor output. + + [SV 102] Don't show unnecessary include file errors. + Delay the generation of error messages for included files until we + are sure that we can't rebuild that included file. + * dep.h (struct dep): Don't reuse "changed"; make a separate field + to keep "flags". Get rid of dontcare and use the flag. + (struct goaldep): Create a new structure for goal prereqs + that tracks an errno value and the floc where the include happened. + Rework the structures to ensure they are supersets as expected. + In maintainer mode with GCC, use inline to get type checking. + * read.c (eval_makefile): Return a struct goaldep for the new + makefile. Ensure errno is set properly to denote a failure. + (read_all_makefiles): Switch to goaldep and check errno. + (eval): Don't show included file errors; instead remember them. + * remake.c (update_goal_chain): Set global variables to the current + goaldep we're building, and the entire chain. + (show_goal_error): Check if the current failure is a consequence + of building an included makefile and if so print an error. + (complain): Call show_goal_error() on rule failure. + * job.c (child_error): Call show_goal_error() on child error. + * main.c (main): Switch from struct dep to goaldep. + * misc.c (free_dep_chain): Not used; make into a macro. + * tests/scripts/features/include: Update and include new tests. + * tests/scripts/options/dash-B, tests/scripts/options/dash-W, + tests/scripts/options/print-directory, + tests/scripts/variables/MAKE_RESTARTS: Update known-good-output. + + * job.c (child_error): Add filename length to output length. + Reported by Dale Stimson + +2016-04-04 Paul Smith + + Preserve the real value of -jN in MAKEFLAGS using jobserver. + Previously if the jobserver was active, MAKEFLAGS would contain only + the -j option but not the number (not -j5 or whatever) so users + could not discover that value. Allow that value to be provided in + MAKEFLAGS without error but still give warnings if -jN is provided + on the command line if the jobserver is already activated. + + * NEWS: Discuss the new behavior. + * os.h, posixos.c, w32/w32os.c: Return success/failure from + jobserver_setup() and jobserver_parse_auth(). + * main.c (main): Separate the command line storage of job slots (now + in arg_job_slots) from the control storage (in job_slots). Make a + distinction between -jN flags read from MAKEFLAGS and those seen + on the command line: for the latter if the jobserver is enabled then + warn and disable it, as before. + * tests/scripts/features/jobserver: Add new testing. + +2016-04-04 Paul Smith + + * tests/run_make_tests.pl: Add file/lineno info to .run file. + + * maintMakefile: Fix logging of check-alt-config target. + + * job.c (child_execute_job): Fix $(shell...) under NO_OUTPUT_SYNC. + * main.c (decode_output_sync_flags): Use NONE for NO_OUTPUT_SYNC. + + * main.c (main): Restrict disabling debugging for MAKEFILES. + + * Makefile.am, w32/Makefile.am: Fix *os.c for Windows builds. + Original change provided by Luke Allardyce + + * make.texi: Confirm that CURDIR contains an absolute path. + + * docs/make.texi: [SV 47392] Add "Integrating make" chapter. + + Change --jobserver-fds to more generic --jobserver-auth. + * NEWS: Mention the change. + * main.c: Rename jobserver_fds variable to jobserver_auth and + --jobserver-fds option to --jobserver-auth. + * os.h, posixos.c, w32/w32os.c: Rename jobserver_parse_arg() and + jobserver_get_arg() to jobserver_parse_auth()/jobserver_get_auth(). + +2016-03-23 Paul Smith + + * tests/run_make_tests.pl: Preserve $make_command + * tests/scripts/options/dash-n: Use $make_command. This fixes + a spurious failure when running tests with valgrind enabled. + + * variable.c: Clean up some memory leaks. + + [SV 46995] Strip leading/trailing space from variable names + * makeint.h: Change MAP_SPACE to MAP_NEWLINE, and add MAP_PATHSEP + and MAP_SPACE which is now MAP_BLANK|MAP_NEWLINE. Create + NEW_TOKEN(), END_OF_TOKEN(), ISBLANK(), ISSPACE() macros. + * main.c (initialize_stopchar_map): Set MAP_NEWLINE only for + newline characters. + * Convert all uses of isblank() and isspace() to macros. + * Examine all uses of isblank() (doesn't accept newlines) and + change them wherever possible to ISSPACE() (does accept newlines). + * function.c (func_foreach): Strip leading/trailing space. + * variable.c (parse_variable_definition): Clean up. + * tests/scripts/functions/foreach: Test settings and errors. + * tests/scripts/functions/call: Rewrite to new-style. + * tests/scripts/misc/bs-nl: Add many more tests for newlines. + +2016-03-21 Paul Smith + + * function.c (func_file): Support reading from files. + * NEWS: Add information about reading files. + * make.texi (File Function): Describe reading files. + * tests/scripts/functions/file: Test new features for $(file ...) + +2016-03-20 Paul Smith + + * doc/make.texi (Setting Variables): Fix typo (add comma). + + * job.c (child_error): Combine file info with error message. + * tests/scripts/...: Update error message matches. + +2016-03-19 Paul Smith + + * variable.c: Align type of variable_changenum. + +2016-03-13 Paul Smith + + [SV 45728] Detect changes in .VARIABLES more accurately. + For performance, we only recompute .VARIABLES when (a) it's expanded + and (b) when its value will change from a previous expansion. To + determine (b) we were checking the number of entries in the hash + table which used to work until we started undefining entries: now if + you undefine and redefine the same number of entries in between + expanding .VARIABLES, it doesn't detect any change. Instead, keep + an increasing change number. + * variables.c: Add variable_changenum. + (define_variable_in_set, merge_variable_sets): Increment + variable_changenum if adding a new variable to the global set. + (undefine_variable_in_set): Increment variable_changenum if + undefining a variable from the global set. + (lookup_special_var): Test variable_changenum not the hash table. + * tests/scripts/variables/special: Test undefining variables. + + * main.c(main): Disable output sync without parallel builds. + + [SV 46581] Pre-define .LOADED to avoid warnings. + * main.c (main): Pre-define .LOADED as a default-level variable. + * load.c (load_file): Set the value rather than append it. Avoid + adding an extra initial whitespace. + * tests/scripts/features/load: Run with --warn-undefined-variables. + +2016-03-13 Paul Smith + + [SV 44555] Use vfork() instead of fork() where available. + Testing has shown that vfork() is actually significantly + more efficient on systems where it's supported, even for + copy-on-write implementations. If make is big enough, + duplicating the page tables is significant overhead. + + * configure.ac: Check for fork/vfork. + * makeint.h: Include vfork.h and set up #define for it. + * os.h, posixos.c (get_bad_stdin): For children who can't use + the normal stdin file descriptor, get a broken one. + * job.c (start_job_command): Avoid so many ifdefs and simplify + the invocation of child_execute_job() + (child_execute_job): move the fork operation here so it can + return early for the parent process. Switch to use vfork(). + * function.c (func_shell_base): Use new child_execute_job() and + simplify ifdefs. + * job.h, main.c, remote-cstms.c, vmsjobs.c, w32os.c: Update + declarations and calls. + +2016-03-09 Paul Smith + + * job.c (exec_command): [SV 47365] Show error on exec failure. + +2016-03-08 Paul Smith + + [SV 46261] Use pselect() for jobserver where supported. + * Makefile.am, configure.ac: Check for pselect() and sys/select.h. + * main.c (main): Block SIGCHLD if we have pselect() support. + * posixos.c (jobserver_acquire): If we support pselect() then use + it to query the jobserver pipe, while also listening for SIGCHLD. + Also pselect() supports a timeout so avoid alarm() calls. + + Clean up some compiler warnings. + * commands.c, commands.h: Use unsigned char for flags. + * dir.c: Use time_t and size_t, and char for a boolean value. + * job.c: Use unsigned and char. + * read.c: Return a signed type since -1 is a valid return code. + + Extract jobserver implementation into OS-specific files. + * os.h, posixos.c, w32/w32os.c: New files implementing jobserver. + * job.c, job.h, main.c, makeint.h: Move content to new files. + * w32/include/sub_proc.h, w32/subproc/sub_proc.c: Ditto. + * Makefile.am: Build and package OS-specific files. + * build_w32.bat, make_msvc_net2003.vcproj, README.W32.template: + Update for new files, and clean up the build. + * POTFILES.in, maintMakefile, NMakefile.template: Ditto. + * w32/subproc/build.bat: Delete as unused. + + [SV 46261] Add more EINTRLOOP wrappers. + This cannot be a perfect solution because there are always other + possible places EINTR can happen, including external libraries + such as gettext, Guile etc. + +2016-02-29 Paul Smith + + * strcache.c (add_hugestring): [SV 46832] Support huge strings. + The strcache was limited to strings of length 65535 or less, + because the length is kept in an unsigned short. To support + huge strings add a new simple linked list, which we don't try + to hash. + + * strcache.c (add_string): [SV 47071] Handle huge initial string. + If the very first string added to the string cache is more than + half the maximum size, we failed when moving the only strcache + buffer to the full list. + + [SV 47151] Exit with 1 when checking recursive make -q + * job.h (struct child): New bit to mark recursive command lines. + * job.c (start_job_command): Set the recursive command line bit. + (reap_children): If the child is a recursive command and it exits + with 1 during question mode, don't print an error and exit with 1. + * tests/scripts/options/dash-q: Add a regression test. + + * main.c (define_makeflags): Add parens to avoid GCC warning. + +2016-02-29 Paul Smith + + * tests/scripts/features/archives: Handle deterministic archives. + Newer versions of binutils allow ar to be compiled to generate + "deterministic archives" by default: in this mode no timestamp + information is generated in the static archive, which utterly + breaks GNU make's archive updating capability. Debian and Ubuntu + have turned this feature on by default in their distributions + which causes the regression tests to fail. + + Update the regression tests to check for the availability of the + "U" option to ar which disables deterministic archives and allows + GNU make's archive support to work properly again. + +2016-02-28 Paul Smith + + Update Copyright statements for the new year. + + * doc/make.texi: [SV 47163] Fix typo in 'ifdef' documentation. + + * doc/make.texi: [SV 35455] Add more uses for Empty Recipes. + +2015-11-07 Gisle Vanem + + Fix diagnostics on MS-Windows when environment is too large + * w32/subproc/sub_proc.c (process_begin): Fix test of the error + cause when the environment block is too large. + +2015-10-27 Eli Zaretskii + + Update README.W32.template + * README.W32.template: Update for latest developments. Make it + clear we don't recommend using HAVE_CASE_INSENSITIVE_FS in + general. + + [SV 46304] Don't invoke C++ compiler on C sources on MS-Windows + * default.c (default_variables) [HAVE_CASE_INSENSITIVE_FS]: Make + COMPILE.C and LINK.C be synonyms for COMPILE.c and LINK.c, + respectively. + +2015-09-23 Eli Zaretskii + + [SV 45838] When invoking w32 programs, don't use free'd memory. + * w32/subproc/sub_proc.c (process_begin): Freeing argv[0] makes + the other argv[i] pointers invalid, so need to allocate a new + array and copy argv[i] for i != 0 first, replacing argv[0] with + the batch file name, before we can free argv[0]. + +2015-07-13 Paul Smith + + * implicit.c (pattern_search): [SV 43677] Mark files secondary. + In order to fix SV 12267 we were marking the prerequisites of + implicit (pattern) targets that existed elsewhere in the makefile + as precious to keep them from being deleted as intermediate files. + However this also keeps them from being deleted on error. Instead + mark them as secondary. + * tests/scripts/targets/DELETE_ON_ERROR: Test DELETE_ON_ERROR. + +2015-07-12 Paul Smith + + [SV 28092] Preserve the exit status of the $(shell...) function. + Add a new variable .SHELLSTATUS which holds the exit status of the + last-invoked shell function or != assignment. + + * NEWS, doc/make.texi: Document the change. + * function.c (shell_completed, msdos_openpipe, func_shell_base): Add + shell_completed() to handle the completion of the shell, by setting + .SHELLSTATUS. Call it where needed. + * job.c (child_handler): Call shell_completed(). + * tests/scripts/functions/shell: Add tests for .SHELLSTATUS. + +2015-07-12 Paul Smith + + * tests/scripts/misc/fopen-fail: [SV 42390] Increase test timeout. + * Makefile.am (check-regression): Force ulimit -n for fopen-fail test. + + * job.c: [SV 43936] Check sigaction for error return. + + [SV 45049] Check for '$' being the last character in a string. + * expand.c (variable_expand_string): Add a single '$' if '$' ends the + string. + * read.c (find_char_unquote, get_next_mword): Stop if '$' ends the + string. + * variable.c (parse_variable_definition): Ditto. + + * read.c (unescape_char): [SV 45050] Handle final backslashes. + If the last thing in the string to be unescaped is a backslash, + stop without reading beyond the end of the string. + + * strcache.c: [SV 45275] Handle very long strings. + Our previous behavior for handling too-long strings involved + increasing the size of the default string cache buffer, but the + implementation was incomplete. Instead, create a one-off large + string cache entry and add it directly to the full cache list + without changing the default buffer size. + +2015-07-12 Duncan Moore (tiny change) + + * job.c [RISCOS]: Remove logic that is no longer required. + +2015-07-12 Paul Smith + + * remake.c (update_file): [SV 44742] Keep double-colon rule status. + Fix suggested by Everett Boyer + +2015-07-10 James Johnston (tiny change) + + [SVN 45515] Check exit status of sub-make in subproc.bat + * subproc.bat: Exit when sub-make invocation fails. + +2015-07-10 Eli Zaretskii + + [SV 45515] Ignore Windows-specific build artifacts + * .gitignore: Ignore *.exe, *.dll.a, *.lib, *pdb, and a few more MSVC + specific artifacts. + Suggested by James Johnston + +2015-02-28 Eli Zaretskii + + [SV 44348] Fix handling of shell widlcards on MS-Windows. + * job.c (construct_command_argv_internal): If shell wildcard + characters are found inside a string quoted with "..", give up the + fast route and go through the shell. Fixes Savannah bug #44348. + +2015-01-27 John Malmberg + + Fix bs-nl handling, exit and Environment for VMS. + This fix required a complete rewrite of the command parser vmsjobs.c + child_execute_job. The old parser had too many incorrect assumptions + about DCL commands and could not be repaired to extended. + + The parser now more closely parses VMS commands and handles quoted + commands and redirection. Command File mode has been improved, but can + not fully support bs-nl syntax. + + VMS Unix shell simulation has been improved. + + * commands.c: vms_comma_separator is now a run-time setting. + * function.c: vms_comma_separator is now a run-time setting. + * function.c(func_basename_dir) now reports "[]" or "./" based on + VMS crtl runtime setting. + * job.c(start_job_command): VMS Handle empty commands propery. + * main.c: Add VMS environment variables for run-time settings. + * vms_legacy_behavior - Force older behavior. + * vms_comma_separator - Commas or spaces for separators. + * vms_unix_simulation - Enhanced Posix shell simulation features. + * Detect if VMS CRTL is set to report Unix paths instead of VMS. + * ':' and '>' are also MAP_DIRSEP on VMS. + * makeint.h: Add VMS run-time option variables. + * readme.vms: Update to current behavior. + * variable.c(define_variable_in_set): Fix VMS Environment variable + lookup. + * variable.c(define_automatic_variables): Remove some VMS specific + automatic variables and use the Unix ones instead. + * vms_export_symbol.c: Set max symbol size correctly. + * vmsjobs.c: child_execute_job() complete rewrite of VMS comand + parsing. + * vmsjobs.c(build_vms_cmd): VMS commmand building with shell simulation. + +2014-12-27 Christian Boos (tiny change) + + Fix $(shell) on hosts with 64-bit pid_t. + * function.c: Use pid_t for shell_function_pid. + * job.c: Likewise. + +2014-10-20 Paul Smith + + * main.c (main): [SV 43434] Handle NULL returns from ttyname(). + +2014-10-20 Benedikt Morbach (tiny change) + + * tests/scripts/features/archives: [SV 43405] override AR variable. + +2014-10-20 John Malmberg + + Fix VMS implicit rules and UNIX paths. + This fixes VMS implicit rules and UNIX style pathname handling. + It also fixes some of the VMS style pathname handling, more work + there will be needed later. + TODO: There are other case insensitive platforms besides VMS. + We need to find out why there is extra VMS code for this. This + indicates either the extra VMS code is not needed, or the case + insensitive support may not be complete on the other case + insensitive platforms. + + * default.c: Add missing definitions to default_suffix_rules[] and + default_variables[]. + TODO: As it is important that VMS DCL mode definitions must always + be a superset of UNIX definitions, a better way of maintaining the + VMS DCL mode definitions should be devised. + * dir.c (downcase_inplace): Add a reentrant downcase() routine. + Add future support for VMS 8.2+ _USE_STD_STAT macro which will + disable a lot of VMS specific code from compiling. + (dir_file_exists_p): vmsify filename only if directory name has VMS + directory delimiters. + (file_exists_p): Handle both VMS and UNIX directories. + (file_impossible): Handle both VMS and Unix directories. Track + whether a VMS format path is needed for the return value. + * file.c (lookup_file): Check if vmsify is needed; handle UNIX paths. + * implicit.c (pattern_search): Enable UNIX paths. + * read.c (parse_file_seq): Enable UNIX paths. + * remake.c (f_mtime): Fix gpath_search call for VMS paths. + * rule.c (count_implicit_rule): Enable UNIX paths, Fix VMS paths. + * vpath.c (selective_vpath_search): Enable UNIX paths. + +2014-10-20 John Malmberg + + Update README.VMS and move news to the NEWS file + * NEWS: Merge in VMS history. + * README.VMS: Remove VMS history, document current behavior and + known issues. + +2014-10-20 John Malmberg + + [SV 41758]: Fix archive support for VMS. + Upated to match change to run_make_tests and some future fixes to + make on VMS. + + * arscan.c: Use ANSI compatible pragmas instead of VAX C extensions. + * tests/scripts/features/archives: Fix tests to use VMS rules and + answers when running on VMS and using DCL as a shell. + * tests/scripts/features/vpath3: Fix epected answer on test when + run on VMS. + * tests/scripts/vms/library: (New) Test the VMS library rules that + are not tested by existing tests. + +2014-10-20 John Malmberg + + [SV 42447]: VMS simulate exporting symbols + This also includes fixing the most of the exit handling code for VMS. + + Self tests: + Previously about 94 Tests in 36 categories fail. + Now about 45 tests in 22 categories fail. + + Because some tests do not properly clean up, the number of tests that + fail can vary by one or two test cases between consecutive runs. + + * Makefile.am: Add new VMS files. + * job.c: add prototype for vms_strsignal(). + * job.c: (child_error): Remove VMS specific code as no longer needed. + * job.c: (reap_children): The VMS specific code was setting the + status to 0 instead of setting it to the proper exit status. + * job.h: Add vms_launch_status to struct child. + * main.c: (main): Use environment variables for options to use MCR + * instead of a foreign command, and to always use command files for + subprocesses. + For VMS use (set_program_name) routine which is common to ports of + other GNU packages to VMS to set the program name used internally. + Use (vms_putenv_symbol) to set up symbols to be visible in child + programs, including recursive make launched by execve() + Start of Bash shell detection code for VMS. + * makefile.com: Need nested_include=none for building on VMS search + lists. Add vms_progname, vms_exit, and vms_export_symbol. + * makefile.vms: Need nested_include=none for building on VMS search + lists. Add vms_progname, vms_exit, vms_export_symbol. + * makeint.h: Make sure non-standard "VMS" macro is defined. Add + prototypes for new VMS routines. Remove VMS-specific failure codes. + * vmsjobs.c: Add VMS POSIX exit code constants. + (_is_unixy_shell): Detect Bash shell. + (vms_strsignal): simulate strsignal() on VMS. + (vmsHandleChildTerm): fix to properly report failed LIB$SPAWN() exit + status codes. Remove code that duplicated code in job.c. + (child_execute_job): Export environment symbols before spawning a + child and restore afterward unless option to use command files for + subprocesses is set. Improve handling of UNIX null commands ":". + * vms_exit.c: Provides vms_exit() to detect if an exit code is UNIX + or VMS, and converts the UNIX code into a VMS exit code. + * vms_export_symbol.c: Routines to create DCL symbols that work like + shell aliases or exported shell symbols and clean them up on exit. + * vms_export_symbol_test.com: Unit test for vms_export_symbol.c + * vms_progname.c: New file: VMS specific replace for progname.c that + is used in some GNU projects. + +2014-10-20 John Malmberg + + Set up for running tests on VMS. + * run_make_tests.pl: set $port_type to be 'VMS-DCL' when the test are + run from the VMS DCL Interpreter. When the tests are run from GNV + on VMS, the $port_type will be 'UNIX'. + * run_make_tests.com: VMS search list support. This is needed for + using a search list such as prj_root = lcl_root:,vms_root:,src_root: + for building and testing. + +2014-10-09 Paul Smith + + * configure.ac, NEWS, README.git: Set up for the next release. + +2014-10-05 Paul Smith + + GNU Make release 4.1. + +2014-10-02 Eli Zaretskii + + Fix Cygwin compilation error. + * job.c (construct_command_argv_internal) [HAVE_DOS_PATHS]: Fix + initializer for sh_chars_sh. + Reported by Denis Excoffier. + +2014-10-01 Gisle Vanem + + Fix last commit. + + * makeint.h (ftruncate): Define also for __WATCOMC__. + +2014-10-01 Eli Zaretskii + + Avoid compilation warnings. + * main.c (find_and_set_default_shell, main) [WINDOWS32]: Declare + variables 'const char *' to avoid compiler warnings. + * job.c (construct_command_argv_internal) [!NDEBUG]: Declare 'end' + and set it only if NDEBUG is not defined, to avoid compiler + warnings. + + Treat redirection of standard handles on Windows as it is done on Unix. + * job.c (start_job_command) [WINDOWS32]: Compute outfd and errfd + as on Posix platforms, and pass the results to process_easy. + * function.c (windows32_openpipe) [WINDOWS32]: Accept an + additional argument ERRFD and use it for redirecting the standard + error handle passed to the subprocess. + (func_shell_base) [WINDOWS32]: Pass the computed errfd to + windows32_openpipe. + +2014-09-30 Paul Smith + + Update Copyright statements for 2014. + + * tests/scripts/features/load: Avoid unused variable warnings. + + * loadapi.c (gmk_eval): Use C90 syntax. + +2014-09-30 Hartmut Becker + + * job.c: fix make action continuation lines. + * vmsjobs.c: fix writing DCL command files when trimming (white + spaces and $ signs) especially after a split (command continuation). + +2014-09-15 Bernhard Reutner-Fischer (tiny change) + + * configure.ac: Fix spacing in helptext of customs + +2014-09-15 Eli Zaretskii + + Support MAKE_TERMOUT and MAKE_TERMERR on MS-Windows. + * w32/compat/posixfcn.c (isatty, ttyname): New functions. + * config.h.W32.template (HAVE_TTYNAME): Define. Add a prototype + for ttyname. + +2014-09-15 Paul Smith + + * loadapi.c (gmk_eval): [SV 43221] Preserve var buff content for eval. + + * main.c, NEWS, doc/make.text: Rename MAKE_TTY* to MAKE_TERM* + +2014-09-14 Paul Smith + + * main.c (main): Set MAKE_TTYOUT and MAKE_TTYERR. + * configure.ac: Test for isatty() and ttyname() + * makeint.h: provide a substitute for ttyname() if it's not available. + * config.ami.template, config.h-vms.template, config.h.W32.template: + define/undefine HAVE_ISATTY/HAVE_TTYNAME macros. + * NEWS, doc/make.texi: Document these new variables. + +2014-09-07 Paul Smith + + * tests/config-flags.pm.in, tests/scripts/features/archives: [SV 43046] + Use the "ar" program detected by configure when running the test suite. + + * doc/make.texi: Clarify implicit rule lookup of phony targets + Reported by Frank Heckenbach + +2014-09-07 Hartmut Becker + + Fix and enhance VMS library support. + * ar.c: fix VMS library search for members, which do not have + suffixes, aka filename extensions. + * arscan.c: fix time conversion and library callback routines. + * default.c: more suffixes and automatically create the VMS library + if it doesn't exists. + + Enhance VMS exporting make environment variables. + * config.h-vms.template: add feature macro USE_DCL_COM_FILE to always + write a DCL command file, enabled by default. + * vmsjobs.c: with USE_DCL_COM_FILE enabled write make variables as DCL + symbol assignments into the command file. This enables printing + directory and make level info for recursive use of make. This also + enables forced DCL symbol substitution in the actions. + + Fix VMS automatic variable expansion + * function.c: add VMS code to func_notdir_suffix and func_basename_dir + to work on comma separated lists; this fixes the expansion of + $(^D), $(+D) and the F variants for VMS. + + * main.c [VMS]: Say that parallel jobs (-j) are not supported on VMS + + Enhance/fix VMS ONESHELL implementation and command execution + * job.c, vmsjobs.c: fix some double quote and new line handling; + implement ONESHELL with writing multiple lines into one DCL command + procedure; in ONESHELL allow VMS/make internal redirection only on the + first line; fix the created DCL command procedure, which didn't abort + on errors; return correct exit status from the DCL command procedure; + preserve current procedure verification; make the generated command + procedure more robust. + + Enhance/fix VMS setting of program name, MAKE/MAKE_COMMAND variables + * default.c, main.c, makeint.h, vmsfunctions.c: prefix argv[0] with + "mcr " for MAKE/MAKE_COMMAND and set the program name to the image + filename (without the .exe;version) + * vmsfunctions.c: remove obsolete code + * vmsify: use xmalloc + + Enhance/fix VMS exit code handling. + * commands.c, function.c, hash.c, job.c, main.c, output.c: + use MAKE exit codes. + * makeint.h: encode make exit codes so that they are VMS compatible. + * job.c: check child exit code for VMS style exit codes. + * vmsjobs.c: save and return VMS style exit code. + + Enhance/fix VMS multi-line support. + * job.c: split the command line at a newline. + * default.c, vmsjobs.c: change ECHO variable to a pseudo builtin, + which ensures that the VMS/DCL ECHO ("write sys$output") is used + and is correctly quoted. + * vmsjobs.c: remove unused builtin 'rm'. + + * config_flags_pm.com, [RENAMED test_make.com] run_make_tests.com: + Moved into tests directory. + + Enhance/fix VMS build environment + * config.h-vms.template: make sure the CRTL version is known + * makefile.com: always compile/link the guile module, remove VAXCRTL + parameter, new LIST parameter + * makefile.vms: always compile/link the guile module, use more + complete dependencies + * prepare_vms.com: helper to create a VMS config file when building + from a snapshot of the repository + +2014-09-07 Paul Smith + + * configure.ac, maintMakefile, w32/Makefile.am: Fix autotools issues. + Reported by Paul Eggert + +2014-08-30 Eli Zaretskii + + Change the order of "makefile" and "Makefile" to match the manual. + + Fix regression with "makefile" not being found on MS-Windows. + * read.c (read_all_makefiles) [WINDOWS32]: Recognize "makefile", + all-lowercase, as a makefile. Reported by Michael Waeber + . + +2014-07-16 Eli Zaretskii + + Fix compilation on MS-Windows. + * makeint.h [WINDOWS32]: Don't declare 'program' as 'const char *', + since it is modified in 'main'. + +2014-07-12 Eli Zaretskii + + [SV 42695] Fix compilation error on MS-Windows. + * main.c [WINDOWS32]: Don't declare 'program' as 'const char *', + since it is modified in 'main'. + +2014-07-12 Jonny Grant (tiny change) + + Fix defalt_makefiles[] for MS-Windows. + * read.c (read_all_makefiles) [WINDOWS32]: Remove the redundant + "makefile" and add "makefile.mak". + +2014-07-07 Fredrik Fornwall (tiny change) + + * arscan.c [ANDROID]: Android has no ar.h but supports archives. + +2014-07-07 Paul Smith + + * read.c (eval): [SV 41677] Correct test for TAB vs. 8 spaces. + +2014-07-07 Piotr Jaroszynski (tiny change) + + * output.c (pump_from_tmp): [SV 42378] Flush the output file regularly. + +2014-07-07 John Malmberg + + Update the regression test harness to support VMS. + * config_flags_pm.com, test_make.com: set up and run the regression + test environment on VMS. + * tests/run_make_tests.pl [VMS]: Use an alternate rmdir() + implementation on VMS. + (run_make_with_options) [VMS]: Provide VMS-specific quoting and shell + invocations. + (set_more_defaults) [VMS]: Set default values when running on VMS. + * tests/test_driver.pl (vms_get_process_logicals) [VMS]: Retrieve the + proper values from %ENV on VMS. + (resetENV) [VMS]: Use it. + (toplevel) [VMS]: Fix a bug with opendir() on some logical_devices. + (compare_output) [VMS]: Convert VMS test output to a "standard" format. + (_run_command) [VMS]: Handle signals and exit codes the VMS way. + (remove_directory_tree_inner) [VMS]: Unlink all versions of the file. + +2014-07-07 Paul Smith + + * various: Assume ISO C89-compliant free() implementation. + + * maintMakefile, various: Improve constification of the codebase. + + [SV 41983] Support omitting the text argument to $(file ...) + Reported by Tim Murphy + * function.c (func_file): Only write TEXT if it is not NULL. + * NEWS, doc/make.texi: Document the new feature + * tests/scripts/functions/file: Verify that the no-text version of + $(file ...) works and doesn't add a newline. + +2014-05-13 Jacques Germishuys + + NMakefile.template ($(OUTDIR)/posixfcn.obj): Fix a typo. + +2014-05-01 Paul Smith + + [SV 42249] Propagate correct rule status results. + * remake.c (update_file, update_file_1, check_dep): Return an enum + update_status value instead of an int, and keep the highest value we + find as we walk the graph so that the ultimate status is correct. + * tests/scripts/options/dash-q: Add a test for updating prerequisites. + +2014-02-08 Paul Smith + + * Rename MAP_PATHSEP to MAP_DIRSEP. + + * configure.ac: Fixup for newer autoconf/automake + +2014-02-08 Ray Donnelly (tiny change) + + * output.c: Ensure space for final nul byte in fmtbuf. + +2014-02-07 Gisle Vanem (tiny change) + + Improve error reporting in the Windows port when env size is too large. + w32/subproc/misc.c (arr2envblk): Compute and return the size of + the environment passed to child process. + + w32/subproc/sub_proc.c (process_begin): If the call to + CreateProcess failed with EINVAL, and the required environment + size was larger than 32KB, assume it's a Windows XP limitation, + and display an error message to that effect. + + w32/subproc/proc.h (arr2envblk): Update prototype. + +2014-02-01 Paul Smith + + * job.c (set_child_handler_action_flags): [SV 41341] + Ensure signal handler is in place before alarm(1). + +2014-01-20 Alan Hourihane (tiny change) + + * configure.ac: [SV 40790] Fix load autoconf variables. + +2014-01-17 Pavel Fedin (tiny change) + + Allow the EMX build to use output_sync. + job.c (start_job_command): Move the child output diversion out + of non-EMX branch. + [__EMX__]: Don't use fixed FD_STDOUT and FD_STDERR in the call to + child_execute_job. + +2014-01-12 Paul Smith + + * commands.c: [SV 40789] Remove unneeded header dlfcn.h + + * main.c (die): Close output_context AND make_sync. + die() can be invoked inside a separate output_context, if the + $(error ...) function is expanded as part of a recipe. + +2014-01-11 Pavel Fedin (tiny change) + + Fix .LIBPATTERNS for MS-Windows builds. + default.c (.LIBPATTERNS) [__CYGWIN__ || WINDOWS32]: Provide + library patterns for MS-Windows. + +2013-11-27 Paul Smith + + * w32/*: Remove TABs from the source code. + I know whitespace commits are annoying, but having these TABs is + causing me to miss things when I search through the code. This + doesn't try to change the w32 code to meet GNU coding standards. + + * main.c (decode_env_switches): Ensure we have enough space. + Reported (with patch) by Gerte Hoogewerf + +2013-11-27 Stephan T. Lavavej (tiny change) + + Solve some Windows build issues. + * main.c (main): Use ONS(), not OSN(). + (prepare_mutex_handle_string) [WINDOWS32]: Use %Ix formatting to + support both 32bit and 64bit systems. + * job.c (free_child, new_job): Use ONS(), not OSN(). + * w32/subproc/w32err.c (map_windws32_error_to_string): Use O() when + calling fatal(). + +2013-11-24 Paul Smith + + * features/loadapi (test_expand): Allocate memory for the nul byte. + + * load.c (load_file): Reset the name length minus the symbol. + + * read.c (unescape_char): Use memmove() for overlapping memory. + + Fix memory leak during environment option decoding. + * main.c (decode_switches): Always make a copy of option arguments. + (decode_env_switches): Use a stack buffer to convert environment + switches for parsing. + + [SV 40226] Add a new type of switch: single-string options + * main.c (struct command_switch): Change the "string" types to "strlist" + and make "string" be a single-valued string instead. + (output_sync_option, jobserver_fds, sync_mutex): Change to string type. + (decode_output_sync_flags): Handle single strings instead of lists. + (prepare_mutex_handle_string): Ditto. + (main): Ditto. + (clean_jobserver): Ditto. + (init_switches): Handle the new type. + (decode_switches): Ditto. + (define_makeflags): Ditto. + +2013-11-23 Daniel Richard G (tiny change) + + * load.c: [SV 40515] Define RTLD_GLOBAL if not set. + +2013-11-23 Paul Smith + + [SV 40361] Don't use vsnprintf(), which is an ISO C99 function. + * output.c (error, fatal, message): Take an extra argument specifying + how many bytes are used by the formatted arguments. + (get_buffer): New function that allocates the requested buffer size. + Remove msc_vsnprintf(), vfmtconcat(), and fmtconcat() as unneeded. + * makeint.h: Declare various helper macros for generating output. + * *.c: Change all error(), fatal(), message() calls to use the macros, + or pass the extra length argument directly. + +2013-10-27 Paul Smith + + * makeint.h (STOP_SET): [SV 40371] Cast to unsigned char. + * tests/scripts/misc/utf8: Test variable names with characters >127. + Fix suggested by Robert Bogomip + +2013-10-24 Gerte Hoogewerf + + Fix MS Visual Studio NET2003 build. + * make_msvc_net2003.vcproj: Do not exclude guile.c from compilation. + +2013-10-23 Christian Boos + + Fix SV bug #40227 with respect to stack size set for the MSVC build. + * NMakefile.template (/STACK): Increase to 0x400000, mainly for + the 64-bit builds. Fixes SV bug #40227. + (guile): Uncomment. + +2013-10-23 Eli Zaretskii + + Fix the MS-Windows build: now guile.c must always be compiled in. + * build_w32.bat: Always compile guile.c and link against guile.o. + Reported by Alexey Pavlov . + + * makeint.h (guile_gmake_setup): Define prototype unconditionally, + to avoid compiler warnings. + +2013-10-22 Eli Zaretskii + + Fix Savannah bug #31150 with failures due to setting window title. + * sub_proc.c (process_begin): Don't set startInfo.lpTitle, it + reportedly causes SV bug #31150, and according to MSDN it's a + no-no. + + Fix Savannah bug 40241 with Unixy file names as commands to MSYS shell. + * sub_proc.c: Include filedef.h and variable.h. + (process_begin): If exec_path was not found, but its first + character is '/', assume there's some shell magic, and invoke the + command through '$(SHELL) -c "COMMAND"'. Fixes SV bug#40241. + (make_command_line): Kludgey feature: if full_exec_path is "-c", + assume that argv[0] is not to be skipped, as it holds the command + string to be passed to the shell. + +2013-10-20 Paul Smith + + * glob.c (glob) [SV 18123]: Cherry-pick glibc fix + Apply commit a471e96a5352a5f0bde6d32dd36d33524811a2b1 from + git://sourceware.org/git/glibc.git to fix + https://sourceware.org/bugzilla/show_bug.cgi?id=10278 + + * read.c (record_files): [SV 33034] Change fatal() to error() + Allows deprecated syntax. However we don't guarantee this syntax + will continue to be legal in the future. + Change suggested by David Boyce + + * README.git: Add some missing release steps. + +2013-10-19 Paul Smith + + [SV 40240] Use configure info to build load test shared libs + * tests/config-flags.pm.in: A new file containing variable assignments + for the test suite; these variables are set by configure to contain + the values detected there for compilers, flags, etc. + * tests/run_make_tests.pl: Require the config-flags.pm file + * tests/scripts/features/load, tests/scripts/features/loadapi: Use the + configure-provided values when building the shared test library. + * configure.ac: Replace tests/config-flags.pm.in + * Makefile.am: Make sure tests/config-flags.pm is up to date + + * maintMakefile (checkcfg.%): Add testing of build.sh + + [SV 40254] Modify build.sh to work properly with Guile support. + * guile.c (guile_gmake_setup) [HAVE_GUILE]: Define a stub function + when Guile support is not enabled. + * main.c (main) [HAVE_GUILE]: Always invoke guile_gmake_setup(). + * Makefile.am: Make guile.c standard, not optional. + * build.template: Add the Guile compiler and linker flags. + + * maintMakefile: Accept variable overrides from the environment. + + * NEWS: Fix version so we can build a distfile. + + * read.c (eval): Avoid GCC warning to add braces. + + * GNUMAKEFLAGS: Remove -O so it passes in NO_OUTPUT_SYNC mode. + +2013-10-18 Christian Boos + + Fix initialization of stringlist variables for jobserver_fds and sync_mutex. + (tiny change) + + main.c (prepare_mutex_handle_string, main): Initialize + stringlist variables with at least 2 members, as one member is not + currently supported. + +2013-10-18 Eli Zaretskii + + Fix MinGW64 problem with non-compliant vsnprintf. + makeint.h (__USE_MINGW_ANSI_STDIO) [__MINGW64_VERSION_MAJOR]: + Define for MinGW64, to force it to use an ANSI-compliant + implementation of vsnprintf. Reported by Christian Boos + . + + Fix the MSVC build on MS-Windows. + output.c (vsnprintf) [_MSC_VER]: Define, instead of defining + snprintf, which isn't used. Reported by Christian Boos + . + NMakefile.template (OBJS): Add load.obj and posixfcn.obj. + ($(OUTDIR)/pathstuff.obj): New dependency. + Suggested by Christian Boos . + +2013-10-13 Paul Smith + + [SV 40139] Modify "missing separator" for better translation + + Add support for updating the GNU make web pages. + Add makefile rules for updating the http://www.gnu.org/software/make + web pages, including the online GNU make manual. + + Convert to auto-generated ChangeLog files. + Rename existing ChangeLog files so they won't be distributed. + Add targets to maintMakefile to generate ChangeLog from the Git + repository. This will require a version of gnulib be available. + Because ChangeLog is auto-generated, we have to switch our + automake mode to "foreign" or it will complain and fail. + + Set up for the next release. diff --git a/third_party/make/Makefile.am b/third_party/make/Makefile.am new file mode 100644 index 00000000000..8cc39c92b4f --- /dev/null +++ b/third_party/make/Makefile.am @@ -0,0 +1,182 @@ +# This is a -*-Makefile-*-, or close enough +# +# 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 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 . + +AUTOMAKE_OPTIONS = dist-lzip silent-rules std-options subdir-objects nostdinc +ACLOCAL_AMFLAGS = -I m4 + +MAKE_HOST = @MAKE_HOST@ + +SUBDIRS = lib po doc + +bin_PROGRAMS = make +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) +EXTRA_make_SOURCES = $(amiga_SRCS) $(vms_SRCS) + +make_LDADD = $(LIBOBJS) $(GUILE_LIBS) lib/libgnu.a $(GETLOADAVG_LIBS) \ + @LIBINTL@ + +localedir = $(datadir)/locale + +AM_CPPFLAGS = -Isrc -I$(top_srcdir)/src -Ilib -I$(top_srcdir)/lib \ + -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" \ + -DLOCALEDIR=\"$(localedir)\" + +AM_CFLAGS = $(GUILE_CFLAGS) + +if WINDOWSENV + make_SOURCES += $(w32_SRCS) + AM_CPPFLAGS += -I $(top_srcdir)/src/w32/include +else + make_SOURCES += src/posixos.c +endif + +if USE_CUSTOMS + make_SOURCES += src/remote-cstms.c +else + make_SOURCES += src/remote-stub.c +endif + +# Extra stuff to include in the distribution. + +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 \ + 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 + +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/$$/ \\/' \ + $(top_srcdir)/src/gmk-default.scm \ + && echo '";') > src/gmk-default.h + +# --------------- Local DIST Section + +# Install the mk and tests subdirectories +# +dist-hook: + (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 + @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 + +# > check-regression +# +# Look for the make test suite, and run it if found and we can find perl. +# If we're building outside the tree, we use symlinks to make a local copy of +# the test suite. Unfortunately the test suite itself isn't localizable yet. +# +MAKETESTFLAGS = + +.PHONY: check-regression + +check-regression: tests/config-flags.pm + @if test -f '$(top_srcdir)/tests/run_make_tests'; then \ + ulimit -n 128; \ + if $(PERL) -v >/dev/null 2>&1; then \ + case `cd '$(top_srcdir)'; pwd` in `pwd`) : ;; \ + *) test -d tests || mkdir tests; \ + rm -f srctests; \ + 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) $(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 ($(top_srcdir)/tests)."; \ + fi + + +# --------------- Maintainer's Section + +# Tell automake that I haven't forgotten about this file and it will be +# created before we build a distribution (see maintMakefile in the Git +# distribution). + +README: + +@MAINT_MAKEFILE@ diff --git a/third_party/make/Makefile.in b/third_party/make/Makefile.in new file mode 100644 index 00000000000..9535058f0ac --- /dev/null +++ b/third_party/make/Makefile.in @@ -0,0 +1,2030 @@ +# 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@ + +# This is a -*-Makefile-*-, or close enough +# +# 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 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 . + + +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@ +bin_PROGRAMS = make$(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)/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) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +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) +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 = +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 +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 = +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 +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 = $(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 \ + 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 +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +HEADERS = $(include_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 \ + 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. +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 +CSCOPE = cscope +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 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) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +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" +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.lz +GZIP_ENV = --best +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 = @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 = $(datadir)/locale +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 = 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. +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 \ + 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) + + +# > check-regression +# +# Look for the make test suite, and run it if found and we can find perl. +# If we're building outside the tree, we use symlinks to make a local copy of +# the test suite. Unfortunately the test suite itself isn't localizable yet. +# +MAKETESTFLAGS = +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + 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) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +src/config.h: src/stamp-h1 + @test -f $@ || rm -f src/stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1 + +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 src/stamp-h1 + touch $@ + +distclean-hdr: + -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) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +installcheck-binPROGRAMS: $(bin_PROGRAMS) + bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \ + case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \ + *" $$p "* | *" $(srcdir)/$$p "*) continue;; \ + esac; \ + f=`echo "$$p" | \ + sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + for opt in --help --version; do \ + if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \ + 2>c$${pid}_.err &2; bad=1; fi; \ + done; \ + done; rm -f c$${pid}_.???; exit $$bad +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) + $(AM_V_CCLD)$(LINK) $(make_OBJECTS) $(make_LDADD) $(LIBS) + +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@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)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) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +# 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" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +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 + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +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'`; \ + 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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + 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) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +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) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_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 + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-recursive +all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: 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: + +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 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-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -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 + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-includeHEADERS install-man + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: installcheck-binPROGRAMS + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -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 + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ + uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: $(am__recursive_targets) check-am install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + 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 \ + distclean-generic distclean-hdr distclean-tags distcleancheck \ + 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-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 + + +# --------------- Generate the Guile default module content + +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/$$/ \\/' \ + $(top_srcdir)/src/gmk-default.scm \ + && echo '";') > src/gmk-default.h + +# --------------- Local DIST Section + +# Install the mk and tests subdirectories +# +dist-hook: + (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 + @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-regression + +check-regression: tests/config-flags.pm + @if test -f '$(top_srcdir)/tests/run_make_tests'; then \ + ulimit -n 128; \ + if $(PERL) -v >/dev/null 2>&1; then \ + case `cd '$(top_srcdir)'; pwd` in `pwd`) : ;; \ + *) test -d tests || mkdir tests; \ + rm -f srctests; \ + 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) $(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 ($(top_srcdir)/tests)."; \ + fi + +# --------------- Maintainer's Section + +# Tell automake that I haven't forgotten about this file and it will be +# created before we build a distribution (see maintMakefile in the Git +# distribution). + +README: + +@MAINT_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/third_party/make/NEWS b/third_party/make/NEWS new file mode 100644 index 00000000000..e884df17e2f --- /dev/null +++ b/third_party/make/NEWS @@ -0,0 +1,1635 @@ +GNU make NEWS -*-indented-text-*- + History of user-visible changes. + 19 January 2020 + +See the end of this file for copyrights and conditions. + +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. + +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 + +* 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 + +* 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 + +* 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 + +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. + + +Version 4.2.1 (10 Jun 2016) + +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=107&set=custom + +This release is a bug-fix release. + + +Version 4.2 (22 May 2016) + +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=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 + successful or not "0" if not successful. The variable value is unset if no + != or $(shell ...) function has been invoked. + +* The $(file ...) function can now read from a file with $(file + +* The interface to GNU make's "jobserver" is stable as documented in the + manual, for tools which may want to access it. + + WARNING: Backward-incompatibility! The internal-only command line option + --jobserver-fds has been renamed for publishing, to --jobserver-auth. + +* The amount of parallelism can be determined by querying MAKEFLAGS, even when + the job server is enabled (previously MAKEFLAGS would always contain only + "-j", with no number, when job server was enabled). + +* VMS-specific changes: + + * Perl test harness now works. + + * Full support for converting Unix exit status codes to VMS exit status + codes. BACKWARD INCOMPATIBILITY Notice: On a child failure the VMS exit + code is now the encoded Unix exit status that Make usually generates, not + the VMS exit status of the child. + + +Version 4.1 (05 Oct 2014) + +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=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 + terminal. These variables are exported by default. + +* Allow a no-text-argument form of the $(file ...) function. Without a text + argument nothing is written to the file: it is simply opened in the + requested mode, then closed again. + +* Change the fatal error for mixed explicit and implicit rules, that was + introduced in GNU make 3.82, to a non-fatal error. However, this syntax is + still deprecated and may return to being illegal in a future version of GNU + make. Makefiles that rely on this syntax should be fixed. + See https://savannah.gnu.org/bugs/?33034 + +* VMS-specific changes: + + * Support for library files added, including support for using the GNV ar + utility. + + * Partial support for properly encoding Unix exit status codes into VMS exit + status codes. + + WARNING: Backward-incompatibility! These are different exit status codes + than Make exited with in the past. + + * Macros to hold the current make command are set up to translate the + argv[0] string to a VMS format path name and prefix it with "MCR " so that + the macro has a space in it. + + WARNING: Backward-incompatibility! This may break complex makefiles that + do processing on those macros. This is unlikely because so much in that + area was not and is still not currently working on VMS, it is unlikely to + find such a complex makefile, so this is more likely to impact + construction of a future makefile. + + * A command file is always used to run the commands for a recipe. + + WARNING: Backward-incompatibility! Running the make self tests has + exposed that there are significant differences in behavior when running + with the command file mode. It is unknown if this will be noticed by most + existing VMS makefiles. + +Version 4.0 (09 Oct 2013) + +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=101&set=custom + +* WARNING: Backward-incompatibility! + If .POSIX is specified, then make adheres to the POSIX backslash/newline + handling requirements, which introduces the following changes to the + standard backslash/newline handling in non-recipe lines: + * Any trailing space before the backslash is preserved + * Each backslash/newline (plus subsequent whitespace) is converted to a + single space + +* New feature: GNU Guile integration + This version of GNU make can be compiled with GNU Guile integration. + GNU Guile serves as an embedded extension language for make. + See the "Guile Function" section in the GNU Make manual for details. + Currently GNU Guile 1.8 and 2.0+ are supported. In Guile 1.8 there is no + support for internationalized character sets. In Guile 2.0+, scripts can be + encoded in UTF-8. + +* New command line option: --output-sync (-O) enables grouping of output by + target or by recursive make. This is useful during parallel builds to avoid + mixing output from different jobs together giving hard-to-understand + results. Original implementation by David Boyce . + Reworked and enhanced by Frank Heckenbach . + Windows support by Eli Zaretskii . + +* New command line option: --trace enables tracing of targets. When enabled + the recipe to be invoked is printed even if it would otherwise be suppressed + by .SILENT or a "@" prefix character. Also before each recipe is run the + makefile name and linenumber where it was defined are shown as well as the + prerequisites that caused the target to be considered out of date. + +* New command line option argument: --debug now accepts a "n" (none) flag + which disables all debugging settings that are currently enabled. + +* New feature: The "job server" capability is now supported on Windows. + Implementation contributed by Troy Runkel + +* New feature: The .ONESHELL capability is now supported on Windows. Support + added by Eli Zaretskii . + +* New feature: "!=" shell assignment operator as an alternative to the + $(shell ...) function. Implemented for compatibility with BSD makefiles. + Note there are subtle differences between "!=" and $(shell ...). See the + description in the GNU make manual. + WARNING: Backward-incompatibility! + Variables ending in "!" previously defined as "variable!= value" will now be + interpreted as shell assignment. Change your assignment to add whitespace + between the "!" and "=": "variable! = value" + +* New feature: "::=" simple assignment operator as defined by POSIX in 2012. + This operator has identical functionality to ":=" in GNU make, but will be + portable to any implementation of make conforming to a sufficiently new + version of POSIX (see http://austingroupbugs.net/view.php?id=330). It is + not necessary to define the .POSIX target to access this operator. + +* New feature: Loadable objects + This version of GNU make contains a "technology preview": the ability to + load dynamic objects into the make runtime. These objects can be created by + the user and can add extended functionality, usable by makefiles. + +* New function: $(file ...) writes to a file. + +* New variable: $(GNUMAKEFLAGS) will be parsed for make flags, just like + MAKEFLAGS is. It can be set in the environment or the makefile, containing + GNU make-specific flags to allow your makefile to be portable to other + versions of make. Once this variable is parsed, GNU make will set it to the + empty string so that flags will not be duplicated on recursion. + +* New variable: `MAKE_HOST' gives the name of the host architecture + make was compiled for. This is the same value you see after 'Built for' + when running 'make --version'. + +* Behavior of MAKEFLAGS and MFLAGS is more rigorously defined. All simple + flags are grouped together in the first word of MAKEFLAGS. No options that + accept arguments appear in the first word. If no simple flags are present + MAKEFLAGS begins with a space. Flags with both short and long versions + always use the short versions in MAKEFLAGS. Flags are listed in + alphabetical order using ASCII ordering. MFLAGS never begins with "- ". + +* Setting the -r and -R options in MAKEFLAGS inside a makefile now works as + expected, removing all built-in rules and variables, respectively. + +* If a recipe fails, the makefile name and linenumber of the recipe are shown. + +* A .RECIPEPREFIX setting is remembered per-recipe and variables expanded + in that recipe also use that recipe prefix setting. + +* In -p output, .RECIPEPREFIX settings are shown and all target-specific + variables are output as if in a makefile, instead of as comments. + +* On MS-Windows, recipes that use ".." quoting will no longer force + invocation of commands via temporary batch files and stock Windows + shells, they will be short-circuited and invoked directly. (In + other words, " is no longer a special character for stock Windows + shells.) This avoids hitting shell limits for command length when + quotes are used, but nothing else in the command requires the shell. + This change could potentially mean some minor incompatibilities in + behavior when the recipe uses quoted string on shell command lines. + + +Version 3.82 (28 Jul 2010) + +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=104&set=custom + +* Compiling GNU make now requires a conforming ISO C 1989 compiler and + standard runtime library. + +* WARNING: Backward-incompatibility! + The POSIX standard for make was changed in the 2008 version in a + fundamentally incompatible way: make is required to invoke the shell as if + the '-e' flag were provided. Because this would break many makefiles that + have been written to conform to the original text of the standard, the + default behavior of GNU make remains to invoke the shell with simply '-c'. + However, any makefile specifying the .POSIX special target will follow the + new POSIX standard and pass '-e' to the shell. See also .SHELLFLAGS + below. + +* WARNING: Backward-incompatibility! + The '$?' variable now contains all prerequisites that caused the target to + be considered out of date, even if they do not exist (previously only + existing targets were provided in $?). + +* WARNING: Backward-incompatibility! + Wildcards were not documented as returning sorted values, but the results + have been sorted up until this release.. If your makefiles require sorted + results from wildcard expansions, use the $(sort ...) function to request + it explicitly. + +* WARNING: Backward-incompatibility! + As a result of parser enhancements, three backward-compatibility issues + exist: first, a prerequisite containing an "=" cannot be escaped with a + backslash any longer. You must create a variable containing an "=" and + use that variable in the prerequisite. Second, variable names can no + longer contain whitespace, unless you put the whitespace in a variable and + use the variable. Third, in previous versions of make it was sometimes + not flagged as an error for explicit and pattern targets to appear in the + same rule. Now this is always reported as an error. + +* WARNING: Backward-incompatibility! + The pattern-specific variables and pattern rules are now applied in the + shortest stem first order instead of the definition order (variables + and rules with the same stem length are still applied in the definition + order). This produces the usually-desired behavior where more specific + patterns are preferred. To detect this feature search for 'shortest-stem' + in the .FEATURES special variable. + +* WARNING: Backward-incompatibility! + The library search behavior has changed to be compatible with the standard + linker behavior. Prior to this version for prerequisites specified using + the -lfoo syntax make first searched for libfoo.so in the current + directory, vpath directories, and system directories. If that didn't yield + a match, make then searched for libfoo.a in these directories. Starting + with this version make searches first for libfoo.so and then for libfoo.a + in each of these directories in order. + +* New command line option: --eval=STRING causes STRING to be evaluated as + makefile syntax (akin to using the $(eval ...) function). The evaluation + is performed after all default rules and variables are defined, but before + any makefiles are read. + +* New special variable: .RECIPEPREFIX allows you to reset the recipe + introduction character from the default (TAB) to something else. The + first character of this variable value is the new recipe introduction + character. If the variable is set to the empty string, TAB is used again. + It can be set and reset at will; recipes will use the value active when + they were first parsed. To detect this feature check the value of + $(.RECIPEPREFIX). + +* New special variable: .SHELLFLAGS allows you to change the options passed + to the shell when it invokes recipes. By default the value will be "-c" + (or "-ec" if .POSIX is set). + +* New special target: .ONESHELL instructs make to invoke a single instance + of the shell and provide it with the entire recipe, regardless of how many + lines it contains. As a special feature to allow more straightforward + conversion of makefiles to use .ONESHELL, any recipe line control + characters ('@', '+', or '-') will be removed from the second and + subsequent recipe lines. This happens _only_ if the SHELL value is deemed + to be a standard POSIX-style shell. If not, then no interior line control + characters are removed (as they may be part of the scripting language used + with the alternate SHELL). + +* New variable modifier 'private': prefixing a variable assignment with the + modifier 'private' suppresses inheritance of that variable by + prerequisites. This is most useful for target- and pattern-specific + variables. + +* New make directive: 'undefine' allows you to undefine a variable so that + it appears as if it was never set. Both $(flavor) and $(origin) functions + will return 'undefined' for such a variable. To detect this feature search + for 'undefine' in the .FEATURES special variable. + +* The parser for variable assignments has been enhanced to allow multiple + modifiers ('export', 'override', 'private') on the same line as variables, + including define/endef variables, and in any order. Also, it is possible + to create variables and targets named as these modifiers. + +* The 'define' make directive now allows a variable assignment operator + after the variable name, to allow for simple, conditional, or appending + multi-line variable assignment. + +* VMS-specific changes: + + * Michael Gehre (at VISTEC-SEMI dot COM) supplied a fix for a problem with + timestamps of object modules in OLBs. The timestamps were not correctly + adjusted to GMT based time, if the local VMS time was using a daylight + saving algorithm and if daylight saving was switched off. + + * John Eisenbraun (at HP dot COM) supplied fixes and and an enhancement to + append output redirection in action lines. + + * Rework of ctrl+c and ctrl+y handling. + + * Fix a problem with cached strings, which showed on case-insensitive file + systems. + + * Build fixes for const-ified code in VMS specific sources. + + * A note on appending the redirected output. With this change, a simple + mechanism is implemented to make ">>" work in action lines. In VMS + there is no simple feature like ">>" to have DCL command or program + output redirected and appended to a file. GNU make for VMS already + implements the redirection of output. If such a redirection is detected, + an ">" on the action line, GNU make creates a DCL command procedure to + execute the action and to redirect its output. Based on that, now ">>" + is also recognized and a similar but different command procedure is + created to implement the append. The main idea here is to create a + temporary file which collects the output and which is appended to the + wanted output file. Then the temporary file is deleted. This is all done + in the command procedure to keep changes in make small and simple. This + obviously has some limitations but it seems good enough compared with + the current ">" implementation. (And in my opinion, redirection is not + really what GNU make has to do.) With this approach, it may happen that + the temporary file is not yet appended and is left in SYS$SCRATCH. + The temporary file names look like "CMDxxxxx.". Any time the created + command procedure can not complete, this happens. Pressing Ctrl+Y to + abort make is one case. In case of Ctrl+Y the associated command + procedure is left in SYS$SCRATCH as well. Its name is CMDxxxxx.COM. + + * Change in the Ctrl+Y handling. The CtrlY handler now uses $delprc to + delete all children. This way also actions with DCL commands will be + stopped. As before the CtrlY handler then sends SIGQUIT to itself, + which is handled in common code. + + * Change in deleteing temporary command files. Temporary command files + are now deleted in the vms child termination handler. That deletes + them even if a Ctrl+C was pressed. + + * The behavior of pressing Ctrl+C is not changed. It still has only an + effect, after the current action is terminated. If that doesn't happen + or takes too long, Ctrl+Y should be used instead. + + +Version 3.81 (01 Apr 2006) + +* GNU make is ported to OS/2. + +* GNU make is ported to MinGW. The MinGW build is only supported by + the build_w32.bat batch file; see the file README.W32 for more + details. + +* WARNING: Future backward-incompatibility! + Up to and including this release, the '$?' variable does not contain + any prerequisite that does not exist, even though that prerequisite + 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 https://savannah.gnu.org/bugs/?16051 + +* WARNING: Backward-incompatibility! + GNU make now implements a generic "second expansion" feature on the + prerequisites of both explicit and implicit (pattern) rules. In order + to enable this feature, the special target '.SECONDEXPANSION' must be + defined before the first target which takes advantage of it. If this + feature is enabled then after all rules have been parsed the + prerequisites are expanded again, this time with all the automatic + variables in scope. This means that in addition to using standard + SysV $$@ in prerequisites lists, you can also use complex functions + such as $$(notdir $$@) etc. This behavior applies to implicit rules, + as well, where the second expansion occurs when the rule is matched. + However, this means that when '.SECONDEXPANSION' is enabled you must + double-quote any "$" in your filenames; instead of "foo: boo$$bar" you + now must write "foo: foo$$$$bar". Note that the SysV $$@ etc. feature, + which used to be available by default, is now ONLY available when the + .SECONDEXPANSION target is defined. If your makefiles take advantage + of this SysV feature you will need to update them. + +* WARNING: Backward-incompatibility! + In order to comply with POSIX, the way in which GNU make processes + backslash-newline sequences in recipes has changed. If your makefiles + use backslash-newline sequences inside of single-quoted strings in + recipes you will be impacted by this change. See the GNU make manual + subsection "Splitting Recipe Lines" (node "Splitting Lines"), in + section "Recipe Syntax", chapter "Writing Recipe in Rules", for + details. + +* WARNING: Backward-incompatibility! + Some previous versions of GNU make had a bug where "#" in a function + invocation such as $(shell ...) was treated as a make comment. A + workaround was to escape these with backslashes. This bug has been + fixed: if your makefile uses "\#" in a function invocation the + backslash is now preserved, so you'll need to remove it. + +* New command line option: -L (--check-symlink-times). On systems that + support symbolic links, if this option is given then GNU make will + use the most recent modification time of any symbolic links that are + used to resolve target files. The default behavior remains as it + always has: use the modification time of the actual target file only. + +* The "else" conditional line can now be followed by any other valid + conditional on the same line: this does not increase the depth of the + conditional nesting, so only one "endif" is required to close the + conditional. + +* All pattern-specific variables that match a given target are now used + (previously only the first match was used). + +* Target-specific variables can be marked as exportable using the + "export" keyword. + +* In a recursive $(call ...) context, any extra arguments from the outer + call are now masked in the context of the inner call. + +* Implemented a solution for the "thundering herd" problem with "-j -l". + This version of GNU make uses an algorithm suggested by Thomas Riedl + to track the number of jobs started in the + last second and artificially adjust GNU make's view of the system's + load average accordingly. + +* New special variables available in this release: + - .INCLUDE_DIRS: Expands to a list of directories that make searches + for included makefiles. + - .FEATURES: Contains a list of special features available in this + version of GNU make. + - .DEFAULT_GOAL: Set the name of the default goal make will + use if no goals are provided on the command line. + - MAKE_RESTARTS: If set, then this is the number of times this + instance of make has been restarted (see "How Makefiles Are Remade" + in the manual). + - New automatic variable: $| (added in 3.80, actually): contains all + the order-only prerequisites defined for the target. + +* New functions available in this release: + - $(lastword ...) returns the last word in the list. This gives + identical results as $(word $(words ...) ...), but is much faster. + - $(abspath ...) returns the absolute path (all "." and ".." + directories resolved, and any duplicate "/" characters removed) for + each path provided. + - $(realpath ...) returns the canonical pathname for each path + provided. The canonical pathname is the absolute pathname, with + all symbolic links resolved as well. + - $(info ...) prints its arguments to stdout. No makefile name or + line number info, etc. is printed. + - $(flavor ...) returns the flavor of a variable. + - $(or ...) provides a short-circuiting OR conditional: each argument + is expanded. The first true (non-empty) argument is returned; no + further arguments are expanded. Expands to empty if there are no + true arguments. + - $(and ...) provides a short-circuiting AND conditional: each + argument is expanded. The first false (empty) argument is + returned; no further arguments are expanded. Expands to the last + argument if all arguments are true. + +* Changes made for POSIX compatibility: + - Only touch targets (under -t) if they have a recipe. + - Setting the SHELL make variable does NOT change the value of the + SHELL environment variable given to programs invoked by make. As + an enhancement to POSIX, if you export the make variable SHELL then + it will be set in the environment, just as before. + +* On MS Windows systems, explicitly setting SHELL to a pathname ending + in "cmd" or "cmd.exe" (case-insensitive) will force GNU make to use + the DOS command interpreter in batch mode even if a UNIX-like shell + could be found on the system. + +* On VMS there is now support for case-sensitive filesystems such as ODS5. + See the README.VMS file for information. + +* Parallel builds (-jN) no longer require a working Bourne shell on + Windows platforms. They work even with the stock Windows shells, such + as cmd.exe and command.com. + +* Updated to autoconf 2.59, automake 1.9.5, and gettext 0.14.1. Users + should not be impacted. + +* New translations for Swedish, Chinese (simplified), Ukrainian, + Belarusian, Finnish, Kinyarwandan, and Irish. Many updated + translations. + +A complete list of bugs fixed in this version is available here: + + https://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=103 + + +Version 3.80 (03 Oct 2002) + +* A new feature exists: order-only prerequisites. These prerequisites + affect the order in which targets are built, but they do not impact + the rebuild/no-rebuild decision of their dependents. That is to say, + they allow you to require target B be built before target A, without + requiring that target A will always be rebuilt if target B is updated. + Patch for this feature provided by Greg McGary . + +* For compatibility with SysV make, GNU make now supports the peculiar + syntax $$@, $$(@D), and $$(@F) in the prerequisites list of a rule. + This syntax is only valid within explicit and static pattern rules: it + cannot be used in implicit (suffix or pattern) rules. Edouard G. Parmelan + provided a patch implementing this feature; however, I + decided to implement it in a different way. + +* The argument to the "ifdef" conditional is now expanded before it's + tested, so it can be a constructed variable name. + + Similarly, the arguments to "export" (when not used in a variable + definition context) and "unexport" are also now expanded. + +* A new function is defined: $(value ...). The argument to this + function is the _name_ of a variable. The result of the function is + the value of the variable, without having been expanded. + +* A new function is defined: $(eval ...). The arguments to this + function should expand to makefile commands, which will then be + evaluated as if they had appeared in the makefile. In combination + with define/endef multiline variable definitions this is an extremely + powerful capability. The $(value ...) function is also sometimes + useful here. + +* A new built-in variable is defined, $(MAKEFILE_LIST). It contains a + list of each makefile GNU make has read, or started to read, in the + order in which they were encountered. So, the last filename in the + list when a makefile is just being read (before any includes) is the + name of the current makefile. + +* A new built-in variable is defined: $(.VARIABLES). When it is + expanded it returns a complete list of variable names defined by all + makefiles at that moment. + +* A new command line option is defined, -B or --always-make. If + specified GNU make will consider all targets out-of-date even if they + would otherwise not be. + +* The arguments to $(call ...) functions were being stored in $1, $2, + etc. as recursive variables, even though they are fully expanded + before assignment. This means that escaped dollar signs ($$ etc.) + were not behaving properly. Now the arguments are stored as simple + variables. This may mean that if you added extra escaping to your + $(call ...) function arguments you will need to undo it now. + +* The variable invoked by $(call ...) can now be recursive: unlike other + variables it can reference itself and this will not produce an error + when it is used as the first argument to $(call ...) (but only then). + +* New pseudo-target .LOW_RESOLUTION_TIME, superseding the configure + option --disable-nsec-timestamps. You might need this if your build + process depends on tools like "cp -p" preserving time stamps, since + "cp -p" (right now) doesn't preserve the subsecond portion of a time + stamp. + +* Updated translations for French, Galician, German, Japanese, Korean, + and Russian. New translations for Croatian, Danish, Hebrew, and + Turkish. + +* Updated internationalization support to Gettext 0.11.5. + GNU make now uses Gettext's "external" feature, and does not include + any internationalization code itself. Configure will search your + system for an existing implementation of GNU Gettext (only GNU Gettext + is acceptable) and use it if it exists. If not, NLS will be disabled. + See ABOUT-NLS for more information. + +* Updated to autoconf 2.54 and automake 1.7. Users should not be impacted. + +* VMS-specific changes: + + * In default.c define variable ARCH as IA64 for VMS on Itanium systems. + + * In makefile.vms avoid name collision for glob and globfree. + + * This is the VMS port of GNU Make done by Hartmut.Becker@compaq.com. + + It is based on the specific version 3.77k and on 3.78.1. 3.77k was done + by Klaus Kmpf , the code was based on the VMS port of + GNU Make 3.60 by Mike Moretti. + + It was ported on OpenVMS/Alpha V7.1, DECC V5.7-006. It was re-build and + tested on OpenVMS/Alpha V7.2, OpenVMS/VAX 7.1 and 5.5-2. Different + versions of DECC were used. VAXC was tried: it fails; but it doesn't + seem worth to get it working. There are still some PTRMISMATCH warnings + during the compile. Although perl is working on VMS the test scripts + don't work. The function $shell is still missing. + + There is a known bug in some of the VMS CRTLs. It is in the shipped + versions of VMS V7.2 and V7.2-1 and in the currently (October 1999) + available ECOs for VMS V7.1 and newer versions. It is fixed in versions + shipped with newer VMS versions and all ECO kits after October 1999. It + only shows up during the daylight saving time period (DST): stat() + returns a modification time 1 hour ahead. This results in GNU make + warning messages. For a just created source you will see: + + $ gmake x.exe + gmake.exe;1: *** Warning: File 'x.c' has modification time in the future + (940582863 > 940579269) + cc /obj=x.obj x.c + link x.obj /exe=x.exe + gmake.exe;1: *** Warning: Clock skew detected. Your build may be + incomplete. + + +A complete list of bugs fixed in this version is available here: + + https://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=102 + + +Version 3.79.1 (23 Jun 2000) + +* .SECONDARY with no prerequisites now prevents any target from being + removed because make thinks it's an intermediate file, not just those + listed in the makefile. + +* New configure option --disable-nsec-timestamps, but this was + superseded in later versions by the .LOW_RESOLUTION_TIME pseudo-target. + +Version 3.79 (04 Apr 2000) + +* GNU make optionally supports internationalization and locales via the + GNU gettext (or local gettext if suitable) package. See the ABOUT-NLS + file for more information on configuring GNU make for NLS. + +* Previously, GNU make quoted variables such as MAKEFLAGS and + MAKEOVERRIDES for proper parsing by the shell. This allowed them to + be used within make build scripts. However, using them there is not + proper behavior: they are meant to be passed to subshells via the + environment. Unfortunately the values were not quoted properly to be + passed through the environment. This meant that make didn't properly + pass some types of command line values to submakes. + + With this version we change that behavior: now these variables are + quoted properly for passing through the environment, which is the + correct way to do it. If you previously used these variables + explicitly within a make rule you may need to re-examine your use for + correctness given this change. + +* A new pseudo-target .NOTPARALLEL is available. If defined, the + current makefile is run serially regardless of the value of -j. + However, submakes are still eligible for parallel execution. + +* The --debug option has changed: it now allows optional flags + controlling the amount and type of debugging output. By default only + a minimal amount information is generated, displaying the names of + "normal" targets (not makefiles) that were deemed out of date and in + need of being rebuilt. + + Note that the -d option behaves as before: it takes no arguments and + all debugging information is generated. + +* The `-p' (print database) output now includes filename and linenumber + information for variable definitions, to aid debugging. + +* The wordlist function no longer reverses its arguments if the "start" + value is greater than the "end" value. If that's true, nothing is + returned. + +* Hartmut Becker provided many updates for the VMS port of GNU make. + See the README.VMS file for more details. + +* VMS-specific changes: + + * Fix a problem with automatically remaking makefiles. GNU make uses an + execve to restart itself after a successful remake of the makefile. On + UNIX systems execve replaces the running program with a new one and + resets all signal handling to the default. On VMS execve creates a child + process, signal and exit handlers of the parent are still active, and, + unfortunately, corrupt the exit code from the child. Fix in job.c: + ignore SIGCHLD. + + * Added some switches to reflect latest features of DECC. Modifications in + makefile.vms. + + * Set some definitions to reflect latest features of DECC. Modifications in + config.h-vms (which is copied to config.h). + + * Added extern strcmpi declaration to avoid 'implicitly declared' messages. + Modification in make.h. + + * Default rule for C++, conditionals for gcc (GCC_IS_NATIVE) or DEC/Digital/ + Compaq c/c++ compilers. Modifications in default.c. + + * Usage of opendir() and friends, suppress file version. Modifications in + dir.c. + + * Added VMS specific code to handle ctrl+c and ctrl+y to abort make. + Modifications in job.c. + + * Added support to have case sensitive targets and dependencies but to + still use case blind file names. This is especially useful for Java + makefiles on VMS: + + .SUFFIXES : + .SUFFIXES : .class .java + .java.class : + javac "$< + HelloWorld.class : HelloWorld.java + + * A new macro WANT_CASE_SENSITIVE_TARGETS in config.h-vms was introduced. + It needs to be enabled to get this feature; default is disabled. The + macro HAVE_CASE_INSENSITIVE_FS must not be touched: it is still enabled. + Modifications in file.c and config.h-vms. + + * Bootstrap make to start building make is still makefile.com, but make + needs to be re-made with a make to make a correct version: ignore all + possible warnings, delete all objects, rename make.exe to a different + name and run it. + + * Made some minor modifications to the bootstrap build makefile.com. + +Version 3.78 (22 Sep 1999) + +* Two new functions, $(error ...) and $(warning ...) are available. The + former will cause make to fail and exit immediately upon expansion of + the function, with the text provided as the error message. The latter + causes the text provided to be printed as a warning message, but make + proceeds normally. + +* A new function $(call ...) is available. This allows users to create + their own parameterized macros and invoke them later. Original + implementation of this function was provided by Han-Wen Nienhuys + . + +* A new function $(if ...) is available. It provides if-then-else + capabilities in a builtin function. Original implementation of this + function was provided by Han-Wen Nienhuys . + +* Make defines a new variable, .LIBPATTERNS. This variable controls how + library dependency expansion (dependencies like ``-lfoo'') is performed. + +* Make accepts CRLF sequences as well as traditional LF, for + compatibility with makefiles created on other operating systems. + +* Make accepts a new option: -R, or --no-builtin-variables. This option + disables the definition of the rule-specific builtin variables (CC, + LD, AR, etc.). Specifying this option forces -r (--no-builtin-rules) + as well. + +* A "job server" feature, suggested by Howard Chu . + + On systems that support POSIX pipe(2) semantics, GNU make can now pass + -jN options to submakes rather than forcing them all to use -j1. The + top make and all its sub-make processes use a pipe to communicate with + each other to ensure that no more than N jobs are started across all + makes. To get the old behavior of -j back, you can configure make + with the --disable-job-server option. + +* The confusing term "dependency" has been replaced by the more accurate + and standard term "prerequisite", both in the manual and in all GNU make + output. + +* GNU make supports the "big archive" library format introduced in AIX 4.3. + +* GNU make supports large files on AIX, HP-UX, and IRIX. These changes + were provided by Paul Eggert . (Large file + support for Solaris and Linux was introduced in 3.77, but the + configuration had issues: these have also been resolved). + +* The Windows 95/98/NT (W32) version of GNU make now has native support + for the Cygnus Cygwin release B20.1 shell (bash). + +* The GNU make regression test suite, long available separately "under + the table", has been integrated into the release. You can invoke it + by running "make check" in the distribution. Note that it requires + Perl (either Perl 4 or Perl 5) to run. + +Version 3.77 (28 Jul 1998) + +* Implement BSD make's "?=" variable assignment operator. The variable + is assigned the specified value only if that variable is not already + defined. + +* Make defines a new variable, "CURDIR", to contain the current working + directory (after the -C option, if any, has been processed). + Modifying this variable has no effect on the operation of make. + +* Make defines a new default RCS rule, for new-style master file + storage: ``% :: RCS/%'' (note no ``,v'' suffix). + + Make defines new default rules for DOS-style C++ file naming + conventions, with ``.cpp'' suffixes. All the same rules as for + ``.cc'' and ``.C'' suffixes are provided, along with LINK.cpp and + COMPILE.cpp macros (which default to the same value as LINK.cc and + COMPILE.cc). Note CPPFLAGS is still C preprocessor flags! You should + use CXXFLAGS to change C++ compiler flags. + +* A new feature, "target-specific variable values", has been added. + This is a large change so please see the appropriate sections of the + manual for full details. Briefly, syntax like this: + + TARGET: VARIABLE = VALUE + + defines VARIABLE as VALUE within the context of TARGET. This is + similar to SunOS make's "TARGET := VARIABLE = VALUE" feature. Note + that the assignment may be of any type, not just recursive, and that + the override keyword is available. + + COMPATIBILITY: This new syntax means that if you have any rules where + the first or second dependency has an equal sign (=) in its name, + you'll have to escape them with a backslash: "foo : bar\=baz". + Further, if you have any dependencies which already contain "\=", + you'll have to escape both of them: "foo : bar\\\=baz". + +* A new appendix listing the most common error and warning messages + generated by GNU make, with some explanation, has been added to the + GNU make User's Manual. + +* Updates to the GNU make Customs library support (see README.customs). + +* Updates to the Windows 95/NT port from Rob Tulloh (see README.W32), + and to the DOS port from Eli Zaretski (see README.DOS). + +* VMS-specific changes: + + * This is the VMS port of GNU Make. + It is based on the VMS port of GNU Make 3.60 by Mike Moretti. + This port was done by Klaus Kmpf + + * There is first-level support available from proGIS Software, Germany. + Visit their web-site at http://www.progis.de to get information + about other vms software and forthcoming updates to gnu make. + + * /bin/sh style I/O redirection is supported. You can now write lines like + mcr sys$disk:[]program.exe < input.txt > output.txt &> error.txt + + * Makefile variables are looked up in the current environment. You can set + symbols or logicals in DCL and evaluate them in the Makefile via + $(). Variables defined in the Makefile + override VMS symbols/logicals ! + + * Functions for file names are working now. See the GNU Make manual for + $(dir ...) and $(wildcard ...). Unix-style and VMS-style names are + supported as arguments. + + * The default rules are set up for GNU C. Building an executable from a + single source file is as easy as 'make file.exe'. + + * The variable $(ARCH) is predefined as ALPHA or VAX resp. Makefiles for + different VMS systems can now be written by checking $(ARCH) as in + ifeq ($(ARCH),ALPHA) + $(ECHO) "On the Alpha" + else + $(ECHO) "On the VAX" + endif + + * Command lines of excessive length are correctly broken and written to a + batch file in sys$scratch for later execution. There's no limit to the + lengths of commands (and no need for .opt files :-) any more. + + * Empty commands are handled correctly and don't end in a new DCL process. + +Version 3.76.1 (19 Sep 1997) + +* Small (but serious) bug fix. Quick rollout to get into the GNU source CD. + +Version 3.76 (16 Sep 1997) + +* GNU make now uses automake to control Makefile.in generation. This + should make it more consistent with the GNU standards. + +* VPATH functionality has been changed to incorporate the VPATH+ patch, + previously maintained by Paul Smith . See the + manual. + +* Make defines a new variable, `MAKECMDGOALS', to contain the goals that + were specified on the command line, if any. Modifying this variable + has no effect on the operation of make. + +* A new function, `$(wordlist S,E,TEXT)', is available: it returns a + list of words from number S to number E (inclusive) of TEXT. + +* Instead of an error, detection of future modification times gives a + warning and continues. The warning is repeated just before GNU make + exits, so it is less likely to be lost. + +* Fix the $(basename) and $(suffix) functions so they only operate on + the last filename, not the entire string: + + Command Old Result New Result + ------- ---------- ---------- + $(basename a.b) a a + $(basename a.b/c) a a.b/c + $(suffix a.b) b b + $(suffix a.b/c) b/c + +* The $(strip) function now removes newlines as well as TABs and spaces. + +* The $(shell) function now changes CRLF (\r\n) pairs to a space as well + as newlines (\n). + +* Updates to the Windows 95/NT port from Rob Tulloh (see README.W32). + +* Eli Zaretskii has updated the port to 32-bit protected mode on MSDOS + and MS-Windows, building with the DJGPP v2 port of GNU C/C++ compiler + and utilities. See README.DOS for details, and direct all questions + concerning this port to Eli Zaretskii or DJ + Delorie . + +* VMS-specific changes: + + * John W. Eaton has updated the VMS port to support libraries and VPATH. + + * The cd command is supported if it's called as $(CD). This invokes + the 'builtin_cd' command which changes the directory. + Calling 'set def' doesn't do the trick, since a sub-shell is + spawned for this command, the directory is changed *in this sub-shell* + and the sub-shell ends. + + * Libraries are not supported. They were in GNU Make 3.60 but somehow I + didn't care porting the code. If there is enough interest, I'll do it at + some later time. + + * The variable $^ separates files with commas instead of spaces (It's the + natural thing to do for VMS). + + * See defaults.c for VMS default suffixes and my definitions for default + rules and variables. + + * The shell function is not implemented yet. + + * Load average routines haven't been implemented for VMS yet. + + * The default include directory for including other makefiles is + SYS$SYSROOT:[SYSLIB] (I don't remember why I didn't just use + SYS$LIBRARY: instead; maybe it wouldn't work that way). + + * The default makefiles make looks for are: makefile.vms, gnumakefile, + makefile., and gnumakefile. . + + * The stat() function and handling of time stamps in VMS is broken, so I + replaced it with a hack in vmsfunctions.c. I will provide a full rewrite + somewhere in the future. Be warned, the time resolution inside make is + less than what vms provides. This might be a problem on the faster Alphas. + + * You can use a : in a filename only if you precede it with a backslash ('\'). + E.g.- hobbes\:[bogas.files] + + * Make ignores success, informational, or warning errors (-S-, -I-, or -W-). + But it will stop on -E- and -F- errors. (unless you do something + to override this in your makefile, or whatever). + + * Remote stuff isn't implemented yet. + + * Multiple line DCL commands, such as "if" statements, must be put inside + command files. You can run a command file by using \@. + +Version 3.75 (27 Aug 1996) + +* The directory messages printed by `-w' and implicitly in sub-makes, + are now omitted if Make runs no commands and has no other messages to print. + +* Make now detects files that for whatever reason have modification times + in the future and gives an error. Files with such impossible timestamps + can result from unsynchronized clocks, or archived distributions + containing bogus timestamps; they confuse Make's dependency engine + thoroughly. + +* The new directive `sinclude' is now recognized as another name for + `-include', for compatibility with some other Makes. + +* Aaron Digulla has contributed a port to AmigaDOS. See README.Amiga for + details, and direct all Amiga-related questions to . + +* Rob Tulloh of Tivoli Systems has contributed a port to Windows NT or 95. + See README.W32 for details, and direct all Windows-related questions to + . + +* VMS-specific changes: + + * Lots of default settings are adapted for VMS. See default.c. + + * Long command lines are now converted to command files. + + * Comma (',') as a separator is now allowed. See makefile.vms for an example. + +Version 3.73 (05 Apr 1995) + +* Converted to use Autoconf version 2, so `configure' has some new options. + See INSTALL for details. + +* You can now send a SIGUSR1 signal to Make to toggle printing of debugging + output enabled by -d, at any time during the run. + +Version 3.72 (04 Nov 1994) + +* DJ Delorie has ported Make to MS-DOS using the GO32 extender. + He is maintaining the DOS port, not the GNU Make maintainer; + please direct bugs and questions for DOS to . + MS-DOS binaries are available for FTP from ftp.simtel.net in + /pub/simtelnet/gnu/djgpp/. + +* The `MAKEFLAGS' variable (in the environment or in a makefile) can now + contain variable definitions itself; these are treated just like + command line variable definitions. Make will automatically insert any + variable definitions from the environment value of `MAKEFLAGS' or from + the command line, into the `MAKEFLAGS' value exported to children. The + `MAKEOVERRIDES' variable previously included in the value of `$(MAKE)' + for sub-makes is now included in `MAKEFLAGS' instead. As before, you can + reset `MAKEOVERRIDES' in your makefile to avoid putting all the variables + in the environment when its size is limited. + +* If `.DELETE_ON_ERROR' appears as a target, Make will delete the target of + a rule if it has changed when its recipe exits with a nonzero status, + just as when the recipe gets a signal. + +* The automatic variable `$+' is new. It lists all the dependencies like + `$^', but preserves duplicates listed in the makefile. This is useful + for linking rules, where library files sometimes need to be listed twice + in the link order. + +* You can now specify the `.IGNORE' and `.SILENT' special targets with + dependencies to limit their effects to those files. If a file appears as + a dependency of `.IGNORE', then errors will be ignored while running the + recipe to update that file. Likewise if a file appears as a dependency + of `.SILENT', then the recipe to update that file will not be printed + before it is run. (This change was made to conform to POSIX.2.) + +Version 3.71 (21 May 1994) + +* The automatic variables `$(@D)', `$(%D)', `$(*D)', `$(. diff --git a/third_party/make/README b/third_party/make/README new file mode 100644 index 00000000000..9449748aa0f --- /dev/null +++ b/third_party/make/README @@ -0,0 +1,188 @@ +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. + +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. + +For source distribution building and installation instructions, see the file +INSTALL. + +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. +GNU Make is copyright by the Free Software Foundation. Copyright notices +condense sequential years into a range; e.g. "1987-1994" means all years +from 1987 to 1994 inclusive. + +Downloading +----------- + +GNU Make can be obtained in many different ways. See a description here: + + http://www.gnu.org/software/software.html + + +Documentation +------------- + +GNU make is fully documented in the GNU Make manual, which is contained +in this distribution as the file make.texinfo. You can also find +on-line and preformatted (PostScript and DVI) versions at the FSF's web +site. There is information there about ordering hardcopy documentation. + + http://www.gnu.org/ + http://www.gnu.org/doc/doc.html + http://www.gnu.org/manual/manual.html + + +Development +----------- + +GNU Make development is hosted by Savannah, the FSF's online development +management tool. Savannah is here: + + http://savannah.gnu.org + +And the GNU Make development page is here: + + http://savannah.gnu.org/projects/make/ + +You can find most information concerning the development of GNU Make at +this site. + + +Bug Reporting +------------- + +You can send GNU make bug reports to . Please see the +section of the GNU make manual entitled 'Problems and Bugs' for +information on submitting useful and complete bug reports. + +You can also use the online bug tracking system in the Savannah GNU Make +project to submit new problem reports or search for existing ones: + + http://savannah.gnu.org/bugs/?group=make + +If you need help using GNU make, try these forums: + + help-make@gnu.org + help-utils@gnu.org + news:gnu.utils.help + news:gnu.utils.bug + + +Git Access +---------- + +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 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 +--------------------- + +It has been reported that the XLC 1.2 compiler on AIX 3.2 is buggy such +that if you compile make with 'cc -O' on AIX 3.2, it will not work +correctly. It is said that using 'cc' without '-O' does work. + +The standard /bin/sh on SunOS 4.1.3_U1 and 4.1.4 is broken and cannot be +used to configure GNU make. Please install a different shell such as +bash or pdksh in order to run "configure". See this message for more +information: + http://mail.gnu.org/archive/html/bug-autoconf/2003-10/msg00190.html + +One area that is often a problem in configuration and porting is the code +to check the system's current load average. To make it easier to test and +debug this code, you can do 'make check-loadavg' to see if it works +properly on your system. (You must run 'configure' beforehand, but you +need not build Make itself to run this test.) + +Another potential source of porting problems is the support for large +files (LFS) in configure for those operating systems that provide it. +Please report any bugs that you find in this area. If you run into +difficulties, then as a workaround you should be able to disable LFS by +adding the '--disable-largefile' option to the 'configure' script. + +On systems that support micro- and nano-second timestamp values and +where stat(2) provides this information, GNU make will use it when +comparing timestamps to get the most accurate possible result. However, +note that many current implementations of tools that *set* timestamps do +not preserve micro- or nano-second granularity. This means that "cp -p" +and other similar tools (tar, etc.) may not exactly duplicate timestamps +with micro- and nano-second granularity on some systems. If your build +system contains rules that depend on proper behavior of tools like "cp +-p", you should consider using the .LOW_RESOLUTION_TIME pseudo-target to +force make to treat them properly. See the manual for details. + + +Ports +----- + + - See README.customs for details on integrating GNU make with the + Customs distributed build environment from the Pmake distribution. + + - See README.VMS for details about GNU Make on OpenVMS. + + - See README.Amiga for details about GNU Make on AmigaDOS. + + - See README.W32 for details about GNU Make on Windows NT, 95, or 98. + + - See README.DOS for compilation instructions on MS-DOS and MS-Windows + using DJGPP tools. + + A precompiled binary of the MSDOS port of GNU Make is available as part + 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 +at the right README! + + +------------------------------------------------------------------------------- +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 . diff --git a/third_party/make/README.Amiga b/third_party/make/README.Amiga new file mode 100644 index 00000000000..b941da3820f --- /dev/null +++ b/third_party/make/README.Amiga @@ -0,0 +1,80 @@ +Short: Port of GNU make with SAS/C (no ixemul.library required) +Author: GNU, Amiga port by Aaron "Optimizer" Digulla +Uploader: Aaron "Optimizer" Digulla (digulla@fh-konstanz.de) +Type: dev/c + +This is a pure Amiga port of GNU make. It needs no extra libraries or +anything. It has the following features (in addition to any features of +GNU make): + +- Runs Amiga-Commands with SystemTags() (Execute) +- Can run multi-line statements +- Allows to use Device-Names in targets: + + c:make : make.o + + is ok. To distinguish between device-names and target : or ::, MAKE + looks for spaces. If there are any around :, it's taken as a target + delimiter, if there are none, it's taken as the name of a device. Note + that "make:make.o" tries to create "make.o" on the device "make:". +- Replaces @@ by a newline in any command line: + + if exists make @@\ + delete make.bak quiet @@\ + rename make make.bak @@\ + endif @@\ + $(CC) Link Make.o To make + + works. Note that the @@ must stand alone (i.e., "make@@\" is illegal). + Also be careful that there is a space after the "\" (i.e., at the + beginning of the next line). +- Can be made resident to save space and time +- Amiga specific wildcards can be used in $(wildcard ...) + +BUGS: +- The line + + dummy.h : src/*.c + +tries to make dummy.h from "src/*.c" (i.e., no wildcard-expansion takes +place). You have to use "$(wildcard src/*.c)" instead. + +COMPILING FROM SCRATCH +---------------------- + +To recompile, you need SAS/C 6.51. + +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: + + 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 + +Copy make somewhere in your search path (e.g., sc:c or sc:bin). +If you plan to use recursive makes, install make resident: + + Resident make Add + + +------------------------------------------------------------------------------- +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 . diff --git a/third_party/make/README.DOS b/third_party/make/README.DOS new file mode 100644 index 00000000000..fbb563ec87e --- /dev/null +++ b/third_party/make/README.DOS @@ -0,0 +1,296 @@ +Port of GNU Make to 32-bit protected mode on MSDOS and MS-Windows. + +Builds with DJGPP v2 port of GNU C/C++ compiler and utilities. + + +New (since 3.74) DOS-specific features: + + 1. Supports long filenames when run from DOS box on Windows 9x. + + 2. Supports both stock DOS COMMAND.COM and Unix-style shells + (details in 'Notes' below). + + 3. Supports DOS drive letters in dependencies and pattern rules. + + 4. Better support for DOS-style backslashes in pathnames (but see + 'Notes' below). + + 5. The $(shell) built-in can run arbitrary complex commands, + including pipes and redirection, even when COMMAND.COM is your + shell. + + 6. Can be built without floating-point code (see below). + + 7. Supports signals in child programs and restores the original + directory if the child was interrupted. + + 8. Can be built without (a previous version of) Make. + + 9. The build process requires only standard tools. (Optional + 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). + + +To install a binary distribution: + + Simply unzip the makNNNb.zip file (where NNN is the version number) + preserving the directory structure (-d switch if you use PKUNZIP). + If you are installing Make on Windows 9X or Windows 2000, use an + unzip program that supports long filenames in zip files. After + unzipping, make sure the directory with make.exe is on your PATH, + and that's all you need to use Make. + + +To build from sources: + + 1. Unzip the archive, preserving the directory structure (-d switch + if you use PKUNZIP). If you build Make on Windows 9X or Windows + 2000, use an unzip program that supports long filenames in zip + files. + + If you are unpacking an official GNU source distribution, use + either DJTAR (which is part of the DJGPP development + environment), or the DJGPP port of GNU Tar. + + 2. If you have a working Make already, you can run: + + make -f Basic.mk + + 3. If you don't have a working Make already you can bootstrap one + by running: + + .\builddos.bat + + 4. If you are building from outside of the source directory, you + need to tell Make where the sources are, like this: + + make -f c:/djgpp/gnu/make/Basic.mk SRCDIR=c:/djgpp/gnu/make + + or: + + c:/djgpp/gnu/make/builddos.bat c:/djgpp/gnu/make + + 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: +----- + + 1. The shell issue. + + This is probably the most significant improvement, first + introduced in the port of GNU Make 3.75. + + The original behavior of GNU Make is to invoke commands + directly, as long as they don't include characters special to + the shell or internal shell commands, because that is faster. + When shell features like redirection or filename wildcards are + involved, Make calls the shell. + + This port supports both DOS shells (the stock COMMAND.COM and its + 4DOS/NDOS replacements), and Unix-style shells (tested with the + venerable Stewartson's 'ms_sh' 2.3 and the DJGPP port of 'bash' by + Daisuke Aoyama ). + + When the $SHELL variable points to a Unix-style shell, Make + works just like you'd expect on Unix, calling the shell for any + command that involves characters special to the shell or + internal shell commands. The only difference is that, since + there is no standard way to pass command lines longer than the + infamous DOS 126-character limit, this port of Make writes the + command line to a temporary disk file and then invokes the shell + on that file. + + If $SHELL points to a DOS-style shell, however, Make will not + call it automatically, as it does with Unix shells. Stock + COMMAND.COM is too dumb and would unnecessarily limit the + functionality of Make. For example, you would not be able to + use long command lines in commands that use redirection or + pipes. Therefore, when presented with a DOS shell, this port of + Make will emulate most of the shell functionality, like + redirection and pipes, and shall only call the shell when a + batch file or a command internal to the shell is invoked. (Even + when a command is an internal shell command, Make will first + search the $PATH for it, so that if a Makefile calls 'mkdir', + you can install, say, a port of GNU 'mkdir' and have it called + in that case.) + + The key to all this is the extended functionality of 'spawn' and + 'system' functions from the DJGPP library; this port just calls + 'system' where it would invoke the shell on Unix. The most + important aspect of these functions is that they use a special + mechanism to pass long (up to 16KB) command lines to DJGPP + programs. In addition, 'system' emulates some internal + commands, like 'cd' (so that you can now use forward slashes + with it, and can also change the drive if the directory is on + another drive). Another aspect worth mentioning is that you can + call Unix shell scripts directly, provided that the shell whose + name is mentioned on the first line of the script is installed + anywhere along the $PATH. It is impossible to tell here + everything about these functions; refer to the DJGPP library + reference for more details. + + The $(shell) built-in is implemented in this port by calling + 'popen'. Since 'popen' calls 'system', the above considerations + are valid for $(shell) as well. In particular, you can put + arbitrary complex commands, including pipes and redirection, + inside $(shell), which is in many cases a valid substitute for + the Unix-style command substitution (`command`) feature. + + + 2. "SHELL=/bin/sh" -- or is it? + + Many Unix Makefiles include a line which sets the SHELL, for + those versions of Make which don't have this as the default. + Since many DOS systems don't have 'sh' installed (in fact, most + of them don't even have a '/bin' directory), this port takes + such directives with a grain of salt. It will only honor such a + directive if the basename of the shell name (like 'sh' in the + above example) can indeed be found in the directory that is + mentioned in the SHELL= line ('/bin' in the above example), or + in the current working directory, or anywhere on the $PATH (in + that order). If the basename doesn't include a filename + extension, Make will look for any known extension that indicates + an executable file (.exe, .com, .bat, .btm, .sh, and even .sed + and .pl). If any such file is found, then $SHELL will be + defined to the exact pathname of that file, and that shell will + hence be used for the rest of processing. But if the named + shell is *not* found, the line which sets it will be effectively + ignored, leaving the value of $SHELL as it was before. Since a + lot of decisions that this port makes depend on the gender of + the shell, I feel it doesn't make any sense to tailor Make's + behavior to a shell which is nowhere to be found. + + Note that the above special handling of "SHELL=" only happens + for Makefiles; if you set $SHELL in the environment or on the + Make command line, you are expected to give the complete + pathname of the shell, including the filename extension. + + The default value of $SHELL is computed as on Unix (see the Make + manual for details), except that if $SHELL is not defined in the + environment, $COMSPEC is used. Also, if an environment variable + named $MAKESHELL is defined, it takes precedence over both + $COMSPEC and $SHELL. Note that, unlike Unix, $SHELL in the + environment *is* used to set the shell (since on MSDOS, it's + unlikely that the interactive shell will not be suitable for + Makefile processing). + + The bottom line is that you can now write Makefiles where some + of the targets require a real (i.e. Unix-like) shell, which will + nevertheless work when such shell is not available (provided, of + course, that the commands which should always work, don't + require such a shell). More important, you can convert Unix + Makefiles to MSDOS and leave the line which sets the shell + intact, so that people who do have Unixy shell could use it for + targets which aren't converted to DOS (like 'install' and + 'uninstall', for example). + + + 3. Default directories. + + GNU Make knows about standard directories where it searches for + library and include files mentioned in the Makefile. Since + MSDOS machines don't have standard places for these, this port + will search ${DJDIR}/lib and ${DJDIR}/include respectively. + $DJDIR is defined automatically by the DJGPP startup code as the + root of the DJGPP installation tree (unless you've tampered with + the DJGPP.ENV file). This should provide reasonable default + values, unless you moved parts of DJGPP to other directories. + + + 4. Letter-case in filenames. + + If you run Make on Windows 9x, you should be aware of the + letter-case issue. Make is internally case-sensitive, but all + file operations are case-insensitive on Windows 9x, so + e.g. files 'FAQ', 'faq' and 'Faq' all refer to the same file, as + far as Windows is concerned. The underlying DJGPP C library + functions honor the letter-case of the filenames they get from + the OS, except that by default, they down-case 8+3 DOS filenames + which are stored in upper case in the directory and would break + many Makefiles otherwise. (The details of which filenames are + converted to lower case are explained in the DJGPP libc docs, + under the '_preserve_fncase' and '_lfn_gen_short_fname' + functions, but as a thumb rule, any filename that is stored in + upper case in the directory, is a valid DOS 8+3 filename and + doesn't include characters invalid on MSDOS FAT filesystems, + will be automatically down-cased.) User reports that I have + indicate that this default behavior is generally what you'd + expect; however, your input is most welcome. + + In any case, if you hit a situation where you must force Make to + get the 8+3 DOS filenames in upper case, set FNCASE=y in the + environment or in the Makefile. + + + 5. DOS-style pathnames. + + There are a lot of places throughout the program sources which + make implicit assumptions about the pathname syntax. In + particular, the directories are assumed to be separated by '/', + and any pathname which doesn't begin with a '/' is assumed to be + relative to the current directory. This port attempts to + support DOS-style pathnames which might include the drive letter + and use backslashes instead of forward slashes. However, this + support is not complete; I feel that pursuing this support too + far might break some more important features, particularly if + you use a Unix-style shell (where a backslash is a quote + character). I only consider support of backslashes desirable + because some Makefiles invoke non-DJGPP programs which don't + understand forward slashes. A notable example of such programs + is the standard programs which come with MSDOS. Otherwise, you + are advised to stay away from backslashes whenever possible. In + particular, filename globbing won't work on pathnames with + backslashes, because the GNU 'glob' library doesn't support them + (backslash is special in filename wildcards, and I didn't want + to break that). + + One feature which *does* work with backslashes is the filename- + related built-in functions such as $(dir), $(notdir), etc. + Drive letters in pathnames are also fully supported. + + + +Bug reports: +----------- + + Bugs that are clearly related to the MSDOS/DJGPP port should be + reported first on the comp.os.msdos.djgpp news group (if you cannot + post to Usenet groups, write to the DJGPP mailing list, + , which is an email gateway into the above news + group). For other bugs, please follow the procedure explained in + the "Bugs" chapter of the Info docs. If you don't have an Info + reader, look up that chapter in the 'make.i1' file with any text + browser/editor. + + + Enjoy, + Eli Zaretskii + + +------------------------------------------------------------------------------- +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 . diff --git a/third_party/make/README.OS2 b/third_party/make/README.OS2 new file mode 100644 index 00000000000..54450d95b45 --- /dev/null +++ b/third_party/make/README.OS2 @@ -0,0 +1,176 @@ +Port of GNU make to OS/2. + +Features of GNU make that do not work under OS/2: + - remote job execution + - dynamic load balancing + + +Special features of the OS/2 version: + +Due to the fact that some people might want to use sh syntax in +Makefiles while others might want to use OS/2's native shell cmd.exe, +GNU make supports both shell types. The following list defines the order +that is used to determine the shell: + + 1. The shell specified by the environment variable MAKESHELL. + 2. The shell specified by the SHELL variable within a Makefile. Like + Unix, SHELL is NOT taken from the environment. + 3. The shell specified by the COMSPEC environment variable. + 4. The shell specified by the OS2_SHELL environment variable. + 5. If none of the above is defined /bin/sh is used as default. This + happens e.g. in the make testsuite. + +Note: - Points 3 and 4 can be turned off at compile time by adding + -DNO_CMD_DEFAULT to the CPPFLAGS. + - DOS support is not tested for EMX and therefore might not work. + - The UNIXROOT environment variable is supported to find /bin/sh + if it is not on the current drive. + + +COMPILATION OF GNU MAKE FOR OS/2: + +I. ***** SPECIAL OPTIONS ***** + + - At compile time you can turn off that cmd is used as default shell + (but only /bin/sh). Simply set CPPFLAGS="-DNO_CMD_DEFAULT" and make + will not use cmd unless you cause it to do so by setting MAKESHELL to + cmd or by specifying SHELL=cmd in your Makefile. + + - At compile time you can set CPPFLAGS="-DNO_CHDIR2" to turn off that + GNU make prints drive letters. This is necessary if you want to run + the testsuite. + + +II. ***** REQUIREMENTS FOR THE COMPILATION ***** + +A standard Unix like build environment: + + - sh compatible shell (ksh, bash, ash, but tested only with pdksh 5.2.14 + release 2) + If you use pdksh it is recommended to update to 5.2.14 release 2. Older + versions may not work! You can get this version at + http://www.math.ohio-state.edu/~ilya/software/os2/pdksh-5.2.14-bin-2.zip + - GNU file utilities (make sure that install.exe from the file utilities + is in front of your PATH before X:\OS2\INSTALL\INSTALL.EXE. I recommend + also to change the filename to ginstall.exe instead of install.exe + to avoid confusion with X:\OS2\INSTALL\INSTALL.EXE) + - GNU shell utilities + - GNU text utilities + - gawk + - grep + - sed + - GNU make 3.79.1 (special OS/2 patched version) or higher + - perl 5.005 or higher + - GNU texinfo (you can use 3.1 (gnuinfo.zip), but I recommend 4.0) + +If you want to recreate the configuration files (developers only!) +you need also: GNU m4 1.4, autoconf 2.59, automake 1.9.6 (or compatible) + + +III. ***** COMPILATION AND INSTALLATION ***** + + a) ** Developers only - Everyone else should skip this section ** + To recreate the configuration files use: + + export EMXSHELL=ksh + aclocal -I config + automake + autoconf + autoheader + + +b) Installation into x:/usr + + Note: Although it is possible to compile make using "./configure", + "make", "make install" this is not recommended. In particular, + you must ALWAYS use LDFLAGS="-Zstack 0x6000" because the default + stack size is far to small and make will not work properly! + +Recommended environment variables and installation options: + + export ac_executable_extensions=".exe" + export CPPFLAGS="-D__ST_MT_ERRNO__" + export CFLAGS="-O2 -Zomf -Zmt" + export LDFLAGS="-Zcrtdll -Zlinker /exepack:2 -Zlinker /pm:vio -Zstack 0x6000" + export RANLIB="echo" + ./configure --prefix=x:/usr --infodir=x:/usr/share/info --mandir=x:/usr/share/man --without-included-gettext + make AR=emxomfar + make install + +Note: If you use gcc 2.9.x I recommend to set also LIBS="-lgcc" + +Note: You can add -DNO_CMD_DEFAULT and -DNO_CHDIR2 to CPPFLAGS. + See section I. for details. + + +IV. ***** NLS support ***** + +GNU make has NLS (National Language Support), with the following +caveats: + + a) It will only work with GNU gettext, and + b) GNU gettext support is not included in the GNU make package. + +Therefore, if you wish to enable the internationalization features of +GNU make you must install GNU gettext on your system before configuring +GNU make. + +You can choose the languages to be installed. To install support for +English, German and French only enter: + + export LINGUAS="en de fr" + +If you don't specify LINGUAS all languages are installed. + +If you don't want NLS support (English only) use the option +--disable-nls for the configure script. Note if GNU gettext is not +installed then NLS will not be enabled regardless of this flag. + + +V. ***** Running the make test suite ***** + +To run the included make test suite you have to set + + CPPFLAGS="-D__ST_MT_ERRNO__ -DNO_CMD_DEFAULT -DNO_CHDIR2" + +before you compile make. This is due to some restrictions of the +testsuite itself. -DNO_CMD_DEFAULT causes make to use /bin/sh as default +shell in every case. Normally you could simply set MAKESHELL="/bin/sh" +to do this but the testsuite ignores the environment. -DNO_CHDIR2 causes +make not to use drive letters for directory names (i.e. _chdir2() and +_getcwd2() are NOT used). The testsuite interpretes the whole output of +make, especially statements like make[1]: Entering directory +'C:/somewhere/make-3.79.1/tests' where the testsuite does not expect the +drive letter. This would be interpreted as an error even if there is +none. + +To run the testsuite do the following: + + export CPPFLAGS="-D__ST_MT_ERRNO__ -DNO_CMD_DEFAULT -DNO_CHDIR2" + export CFLAGS="-Zomf -O2 -Zmt" + export LDFLAGS="-Zcrtdll -s -Zlinker /exepack:2 -Zlinker /pm:vio -Zstack 0x6000" + export RANLIB="echo" + ./configure --prefix=x:/usr --disable-nls + make AR=emxomfar + make check + +All tests should work fine with the exception of one of the "INCLUDE_DIRS" +tests which will fail if your /usr/include directory is on a drive different +from the make source tree. + + +------------------------------------------------------------------------------- +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 +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 . diff --git a/third_party/make/README.VMS b/third_party/make/README.VMS new file mode 100644 index 00000000000..5532b0184aa --- /dev/null +++ b/third_party/make/README.VMS @@ -0,0 +1,515 @@ +Overview: -*-text-mode-*- +--------- + + This version of GNU make has been tested on: + OpenVMS V8.3/V8.4 (Alpha) and V8.4 (Integrity) AND V7.3 (VAX) + + This version of GNU Make is intended to be run from DCL to run + make scripts with a special syntax that is described below. It + likely will not be able to run unmodified Unix makefiles. + + There is an older implementation of GNU Make that was ported to GNV. + Work is now in progress to merge that port to get a single version + of GNU Make available. When that merge is done, GNU Make will auto + detect that it is running under a Posix shell and then operate as close to + GNU Make on Unix as possible. + + The descriptions below are for running GNU make from DCL or equivalent. + +Recipe differences: +------------------- + + GNU Make for OpenVMS can not currently run native Unix make files because of + differences in the implementation. + + I am trying to document the current behavior in this section. This is based + on the information in the file NEWS. and running the test suite. + TODO: More tests are needed to validate and demonstrate the OpenVMS + expected behavior. + + In some cases the older behavior of GNU Make when run from DCL is not + compatible with standard makefile behavior. + + This behavior can be changed when running GNU Make from DCL by setting + either DCL symbols or logical names of the format GNV$. The settings + are enabled with a string starting with one of '1', 'T', or 'E' for "1", + "TRUE", or "ENABLE". They are disabled with a '0', 'F', or 'D' for "1", + "FALSE", or "DISABLE". If they are not explicitly set to one of these + values, then they will be set to their default values. + + The value of the setting DECC$FILENAME_UNIX_REPORT or + DECC$FILENAME_UNIX_ONLY will now cause the $(dir x) function to return + './' or '[]' as appropriate. + + The name GNV$MAKE_OLD_VMS when enabled will cause GNU Make to behave as + much as the older method as can be done with out disabling VMS features. + When it is disabled GNU Make have the new behavior which more closely + matches Unix Make behavior. + + The default is currently the old behavior when running GNU Make from DCL. + In the future this may change. When running make from GNV Bash the new + behavior is the default. + + This is a global setting that sets the default behavior for several other + options that can be individually changed. Many of the individual settings + are to make it so that the self tests for GNU Make need less VMS specific + modifications. + + The name GNV$MAKE_COMMA when enabled will cause GNU Make to expect a comma + for a path separator and use a comma for the separator for a list of files. + When disabled, it will cause GNU Make to use a colon for a path separator + and a space for the separator for a list of files. The default is to be + enabled if the GNU Make is set to the older behavior. + + The name GNV$MAKE_SHELL_SIM when enabled will cause GNU Make to try to + simulate a Posix shell more closely. The following behaviors occur: + + * Single quotes are converted to double quotes and any double + quotes inside of them are doubled. No environment variable expansion + is simulated. + * A exit command status will be converted to a Posix Exit + where 0 is success and non-zero is failure. + * The $ character will cause environment variable expansion. + * Environent variables can be set on the command line before a command. + + VMS generally uses logical name search lists instead of path variables + where the resolution is handled by VMS independent of the program. Which + means that it is likely that nothing will notice if the default path + specifier is changed in the future. + + Currently the built in VMS specific macros and recipes depend on the comma + being used as a file list separator. + TODO: Remove this dependency as other functions in GNU Make depend on a + space being used as a separator. + + The format for recipes are a combination of Unix macros, a subset of + simulated UNIX commands, some shell emulation, and OpenVMS commands. + This makes the resulting makefiles unique to the OpenVMS port of GNU make. + + If you are creating a OpenVMS specific makefile from scratch, you should also + look at MMK (Madgoat Make) available at https://github.com/endlesssoftware/mmk + MMK uses full OpenVMS syntax and a persistent subprocess is used for the + recipe lines, allowing multiple line rules. + + The default makefile search order is "makefile.vms", "gnumakefile", + "makefile". TODO: See if that lookup is case sensitive. + + When Make is invoked from DCL, it will create a foreign command + using the name of executable image, with any facility prefix removed, + for the duration of the make program, so it can be used internally + to recursively run make(). The macro MAKE_COMMAND will be set to + this foreign command. + + When make is launched from an exec*() command from a C program, + the foreign command is not created. The macro MAKE_COMMAND will be + set to the actual command passed as argv[0] to the exec*() function. + + If the DCL symbol or logical name GNV$MAKE_USE_MCR exists, then + the macro MAKE_COMMAND will be set to be an "MCR" command with the + absolute path used by DCL to launch make. The foreign command + will not be created. + + The macro MAKE is set to be the same value as the macro MAKE_COMMAND + on all platforms. + + Each recipe command is normally run as a separate spawned processes, + except for the cases documented below where a temporary DCL command + file may be used. + + BUG: Testing has shown that the commands in the temporary command files + are not always created properly. This issue is still under investigation. + + Any macros marked as exported are temporarily created as DCL symbols + for child images to use. DCL symbol substitution is not done with these + commands. + Untested: Symbol substitution. + + When a temporary DCL command file is used, DCL symbol substitution + will work. + + For VMS 7.3-1 and earlier, command lines are limited to 255 characters + or 1024 characters in a command file. + For VMS 7.3-2 and later, command lines are limited to 4059 characters + or 8192 characters in a command file. + + VMS limits each token of a command line to 256 characters, and limits + a command line to 127 tokens. + + Command lines above the limit length are written to a command file + in sys$scratch:. + + In order to handle Unix style extensions to VMS DCL, GNU Make has + parsed the recipe commands and them modified them as needed. The + parser has been re-written to resolve numerous bugs in handling + valid VMS syntax and potential buffer overruns. + + The new parser may need whitespace characters where DCL does not require + it, and also may require that quotes are matched were DCL forgives if + they are not. There is a small chance that existing VMS specific makefiles + will be affected. + + The '<', '>' was previously implemented using command files. Now + GNU Make will check to see if the is already a VMS "PIPE" command and + if it is not, will convert the command to a VMS "PIPE" command. + + The '>>' redirection has been implemented by using a temporary command file. + This will be described later. + + The DCL symbol or logical name GNV$MAKE_USE_CMD_FILE when set to a + string starting with one of '1','T', or 'E' for "1", "TRUE", or "ENABLE", + then temporary DCL command files are always used for running commands. + + Some recipe strings with embedded new lines will not be handled correctly + when a command file is used. + + GNU Make generally does text comparisons for the targets and sources. The + make program itself can handle either Unix or OpenVMS format filenames, but + normally does not do any conversions from one format to another. + TODO: The OpenVMS format syntax handling is incomplete. + TODO: ODS-5 EFS support is missing. + BUG: The internal routines to convert filenames to and from OpenVMS format + do not work correctly. + + Note: In the examples below, line continuations such as a backslash may have + been added to make the examples easier to read in this format. + BUG: That feature does not completely work at this time. + + Since the OpenVMS utilities generally expect OpenVMS format paths, you will + usually have to use OpenVMS format paths for rules and targets. + BUG: Relative OpenVMS paths may not work in targets, especially combined + with vpaths. This is because GNU make will just concatenate the directories + as it does on Unix. + + The variables $^ and $@ separate files with commas instead of spaces. + This is controlled by the name GNV$MAKE_COMMA as documented in the + previous section. + + While this may seem the natural thing to do with OpenVMS, it actually + causes problems when trying to use other make functions that expect the + files to be separated by spaces. If you run into this, you need the + following workaround to convert the output. + TODO: Look at have the $^ and $@ use spaces like on Unix and have + and easy to use function to do the conversions and have the built + in OpenVMS specific recipes and macros use it. + + Example: + +comma := , +empty := +space := $(empty) $(empty) + +foo: $(addsuffix .3,$(subs $(comma),$(space),$^) + + + Makefile variables are looked up in the current environment. You can set + symbols or logicals in DCL and evaluate them in the Makefile via + $(). Variables defined in the Makefile + override OpenVMS symbols/logicals. + + OpenVMS logical and symbols names show up as "environment" using the + origin function. when the "-e" option is specified, the origion function + shows them as "environment override". On Posix the test scripts indicate + that they should show up just as "environment". + + When GNU make reads in a symbol or logical name into the environment, it + converts any dollar signs found to double dollar signs for convenience in + using DCL symbols and logical names in recipes. When GNU make exports a + DCL symbol for a child process, if the first dollar sign found is followed + by second dollar sign, then all double dollar signs will be convirted to + single dollar signs. + + The variable $(ARCH) is predefined as IA64, ALPHA or VAX respectively. + Makefiles for different OpenVMS systems can now be written by checking + $(ARCH). Since IA64 and ALPHA are similar, usually just a check for + VAX or not VAX is sufficient. + + You may have to update makefiles that assume VAX if not ALPHA. + +ifeq ($(ARCH),VAX) + $(ECHO) "On the VAX" +else + $(ECHO) "On the ALPHA or IA64" +endif + + Empty commands are handled correctly and don't end in a new DCL process. + + The exit command needs to have OpenVMS exit codes. To pass a Posix code + back to the make script, you need to encode it by multiplying it by 8 + and then adding %x1035a002 for a failure code and %x1035a001 for a + success. Make will interpret any posix code other than 0 as a failure. + TODO: Add an option have simulate Posix exit commands in recipes. + + Lexical functions can be used in pipes to simulate shell file test rules. + + Example: + + Posix: +b : c ; [ -f $@ ] || echo >> $@ + + OpenVMS: +b : c ; if f$$search("$@") then pipe open/append xx $@ ; write xx "" ; close xx + + + You can also use pipes and turning messages off to silently test for a + failure. + +x = %x1035a00a + +%.b : %.c +pipe set mess/nofac/noiden/nosev/notext ; type $^/output=$@ || exit $(x) + + +Runtime issues: + + The OpenVMS C Runtime has a convention for encoding a Posix exit status into + to OpenVMS exit codes. These status codes will have the hex value of + 0x35a000. OpenVMS exit code may also have a hex value of %x10000000 set on + them. This is a flag to tell DCL not to write out the exit code. + + To convert an OpenVMS encoded Posix exit status code to the original code + You subtract %x35a000 and any flags from the OpenVMS code and divide it by 8. + + WARNING: Backward-incompatibility! + The make program exit now returns the same encoded Posix exit code as on + Unix. Previous versions returned the OpenVMS exit status code if that is what + caused the recipe to fail. + TODO: Provide a way for scripts calling make to obtain that OpenVMS status + code. + + Make internally has two error codes, MAKE_FAILURE and MAKE_TROUBLE. These + will have the error "-E-" severity set on exit. + + MAKE_TROUBLE is returned only if the option "-q" or "--question" is used and + has a Posix value of 1 and an OpenVMS status of %x1035a00a. + + MAKE_FAILURE has a Posix value of 2 and an OpenVMS status of %x1035a012. + + Output from GNU make may have single quotes around some values where on + other platforms it does not. Also output that would be in double quotes + on some platforms may show up as single quotes on VMS. + + There may be extra blank lines in the output on VMS. + https://savannah.gnu.org/bugs/?func=detailitem&item_id=41760 + + There may be a "Waiting for unfinished jobs..." show up in the output. + + Error messages generated by Make or Unix utilities may slightly vary from + Posix platforms. Typically the case may be different. + + When make deletes files, on posix platforms it writes out 'rm' and the list + of files. On VMS, only the files are writen out, one per line. + TODO: VMS + + There may be extra leading white space or additional or missing whitespace + in the output of recipes. + + GNU Make uses sys$scratch: for the tempfiles that it creates. + + The OpenVMS CRTL library maps /tmp to sys$scratch if the TMP: logical name + does not exist. As the CRTL may use both sys$scratch: and /tmp internally, + if you define the TMP logical name to be different than SYS$SCRATCH:, + you may end up with only some temporary files in TMP: and some in SYS$SCRATCH: + + The default include directory for including other makefiles is + SYS$SYSROOT:[SYSLIB] (I don't remember why I didn't just use + SYS$LIBRARY: instead; maybe it wouldn't work that way). + TODO: A better default may be desired. + + If the device for a file in a recipe does not exist, on OpenVMS an error + message of "stat: : no such device or address" will be output. + + Make ignores success, informational, or warning errors (-S-, -I-, or + -W-). But it will stop on -E- and -F- errors. (unless you do something + to override this in your makefile, or whatever). + + +Unix compatibilty features: +--------------------------- + + If the command 'echo' is seen, any single quotes on the line will be + converted to double quotes. + + The variable $(CD) is implemented as a built in Change Directory + command. This invokes the 'builtin_cd' Executing a 'set default' + recipe doesn't do the trick, since it only affects the subprocess + spawned for that command. + + The 'builtin_cd' is generally expected to be on its own line. + The 'builtin_cd' either from the expansion of $(CD) or directly + put in a recipe line will be executed before any other commands in + that recipe line. DCL parameter substitution will not work for the + 'builtin_cd' command. + + Putting a 'builtin_cd' in a pipeline or an IF-THEN line should not be + done because the 'builtin_cd' is always executed + and executed first. The directory change is persistent. + + Unix shell style I/O redirection is supported. You can now write lines like: + "mcr sys$disk:[]program.exe < input.txt > output.txt &> error.txt" + + Posix shells have ":" as a null command. These are now handled. + https://savannah.gnu.org/bugs/index.php?41761 + + A note on appending the redirected output. A simple mechanism is + implemented to make ">>" work in action lines. In OpenVMS there is no simple + feature like ">>" to have DCL command or program output redirected and + appended to a file. GNU make for OpenVMS implements the redirection + of ">>" by using a command procedure. + + The current algorithm creates the output file if it does not exist and + then uses the DCL open/append to extend it. SYS$OUTPUT is then directed + to that file. + + The implementation supports only one redirected append output to a file + and that redirection is done before any other commands in that line + are executed, so it redirects all output for that command. + + The older implementation wrote the output to a temporary file in + in sys$scratch: and then attempted to append the file to the existing file. + The temporary file names looked like "CMDxxxxx.". Any time the created + command procedure can not complete, this happens. Pressing Ctrl+Y to + abort make is one case. + + In case of Ctrl+Y the associated command procedure is left in SYS$SCRATCH:. + The command procedures will be named gnv$make_cmd*.com. + + The CtrlY handler now uses $delprc to delete all children. This way also + actions with DCL commands will be stopped. As before the CtrlY handler + then sends SIGQUIT to itself, which is handled in common code. + + Temporary command files are now deleted in the OpenVMS child termination + handler. That deletes them even if a Ctrl+C was pressed. + TODO: Does the previous section about >> leaving files still apply? + + The behavior of pressing Ctrl+C is not changed. It still has only an effect, + after the current action is terminated. If that doesn't happen or takes too + long, Ctrl+Y should be used instead. + + +Build Options: + + Added support to have case sensitive targets and dependencies but to + still use case blind file names. This is especially useful for Java + makefiles on VMS: + +.SUFFIXES : +.SUFFIXES : .class .java +.java.class : +javac "$<" +HelloWorld.class : HelloWorld.java + + A new macro WANT_CASE_SENSITIVE_TARGETS in config.h-vms was introduced. + It needs to be enabled to get this feature; default is disabled. + TODO: This should be a run-time setting based on if the process + has been set to case sensitive. + + +Unimplemented functionality: + + The new feature "Loadable objects" is not yet supported. If you need it, + please send a change request or submit a bug report. + + The new option --output-sync (-O) is accepted but has no effect: GNU make + for OpenVMS does not support running multiple commands simultaneously. + + +Self test failures and todos: +----------------------------- + + The test harness can not handle testing some of the VMS specific modes + because of the features needed for to be set for the Perl to run. + Need to find a way to set the VMS features before running make as a + child. + + GNU make was not currently translating the OpenVMS encoded POSIX values + returned to it back to the Posix values. I have temporarily modified the + Perl test script to compensate for it. This should be being handled + internally to Make. + TODO: Verify and update the Perl test script. + + The features/parallelism test was failing. OpenVMS is executing the rules + in sequence not in parallel as this feature was not implemented. + GNU Make on VMS no longer claims it is implemented. + TODO: Implement it. + + Symlink support is not present. Symlinks are supported by OpenVMS 8.3 and + later. + + Error messages should be supressed with the "-" at the beginning of a line. + On openVMS they were showing up. TODO: Is this still an issue? + + The internal vmsify and unixify OpenVMS to/from UNIX are not handling logical + names correctly. + + +Build instructions: +------------------ + + Don't use the HP C V7.2-001 compiler, which has an incompatible change + how __STDC__ is defined. This results at least in compile time warnings. + +Make a 1st version + $ @makefile.com ! ignore any compiler and/or linker warning + $ copy make.exe 1st-make.exe + + Use the 1st version to generate a 2nd version as a test. + $ mc sys$disk:[]1st-make clean ! ignore any file not found messages + $ mc sys$disk:[]1st-make + + Verify your 2nd version by building Make again. + $ copy make.exe 2nd-make.exe + $ mc sys$disk:[]2nd-make clean + $ mc sys$disk:[]2nd-make + + +Running the tests: +------------------ + + Running the tests on OpenVMS requires the following software to be installed + as most of the tests are Unix oriented. + + * Perl 5.18 or later. + https://sourceforge.net/projects/vmsperlkit/files/ + * GNV 2.1.3 + Updates including a minimum of: + * Bash 4.3.30 + * ld_tools 3.0.2 + * coreutils 8.21 + https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/ + https://sourceforge.net/projects/gnv/files/ + + As the test scripts need to create some foreign commands that persist + after the test is run, it is recommend that either you use a subprocess or + a dedicated login to run the tests. + + To get detailed information for running the tests: + + $ set default [.tests] + $ @run_make_tests help + + Running the script with no parameters will run all the tests. + + After the the test script has been run once in a session, assuming + that you built make in sys$disk:[make], you can redefined the + "bin" logical name as follows: + + $ define bin sys$disk:[make],gnv$gnu:[bin] + + Then you can use Perl to run the scripts. + + $ perl run_make_tests.pl + + +Acknowlegements: +---------------- + +See NEWS. for details of past changes. + + These are the currently known contributers to this port. + + Hartmut Becker + John Malmberg + Michael Gehre + John Eisenbraun + Klaus Kaempf + Mike Moretti + John W. Eaton diff --git a/third_party/make/README.W32 b/third_party/make/README.W32 new file mode 100644 index 00000000000..fe88a771918 --- /dev/null +++ b/third_party/make/README.W32 @@ -0,0 +1,361 @@ +This version of GNU make has been tested on: + Microsoft Windows 2000/XP/2003/Vista/7/8/10 +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, 2005, 2008, 2010, 2012, +2013, and 2015 as well as with .NET 7.x and .NET 2003. + +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/ + +The libraries on which Guile depends can vary depending on your +version and build of Guile. At the very least, the Boehm's GC library +will be needed, and typically also GNU MP, libffi, libunistring, and +libtool's libltdl. Whoever built the port of Guile you have should +also provide you with these dependencies or a URL where to download +them. A precompiled 32-bit Windows build of Guile is available from +the ezwinports site mentioned above. + +The Windows port of GNU make is maintained jointly by various people. +It was originally made by Rob Tulloh. +It is currently maintained by Eli Zaretskii. + + +Do this first, regardless of the build method you choose: +--------------------------------------------------------- + + 1. Edit config.h.W32 to your liking (especially the few shell-related + defines near the end, or HAVE_CASE_INSENSITIVE_FS which corresponds + to './configure --enable-case-insensitive-file-system'). (We don't + recommend to define HAVE_CASE_INSENSITIVE_FS, but you may wish to + consider that if you have a lot of files whose names are in upper + case, while Makefile rules are written for lower-case versions.) + + +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 + + This produces gnumake.exe in the GccRel directory. + + If you want a version of GNU make built with debugging enabled, + 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 + + +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. + + If you want a 32bit version of GNU make, add the --x86 option. + + If you want a Debug build of GNU make, add the --debug option. Output + will go into the .\WinDebug directory. + + 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 GccRel\gnumake.exe. + If you want a version of GNU make built with debugging enabled, + add the TARGET_TYPE=debug option: + + make -f Basic.mk TOOLCHAIN=gcc TARGET_TYPE=debug + + The makefile doesn't support Guile integration. Use build_w32.bat + if you want to build with Guile support. + + +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 + + I've found 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. + + + +------------------- +-- Notes/Caveats -- +------------------- + +GNU make on Windows 32-bit platforms: + + This version of make is ported natively to Windows32 platforms + (Windows NT 3.51, Windows NT 4.0, Windows 2000, Windows XP, + Windows 95, and Windows 98). It does not rely on any 3rd party + software or add-on packages for building. The only thing + needed is a Windows compiler. Two compilers supported + officially are the MinGW port of GNU GCC, and the various + versions of the Microsoft C compiler. + + Do not confuse this port of GNU make with other Windows32 projects + which provide a GNU make binary. These are separate projects + and are not connected to this port effort. + +GNU make and sh.exe: + + This port prefers if you have a working sh.exe somewhere on + your system. If you don't have sh.exe, the port falls back to + MSDOS mode for launching programs (via a batch file). The + MSDOS mode style execution has not been tested that carefully + though (The author uses GNU bash as sh.exe). + + There are very few true ports of Bourne shell for NT right now. + There is a version of GNU bash available from Cygnus "Cygwin" + porting effort (http://www.cygwin.com/). + Other possibilities are the MKS version of sh.exe, or building + your own with a package like NutCracker (DataFocus) or Portage + (Consensys). Also MinGW includes sh (http://mingw.org/). + +GNU make and brain-dead shells (BATCH_MODE_ONLY_SHELL): + + Some versions of Bourne shell do not behave well when invoked + as 'sh -c' from CreateProcess(). The main problem is they seem + to have a hard time handling quoted strings correctly. This can + be circumvented by writing commands to be executed to a batch + file and then executing the command by calling 'sh file'. + + To work around this difficulty, this version of make supports + a batch mode. When BATCH_MODE_ONLY_SHELL is defined at compile + time, make forces all command lines to be executed via script + files instead of by command line. In this mode you must have a + working sh.exe in order to use parallel builds (-j). + + A native Windows32 system with no Bourne shell will also run + in batch mode. All command lines will be put into batch files + and executed via $(COMSPEC) (%COMSPEC%). However, parallel + builds ARE supported with Windows shells (cmd.exe and + command.com). See the next section about some peculiarities + of parallel builds on Windows. + +Support for parallel builds + + 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: + + Good news! Make now has native support for Cygwin sh. To enable, + define the HAVE_CYGWIN_SHELL in config.h and rebuild make + from scratch. This version of make tested with B20.1 of Cygwin. + Do not define BATCH_MODE_ONLY_SHELL if you use HAVE_CYGWIN_SHELL. + +GNU make and the MKS shell: + + There is now semi-official support for the MKS shell. To turn this + support on, define HAVE_MKS_SHELL in the config.h.W32 before you + build make. Do not define BATCH_MODE_ONLY_SHELL if you turn + on HAVE_MKS_SHELL. + +GNU make handling of drive letters in pathnames (PATH, vpath, VPATH): + + There is a caveat that should be noted with respect to handling + single character pathnames on Windows systems. When colon is + used in PATH variables, make tries to be smart about knowing when + you are using colon as a separator versus colon as a drive + letter. Unfortunately, something as simple as the string 'x:/' + could be interpreted 2 ways: (x and /) or (x:/). + + Make chooses to interpret a letter plus colon (e.g. x:/) as a + drive letter pathname. If it is necessary to use single + character directories in paths (VPATH, vpath, Path, PATH), the + user must do one of two things: + + a. Use semicolon as the separator to disambiguate colon. For + example use 'x;/' if you want to say 'x' and '/' are + separate components. + + b. Qualify the directory name so that there is more than + one character in the path(s) used. For example, none + of these settings are ambiguous: + + ./x:./y + /some/path/x:/some/path/y + x:/some/path/x:x:/some/path/y + + Please note that you are free to mix colon and semi-colon in the + specification of paths. Make is able to figure out the intended + result and convert the paths internally to the format needed + when interacting with the operating system, providing the path + is not within quotes, e.g. "x:/test/test.c". + + You are encouraged to use colon as the separator character. + This should ease the pain of deciding how to handle various path + problems which exist between platforms. If colon is used on + both Unix and Windows systems, then no ifdef'ing will be + necessary in the makefile source. + +Pathnames and white space: + + Unlike Unix, Windows 95/NT systems encourage pathnames which + contain white space (e.g. C:\Program Files\). These sorts of + pathnames are valid on Unix too, but are never encouraged. + There is at least one place in make (VPATH/vpath handling) where + paths containing white space will simply not work. There may be + others too. I chose to not try and port make in such a way so + that these sorts of paths could be handled. I offer these + suggestions as workarounds: + + 1. Use 8.3 notation. i.e. "x:/long~1/", which is actually + "x:\longpathtest". Type "dir /x" to view these filenames + within the cmd.exe shell. + 2. Rename the directory so it does not contain white space. + + If you are unhappy with this choice, this is free software + and you are free to take a crack at making this work. The code + in w32/pathstuff.c and vpath.c would be the places to start. + +Pathnames and Case insensitivity: + + Unlike Unix, Windows 95/NT systems are case insensitive but case + preserving. For example if you tell the file system to create a + file named "Target", it will preserve the case. Subsequent access to + the file with other case permutations will succeed (i.e. opening a + file named "target" or "TARGET" will open the file "Target"). + + By default, GNU make retains its case sensitivity when comparing + target names and existing files or directories. It can be + configured, however, into a case preserving and case insensitive + mode by adding a define for HAVE_CASE_INSENSITIVE_FS to + config.h.W32. + + For example, the following makefile will create a file named + Target in the directory subdir which will subsequently be used + to satisfy the dependency of SUBDIR/DepTarget on SubDir/TARGET. + Without HAVE_CASE_INSENSITIVE_FS configured, the dependency link + will not be made: + + subdir/Target: + touch $@ + + SUBDIR/DepTarget: SubDir/TARGET + cp $^ $@ + + Reliance on this behavior also eliminates the ability of GNU make + to use case in comparison of matching rules. For example, it is + not possible to set up a C++ rule using %.C that is different + than a C rule using %.c. GNU make will consider these to be the + same rule and will issue a warning. + +SAMBA/NTFS/VFAT: + + I have not had any success building the debug version of this + package using SAMBA as my file server. The reason seems to be + related to the way VC++ 4.0 changes the case name of the pdb + filename it is passed on the command line. It seems to change + the name always to to lower case. I contend that the VC++ + compiler should not change the casename of files that are passed + as arguments on the command line. I don't think this was a + problem in MSVC 2.x, but I know it is a problem in MSVC 4.x. + + The package builds fine on VFAT and NTFS filesystems. + + Most all of the development I have done to date has been using + NTFS and long file names. I have not done any considerable work + under VFAT. VFAT users may wish to be aware that this port of + make does respect case sensitivity. + +FAT: + + Version 3.76 added support for FAT filesystems. Make works + around some difficulties with stat'ing of files and caching of + filenames and directories internally. + +Bug reports: + + Please submit bugs via the normal bug reporting mechanism which + is described in the GNU make manual and the base README. + +------------------------------------------------------------------------------- +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 . diff --git a/third_party/make/README.cosmo b/third_party/make/README.cosmo new file mode 100644 index 00000000000..98b17b9dbeb --- /dev/null +++ b/third_party/make/README.cosmo @@ -0,0 +1,4 @@ +ORIGIN + + GNU Make 4.3 + http://ftp.gnu.org/gnu/make/make-4.3.tar.gz diff --git a/third_party/make/README.customs b/third_party/make/README.customs new file mode 100644 index 00000000000..a62e003bd68 --- /dev/null +++ b/third_party/make/README.customs @@ -0,0 +1,112 @@ + -*-indented-text-*- + +GNU make can utilize the Customs library, distributed with Pmake, to +provide builds distributed across multiple hosts. + +In order to utilize this capability, you must first download and build +the Customs library. It is contained in the Pmake distribution, which +can be obtained at: + + ftp://ftp.icsi.berkeley.edu/pub/ai/stolcke/software/ + +This integration was tested (superficially) with Pmake 2.1.33. + + +BUILDING CUSTOMS +---------------- + +First, build pmake and Customs. You need to build pmake first, because +Customs require pmake to build. Unfortunately, this is not trivial; +please see the pmake and Customs documentation for details. The best +place to look for instructions is in the pmake-2.1.33/INSTALL file. + +Note that the 2.1.33 Pmake distribution comes with a set of patches to +GNU make, distributed in the pmake-2.1.33/etc/gnumake/ directory. These +patches are based on GNU make 3.75 (there are patches for earlier +versions of GNU make, also). The parts of this patchfile which relate +directly to Customs support have already been incorporated into this +version of GNU make, so you should _NOT_ apply the patch file. + +However, there are a few non-Customs specific (as far as I could tell) +changes here which are not incorporated (for example, the modification +to try expanding -lfoo to libfoo.so). If you rely on these changes +you'll need to re-apply them by hand. + +Install the Customs library and header files according to the +documentation. You should also install the man pages (contrary to +comments in the documentation, they weren't installed automatically for +me; I had to cd to the 'pmake-2.1.33/doc' directory and run 'pmake +install' there directly). + + +BUILDING GNU MAKE +----------------- + +Once you've installed Customs, you can build GNU make to use it. When +configuring GNU make, merely use the '--with-customs=DIR' option. +Provide the directory containing the 'lib' and 'include/customs' +subdirectories as DIR. For example, if you installed the customs +library in /usr/local/lib and the headers in /usr/local/include/customs, +then you'd pass '--with-customs=/usr/local' as an option to configure. + +Run make (or use build.sh) normally to build GNU make as described in +the INSTALL file. + +See the documentation for Customs for information on starting and +configuring Customs. + + +INVOKING CUSTOMS-IZED GNU MAKE +----------------------------- + +One thing you should be aware of is that the default build environment +for Customs requires root permissions. Practically, this means that GNU +make must be installed setuid root to use Customs. + +If you don't want to do this, you can build Customs such that root +permissions are not necessary. Andreas Stolcke +writes: + + > pmake, gnumake or any other customs client program is not required to + > be suid root if customs was compiled WITHOUT the USE_RESERVED_PORTS + > option in customs/config.h. Make sure the "customs" service in + > /etc/services is defined accordingly (port 8231 instead of 1001). + + > Not using USE_RESERVED_PORTS means that a user with programming + > skills could impersonate another user by writing a fake customs + > client that pretends to be someone other than himself. See the + > discussion in etc/SECURITY. + + +PROBLEMS +-------- + +SunOS 4.1.x: + The customs/sprite.h header file #includes the header + files; this conflicts with GNU make's configuration so you'll get a + compile error if you use GCC (or any other ANSI-capable C compiler). + + I commented out the #include in sprite.h:107: + + #if defined(sun) || defined(ultrix) || defined(hpux) || defined(sgi) + /* #include */ + #else + + YMMV. + + +------------------------------------------------------------------------------- +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 +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 . diff --git a/third_party/make/SCOPTIONS b/third_party/make/SCOPTIONS new file mode 100644 index 00000000000..758f82f93ec --- /dev/null +++ b/third_party/make/SCOPTIONS @@ -0,0 +1,13 @@ +ERRORREXX +OPTIMIZE +NOVERSION +OPTIMIZERTIME +OPTIMIZERALIAS +DEFINE HAVE_CONFIG_H +DEFINE INCLUDEDIR="include:" +DEFINE LIBDIR="lib:" +DEFINE NO_ALLOCA +DEFINE NO_ARCHIVES +IGNORE=161 +IGNORE=100 +STARTUP=cres diff --git a/third_party/make/aclocal.m4 b/third_party/make/aclocal.m4 new file mode 100644 index 00000000000..32969478d60 --- /dev/null +++ b/third_party/make/aclocal.m4 @@ -0,0 +1,1493 @@ +# generated automatically by aclocal 1.16.1 -*- Autoconf -*- + +# 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, +# 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. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +dnl serial 11 (pkg-config-0.29.1) +dnl +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.1]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[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. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +# 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, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# 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.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.16.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_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.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]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# 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, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# 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, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# 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. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# 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], +[{ + # 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. + # 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 + # 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. + 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. + 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 + + +# 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. +# 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" MAKE="${MAKE-make}"])]) + + +# 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, +# with or without modifications, as long as this notice is preserved. + +AC_DEFUN([AM_WITH_DMALLOC], +[AC_MSG_CHECKING([if malloc debugging is wanted]) +AC_ARG_WITH([dmalloc], +[AS_HELP_STRING([--with-dmalloc], + [use dmalloc, as in http://www.dmalloc.com])], +[if test "$withval" = yes; then + AC_MSG_RESULT([yes]) + AC_DEFINE([WITH_DMALLOC], [1], + [Define if using the dmalloc debugging malloc package]) + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + AC_MSG_RESULT([no]) +fi], [AC_MSG_RESULT([no])]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# 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, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +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: +# +# +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. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'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: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# 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, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# 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, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# 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, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# 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], +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# 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-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_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# 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, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# 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_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # 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__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# 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, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# 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, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# 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, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# 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, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# 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, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# 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, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +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/third_party/make/build-aux/compile b/third_party/make/build-aux/compile new file mode 100755 index 00000000000..99e50524b3b --- /dev/null +++ b/third_party/make/build-aux/compile @@ -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 . +# +# 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 . + +# 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 or send patches to +# . + +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 . +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/third_party/make/build-aux/config.guess b/third_party/make/build-aux/config.guess new file mode 100755 index 00000000000..95b16c7747a --- /dev/null +++ b/third_party/make/build-aux/config.guess @@ -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 . +# +# 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 . + + +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 ." + +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 + #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 /* 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 + + 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 + #include + + 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 + 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' /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 + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # 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" < +#include +#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 +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#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 + 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 +#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 <&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/third_party/make/build-aux/config.rpath b/third_party/make/build-aux/config.rpath new file mode 100755 index 00000000000..b625621fac4 --- /dev/null +++ b/third_party/make/build-aux/config.rpath @@ -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 , 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=/' <. +# +# 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 . +# +# 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 ." + +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 <&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 <&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/third_party/make/build-aux/depcomp b/third_party/make/build-aux/depcomp new file mode 100755 index 00000000000..3f273877f92 --- /dev/null +++ b/third_party/make/build-aux/depcomp @@ -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 . + +# 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 . + +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 . +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/third_party/make/build-aux/install-sh b/third_party/make/build-aux/install-sh new file mode 100755 index 00000000000..20d8b2eaea9 --- /dev/null +++ b/third_party/make/build-aux/install-sh @@ -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/third_party/make/build-aux/mdate-sh b/third_party/make/build-aux/mdate-sh new file mode 100755 index 00000000000..79687f7bf43 --- /dev/null +++ b/third_party/make/build-aux/mdate-sh @@ -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 , 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 . + +# 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 or send patches to +# . + +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 . +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/third_party/make/build-aux/missing b/third_party/make/build-aux/missing new file mode 100755 index 00000000000..625aeb11897 --- /dev/null +++ b/third_party/make/build-aux/missing @@ -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 , 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 . + +# 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 ." + 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/third_party/make/build-aux/texinfo.tex b/third_party/make/build-aux/texinfo.tex new file mode 100644 index 00000000000..1ea515b2ae4 --- /dev/null +++ b/third_party/make/build-aux/texinfo.tex @@ -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 . +% +% 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} + +% 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 `\^^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 . + % + \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 . +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 to achieve this: TeX expands \the only once, + % simply yielding the contents of . (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 + \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{...} +% If we want to allow any 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'{'#1'}'{#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\ }} + +\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 +% 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% + %@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/third_party/make/build.cfg.in b/third_party/make/build.cfg.in new file mode 100644 index 00000000000..80ce9b45afa --- /dev/null +++ b/third_party/make/build.cfg.in @@ -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 . + +# 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/third_party/make/build.sh b/third_party/make/build.sh new file mode 100755 index 00000000000..4c88b53473a --- /dev/null +++ b/third_party/make/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 . + +# 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/third_party/make/build_w32.bat b/third_party/make/build_w32.bat new file mode 100755 index 00000000000..553e9d9ce7a --- /dev/null +++ b/third_party/make/build_w32.bat @@ -0,0 +1,402 @@ +@echo off +:: 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 . + +setlocal +if not "%RECURSEME%"=="%~0" ( + set "RECURSEME=%~0" + %ComSpec% /s /c ""%~0" %*" + goto :EOF +) + +call :Reset + +if "%1" == "-h" goto Usage +if "%1" == "--help" goto Usage + +echo. +echo Creating GNU Make for Windows 9X/NT/2K/XP/Vista/7/8/10 +echo. + +set MAKE=gnumake +set GUILE=Y +set COMPILER=cl.exe +set O=obj +set ARCH=x64 +set DEBUG=N + +if exist maintMakefile ( + set MAINT=Y +) else ( + set MAINT=N +) + +:ParseSW +if "%1" == "--debug" goto SetDebug +if "%1" == "--without-guile" goto NoGuile +if "%1" == "--x86" goto Set32Bit +if "%1" == "gcc" goto SetCC +if "%1" == "" goto DoneSW +goto Usage + +:SetDebug +set DEBUG=Y +echo - Building without compiler optimizations +shift +goto ParseSW + +:NoGuile +set GUILE=N +echo - Building without Guile +shift +goto ParseSW + +:Set32Bit +set ARCH=x86 +echo - Building 32bit GNU Make +shift +goto ParseSW + +:SetCC +set COMPILER=gcc +set O=o +echo - Building with GCC +shift +goto ParseSW + +:DoneSW +if "%MAINT%" == "Y" echo - Enabling maintainer mode + +if "%COMPILER%" == "gcc" goto FindGcc + +:: Find a compiler. Visual Studio requires a lot of effort to locate :-/. +%COMPILER% >nul 2>&1 +if not ERRORLEVEL 1 goto FoundMSVC + +:: Visual Studio 17 and above provides the "vswhere" tool +call :FindVswhere +if ERRORLEVEL 1 goto LegacyVS + +for /f "tokens=* usebackq" %%i in (`%VSWHERE% -latest -property installationPath`) do ( + set InstallPath=%%i +) +set "VSVARS=%InstallPath%\VC\Auxiliary\Build\vcvarsall.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +:: No "vswhere" or it can't find a compiler. Go old-school. +:LegacyVS +set "VSVARS=%VS150COMNTOOLS%\..\..\VC\vcvarsall.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%VS120COMNTOOLS%\..\..\VC\vcvarsall.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%VS110COMNTOOLS%\..\..\VC\vcvarsall.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%VS80COMNTOOLS%\..\..\VC\vcvarsall.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%VS71COMNTOOLS%\..\..\VC\vcvarsall.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%VS70COMNTOOLS%\..\..\VC\vcvarsall.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%V6TOOLS%\VC98\Bin\vcvars32.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%V6TOOLS%\VC97\Bin\vcvars32.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +set "VSVARS=%V5TOOLS%\VC\Bin\vcvars32.bat" +call :CheckMSVC +if not ERRORLEVEL 1 goto FoundMSVC + +:: We did not find anything--fail +echo No MSVC compiler available. +echo Please run vcvarsall.bat and/or configure your Path. +exit 1 + +:FoundMSVC +set OUTDIR=.\WinRel +set LNKOUT=./WinRel +set "OPTS=/O2 /D NDEBUG" +set LINKOPTS= +if "%DEBUG%" == "Y" set OUTDIR=.\WinDebug +if "%DEBUG%" == "Y" set LNKOUT=./WinDebug +if "%DEBUG%" == "Y" set "OPTS=/Zi /Od /D _DEBUG" +if "%DEBUG%" == "Y" set LINKOPTS=/DEBUG +if "%MAINT%" == "Y" set "OPTS=%OPTS% /D MAKE_MAINTAINER_MODE" +:: Show the compiler version that we found +:: Unfortunately this also shows a "usage" note; I can't find anything better. +echo. +%COMPILER% +goto Build + +:FindGcc +set OUTDIR=.\GccRel +set LNKOUT=./GccRel +set OPTS=-O2 +if "%DEBUG%" == "Y" set OPTS=-O0 +if "%DEBUG%" == "Y" set OUTDIR=.\GccDebug +if "%DEBUG%" == "Y" set LNKOUT=./GccDebug +if "%MAINT%" == "Y" set "OPTS=%OPTS% -DMAKE_MAINTAINER_MODE" +:: Show the compiler version that we found +echo. +%COMPILER% --version +if not ERRORLEVEL 1 goto Build +echo No %COMPILER% found. +exit 1 + +:Build +:: Clean the directory if it exists +if exist %OUTDIR%\nul rmdir /S /Q %OUTDIR% + +:: Recreate it +mkdir %OUTDIR% +mkdir %OUTDIR%\src +mkdir %OUTDIR%\src\w32 +mkdir %OUTDIR%\src\w32\compat +mkdir %OUTDIR%\src\w32\subproc +mkdir %OUTDIR%\lib + +if "%GUILE%" == "Y" call :ChkGuile + +echo. +echo Compiling %OUTDIR% version + +if exist src\config.h.W32.template call :ConfigSCM +copy src\config.h.W32 %OUTDIR%\src\config.h + +copy lib\glob.in.h %OUTDIR%\lib\glob.h +copy lib\fnmatch.in.h %OUTDIR%\lib\fnmatch.h + +if exist %OUTDIR%\link.sc del %OUTDIR%\link.sc + +call :Compile src/ar +call :Compile src/arscan +call :Compile src/commands +call :Compile src/default +call :Compile src/dir +call :Compile src/expand +call :Compile src/file +call :Compile src/function +call :Compile src/getopt +call :Compile src/getopt1 +call :Compile src/guile GUILE +call :Compile src/hash +call :Compile src/implicit +call :Compile src/job +call :Compile src/load +call :Compile src/loadapi +call :Compile src/main GUILE +call :Compile src/misc +call :Compile src/output +call :Compile src/read +call :Compile src/remake +call :Compile src/remote-stub +call :Compile src/rule +call :Compile src/signame +call :Compile src/strcache +call :Compile src/variable +call :Compile src/version +call :Compile src/vpath +call :Compile src/w32/pathstuff +call :Compile src/w32/w32os +call :Compile src/w32/compat/posixfcn +call :Compile src/w32/subproc/misc +call :Compile src/w32/subproc/sub_proc +call :Compile src/w32/subproc/w32err +call :Compile lib/fnmatch +call :Compile lib/glob +call :Compile lib/getloadavg + +if not "%COMPILER%" == "gcc" call :Compile src\w32\compat\dirent + +call :Link + +echo. +if exist %OUTDIR%\%MAKE%.exe goto Success +echo %OUTDIR% build FAILED! +exit 1 + +:Success +echo %OUTDIR% build succeeded. +if exist Basic.mk copy /Y Basic.mk Makefile +if not exist tests\config-flags.pm copy /Y tests\config-flags.pm.W32 tests\config-flags.pm +call :Reset +goto :EOF + +:: +:: Subroutines +:: + +:Compile +echo %LNKOUT%/%1.%O% >>%OUTDIR%\link.sc +set EXTRAS= +if "%2" == "GUILE" set "EXTRAS=%GUILECFLAGS%" +if exist "%OUTDIR%\%1.%O%" del "%OUTDIR%\%1.%O%" +if "%COMPILER%" == "gcc" goto GccCompile + +:: MSVC Compile +echo on +%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 +@echo off +goto CompileDone + +:GccCompile +:: GCC Compile +echo on +%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 +@echo off + +:CompileDone +if not exist "%OUTDIR%\%1.%O%" exit 1 +goto :EOF + +:Link +echo. +echo Linking %LNKOUT%/%MAKE%.exe +if "%COMPILER%" == "gcc" goto GccLink + +:: MSVC Link +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 +echo on +link.exe /NOLOGO /SUBSYSTEM:console /PDB:%LNKOUT%\%MAKE%.pdb %LINKOPTS% /OUT:%LNKOUT%\%MAKE%.exe @%LNKOUT%\link.sc +@echo off +goto :EOF + +:GccLink +:: GCC Link +echo on +echo %GUILELIBS% -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 >>%OUTDIR%\link.sc +%COMPILER% -mthreads -gdwarf-2 -g3 %OPTS% -o %LNKOUT%/%MAKE%.exe @%LNKOUT%/link.sc -Wl,--out-implib=%LNKOUT%/libgnumake-1.dll.a +@echo off +goto :EOF + +:ConfigSCM +echo Generating config from SCM templates +sed -n "s/^AC_INIT(\[GNU make\],\[\([^]]\+\)\].*/s,%%VERSION%%,\1,g/p" configure.ac > %OUTDIR%\src\config.h.W32.sed +echo s,%%PACKAGE%%,make,g >> %OUTDIR%\src\config.h.W32.sed +sed -f %OUTDIR%\src\config.h.W32.sed src\config.h.W32.template > src\config.h.W32 +echo static const char *const GUILE_module_defn = ^" \ > src\gmk-default.h +sed -e "s/;.*//" -e "/^[ \t]*$/d" -e "s/\"/\\\\\"/g" -e "s/$/ \\\/" src\gmk-default.scm >> src\gmk-default.h +echo ^";>> src\gmk-default.h +goto :EOF + +:ChkGuile +:: Build with Guile is supported only on NT and later versions +if not "%OS%" == "Windows_NT" goto NoGuile +pkg-config --help > %OUTDIR%\guile.tmp 2> NUL +if ERRORLEVEL 1 goto NoPkgCfg + +echo Checking for Guile 2.0 +if not "%COMPILER%" == "gcc" set PKGMSC=--msvc-syntax +pkg-config --cflags --short-errors "guile-2.0" > %OUTDIR%\guile.tmp +if not ERRORLEVEL 1 set /P GUILECFLAGS= < %OUTDIR%\guile.tmp + +pkg-config --libs --static --short-errors %PKGMSC% "guile-2.0" > %OUTDIR%\guile.tmp +if not ERRORLEVEL 1 set /P GUILELIBS= < %OUTDIR%\guile.tmp + +if not "%GUILECFLAGS%" == "" goto GuileDone + +echo Checking for Guile 1.8 +pkg-config --cflags --short-errors "guile-1.8" > %OUTDIR%\guile.tmp +if not ERRORLEVEL 1 set /P GUILECFLAGS= < %OUTDIR%\guile.tmp + +pkg-config --libs --static --short-errors %PKGMSC% "guile-1.8" > %OUTDIR%\guile.tmp +if not ERRORLEVEL 1 set /P GUILELIBS= < %OUTDIR%\guile.tmp + +if not "%GUILECFLAGS%" == "" goto GuileDone + +echo - No Guile found, building without Guile +goto GuileDone + +:NoPkgCfg +echo - pkg-config not found, building without Guile + +:GuileDone +if "%GUILECFLAGS%" == "" goto :EOF + +echo - Guile found: building with Guile +set "GUILECFLAGS=%GUILECFLAGS% -DHAVE_GUILE" +goto :EOF + +:FindVswhere +set VSWHERE=vswhere +%VSWHERE% -help >nul 2>&1 +if not ERRORLEVEL 1 exit /b 0 +set "VSWHERE=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere" +%VSWHERE% -help >nul 2>&1 +if ERRORLEVEL 1 exit /b 1 +goto :EOF + +:CheckMSVC +if not exist "%VSVARS%" exit /b 1 +call "%VSVARS%" %ARCH% +if ERRORLEVEL 1 exit /b 1 +%COMPILER% >nul 2>&1 +if ERRORLEVEL 1 exit /b 1 +goto :EOF + +:Usage +echo Usage: %0 [options] [gcc] +echo Options: +echo. --without-guile Do not compile Guile support even if found +echo. --debug Make a Debug build--default is Release +echo. --x86 Make a 32bit binary--default is 64bit +echo. --help Display these instructions and exit +goto :EOF + +:Reset +set ARCH= +set COMPILER= +set DEBUG= +set GUILE= +set GUILECFLAGS= +set GUILELIBS= +set LINKOPTS= +set MAKE= +set NOGUILE= +set O= +set OPTS= +set OUTDIR= +set LNKOUT= +set PKGMSC= +set VSVARS= +goto :EOF diff --git a/third_party/make/builddos.bat b/third_party/make/builddos.bat new file mode 100644 index 00000000000..9cecabeca4e --- /dev/null +++ b/third_party/make/builddos.bat @@ -0,0 +1,95 @@ +@echo off +rem Copyright (C) 1998-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 . + +echo Building Make for MSDOS with DJGPP + +rem The SmallEnv trick protects against too small environment block, +rem in which case the values will be truncated and the whole thing +rem goes awry. COMMAND.COM will say "Out of environment space", but +rem many people don't care, so we force them to care by refusing to go. + +rem Where is the srcdir? +set XSRC=. +if not "%XSRC%"=="." goto SmallEnv +if "%1%"=="" goto SrcDone +if "%1%"=="." goto SrcDone +set XSRC=%1 + +if not "%XSRC%"=="%1" goto SmallEnv + +:SrcDone + +if not exist src mkdir src +if not exist lib mkdir lib + +copy /Y %XSRC%\src\configh.dos .\src\config.h + +copy /Y %XSRC%\lib\glob.in.h .\lib\glob.h +copy /Y %XSRC%\lib\fnmatch.in.h .\lib\fnmatch.h + +rem Echo ON so they will see what is going on. +@echo on +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/commands.c -o commands.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/output.c -o output.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/job.c -o job.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/dir.c -o dir.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/file.c -o file.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/misc.c -o misc.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/main.c -o main.o +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 +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 +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/rule.c -o rule.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/implicit.c -o implicit.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/default.c -o default.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/variable.c -o variable.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/expand.c -o eyxpand.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/function.c -o function.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/vpath.c -o vpath.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/hash.c -o hash.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/strcache.c -o strcache.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/version.c -o version.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/ar.c -o ar.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/arscan.c -o arscan.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/signame.c -o signame.o +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 +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/getopt.c -o getopt.o +gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/getopt1.c -o getopt1.o +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 +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 +@echo off +echo commands.o > respf.$$$ +for %%f in (job output dir file misc main read remake rule implicit default variable) do echo %%f.o >> respf.$$$ +for %%f in (expand function vpath hash strcache version ar arscan signame remote-stub getopt getopt1) do echo %%f.o >> respf.$$$ +for %%f in (lib\glob lib\fnmatch) do echo %%f.o >> respf.$$$ +rem gcc -c -I./src -I%XSRC% -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/guile.c -o guile.o +rem echo guile.o >> respf.$$$ +@echo Linking... +@echo on +gcc -o make.exe @respf.$$$ +@echo off +if not exist make.exe echo Make.exe build failed... +if exist make.exe echo make.exe is now built! +if exist make.exe del respf.$$$ +if exist make.exe copy /Y Basic.mk Makefile +goto End + +:SmallEnv +echo Your environment is too small. Please enlarge it and run me again. + +:End +set XRSC= +@echo on diff --git a/third_party/make/configure b/third_party/make/configure new file mode 100755 index 00000000000..852601d391a --- /dev/null +++ b/third_party/make/configure @@ -0,0 +1,19666 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for GNU make 4.3. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +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 +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + 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 + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="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 +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and bug-make@gnu.org +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='GNU make' +PACKAGE_TARNAME='make' +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="src/vpath.c" +ac_config_libobj_dir=lib +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_func_list= +ac_header_list= +gt_needs= +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 +AM_LDFLAGS +USE_CUSTOMS_FALSE +USE_CUSTOMS_TRUE +REMOTE +HAVE_GUILE_FALSE +HAVE_GUILE_TRUE +GUILE_LIBS +GUILE_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +POSUB +INTLLIBS +LTLIBICONV +LIBICONV +INTL_MACOSX_LIBS +XGETTEXT_EXTRA_OPTIONS +MSGMERGE +XGETTEXT_015 +XGETTEXT +GMSGFMT_015 +MSGFMT_015 +GMSGFMT +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 +host +build_os +build_vendor +build_cpu +build +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 +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +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 +with_libiconv_prefix +with_libintl_prefix +enable_largefile +with_guile +with_customs +enable_case_insensitive_file_system +enable_job_server +enable_load +enable_posix_spawn +with_dmalloc +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +GUILE_CFLAGS +GUILE_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +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.3 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/make] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of GNU make 4.3:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + 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 + --enable-case-insensitive-file-system + 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] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib + --without-libintl-prefix don't search for libintl in includedir and libdir + --with-guile Support GNU Guile for embedded scripting + --with-customs=DIR enable remote jobs via Customs--see README.customs + --with-dmalloc use dmalloc, as in http://www.dmalloc.com + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + GUILE_CFLAGS + C compiler flags for GUILE, overriding pkg-config + GUILE_LIBS linker flags for GUILE, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +GNU make home page: . +General help using GNU software: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +GNU make configure 4.3 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +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_compile") 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_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +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_cpp conftest.$ac_ext") 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; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ------------------------------- ## +## Report this to bug-make@gnu.org ## +## ------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + 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>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { 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_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + 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_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=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 +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # 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 +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* 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 $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # 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 +#include +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 &5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +$as_echo_n "checking for $2.$3... " >&6; } +if eval \${$4+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + eval "$4=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 +eval ac_res=\$$4 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_member +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.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +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 || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$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. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +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 + + + + + +# Autoconf setup +ac_aux_dir= +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" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + 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, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +ac_config_headers="$ac_config_headers src/config.h" + + + + +# Automake setup +# We have to enable "foreign" because ChangeLog is auto-generated +# 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 +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; 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_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # 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_STRIP="${ac_tool_prefix}strip" + $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 +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; 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_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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_STRIP="strip" + $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_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + 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 + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +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_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # 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_AWK="$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 + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='make' + VERSION='4.3' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +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: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'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: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +# Checks for programs. +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ $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 >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# 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 + 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 : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +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 +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; 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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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_CC="${ac_tool_prefix}gcc" + $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 +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; 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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # 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_CC="gcc" + $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_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + 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 + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; 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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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_CC="${ac_tool_prefix}cc" + $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 +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; 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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +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 + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $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 + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + 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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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_CC="$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 + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # 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_CC="$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 + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + 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 + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +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_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +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_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +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>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +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 $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { 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>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { 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_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + 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 $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +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_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=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 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +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 + +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 whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # 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__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +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 + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 +_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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 +_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 + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_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$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_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 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "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_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_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_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_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$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_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 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "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_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_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_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $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 +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +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 + +_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 + +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 + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +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 +#include +#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; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +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 + +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 + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +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 + +done + + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = xyes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$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 + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if ${ac_cv_safe_to_define___extensions__+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $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. */ + + #include + 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 + 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 +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; 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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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_CC="${ac_tool_prefix}gcc" + $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 +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; 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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # 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_CC="gcc" + $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_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + 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 + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; 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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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_CC="${ac_tool_prefix}cc" + $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 +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; 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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +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 + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $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 + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + 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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # 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_CC="$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 + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +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_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # 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_CC="$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 + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + 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 + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +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_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=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 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +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 + +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 whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # 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__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +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 + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +# 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 +$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 + + fi + fi + + + + + # 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 + gl_cross_guesses=conservative +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; + + +# 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 + 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 +{ $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 + + +{ $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 + 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 + +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 + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +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 + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +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 + ac_cv_working_alloca_h=no +fi +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 + +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 + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# ifdef HAVE_ALLOCA_H +# include +# 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 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 +{ $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 "#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 + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined CRAY && ! defined CRAY2 +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then : + ac_cv_os_cray=yes +else + 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 + + done +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; +} + +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 +_ACEOF + + +fi + + + + + 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 $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 + 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 + +done + + + + + + { $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 + 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 + # . + 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 "$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 + rm -rf conftestd1a conftestd1b conftestd2 + mkdir conftestd1a conftestd1b conftestd2 + cat < conftestd1a/conftest.h +#define DEFINED_IN_CONFTESTD1 +#include_next +#ifdef DEFINED_IN_CONFTESTD2 +int foo; +#else +#error "include_next doesn't work" +#endif +EOF + cat < conftestd1b/conftest.h +#define DEFINED_IN_CONFTESTD1 +#include +#include_next +#ifdef DEFINED_IN_CONFTESTD2 +int foo; +#else +#error "include_next doesn't work" +#endif +EOF + cat < 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 +_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 +_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 +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 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 + 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 +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 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 + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#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 + +_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 + gl_cv_header_errno_h_complete=yes +fi +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 + + + + + + + + + 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 " >&5 +$as_echo_n "checking absolute name of ... " >&6; } +if ${gl_cv_next_errno_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_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: $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 + + + + + ERRNO_H='errno.h' + fi + + if test -n "$ERRNO_H"; then + GL_GENERATE_ERRNO_H_TRUE= + GL_GENERATE_ERRNO_H_FALSE='#' +else + GL_GENERATE_ERRNO_H_TRUE='#' + GL_GENERATE_ERRNO_H_FALSE= +fi + + + 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 +#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=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 +#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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include +"; then : + +fi + + fi + fi + +fi +{ $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 + + + 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 + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#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 + 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 +#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=hidden +fi +rm -f conftest* + + 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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include +"; then : + +fi + + fi + fi + +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 + + + 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 + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#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. */ + +#define _XOPEN_SOURCE_EXTENDED 1 +#include +#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=hidden +fi +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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include +"; then : + +fi + + fi + fi + +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 + + + fi + + +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 + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRERROR_R $ac_have_decl +_ACEOF + +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 + +fi +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 + + 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; + + ; + 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 + + fi + +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 + + + XGETTEXT_EXTRA_OPTIONS= + + + + + + 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; + + + + + + + + + + + + + { $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 + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + #if HAVE_UNISTD_H + # include + #else /* on Windows with MSVC */ + # include + # include + # defined sleep(n) _sleep ((n) * 1000) + #endif + #include + #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 +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 + + +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; } + + case $gl_cv_header_working_fcntl_h in #( + *O_NOATIME* | no | cross-compiling) ac_val=0;; #( + *) ac_val=1;; + esac + +cat >>confdefs.h <<_ACEOF +#define HAVE_WORKING_O_NOATIME $ac_val +_ACEOF + + + case $gl_cv_header_working_fcntl_h in #( + *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( + *) ac_val=1;; + esac + +cat >>confdefs.h <<_ACEOF +#define HAVE_WORKING_O_NOFOLLOW $ac_val +_ACEOF + + +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 + +cat >>confdefs.h <<_ACEOF +#define pid_t int +_ACEOF + +fi + +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 : + +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 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 + 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. */ +#if (defined __x86_64__ || defined __amd64__ \ + || defined _M_X64 || defined _M_AMD64) + int ok; + #else + error fail + #endif + +_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 + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gl_cv_host_cpu_c_abi=x86_64-x32 +else + gl_cv_host_cpu_c_abi=x86_64 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + gl_cv_host_cpu_c_abi=i386 +fi +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 + +_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 + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gl_cv_host_cpu_c_abi=arm64-ilp32 +else + 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. */ +#ifdef __LP64__ + int ok; + #else + error fail + #endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gl_cv_host_cpu_c_abi=hppa64 +else + gl_cv_host_cpu_c_abi=hppa +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; + + 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 + +_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 ), and _MIPS_SIM == _ABIN32. + # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but + # may later get defined by ), 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 + +else + gl_cv_host_cpu_c_abi=powerpc +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; + + rs6000 ) + gl_cv_host_cpu_c_abi=powerpc + ;; + + 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 + +_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 + +_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 + +_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 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + 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. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined __LP64__ || defined __s390x__ + int ok; + #else + error fail + #endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gl_cv_host_cpu_c_abi=s390x +else + gl_cv_host_cpu_c_abi=s390 +fi +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 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; + + *) + 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" + + + + # 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 <' + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 +$as_echo_n "checking absolute name of ... " >&6; } +if ${gl_cv_next_limits_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + + if test $ac_cv_header_limits_h = yes; then + + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_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 + + + + + + { $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 + long long llm = LLONG_MAX; + int wb = WORD_BIT; + int ullw = ULLONG_WIDTH; + +int +main () +{ + + ; + return 0; +} +_ACEOF +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_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 + + 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 () +{ +#if defined _WIN32 && ! defined __CYGWIN__ + choke me + #endif + + ; + return 0; +} +_ACEOF +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_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_malloc_posix" >&5 +$as_echo "$gl_cv_func_malloc_posix" >&6; } + + + + + + 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; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + 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 + + #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 () +{ + + 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_compile "$LINENO"; then : + ac_cv_header_stdbool_h=yes +else + ac_cv_header_stdbool_h=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_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 + + +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 + 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: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be included + before . */ +#include +#include +#include +#include + 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 + +$as_echo "#define HAVE_WINT_T 1" >>confdefs.h + + + { $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. */ + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be + included before . */ +#if !(defined __GLIBC__ && !defined __UCLIBC__) +# include +# include +# include +#endif +#include + int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1]; + +int +main () +{ + + ; + 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 + GNULIB_OVERRIDES_WINT_T=0 + fi + else + GNULIB_OVERRIDES_WINT_T=0 + fi + + + + + + + + + + + + +$as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h + + +$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h + + + + if test $ac_cv_header_wchar_h = yes; then + HAVE_WCHAR_H=1 + else + HAVE_WCHAR_H=0 + fi + + + 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 + + + + + + + + + + + + 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 " >&5 +$as_echo_n "checking absolute name of ... " >&6; } +if ${gl_cv_next_stdint_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + + if test $ac_cv_header_stdint_h = yes; then + + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_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 '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 +{ $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 + + + + + if test $ac_cv_header_stdint_h = yes; then + HAVE_STDINT_H=1 + else + HAVE_STDINT_H=0 + 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. */ + + +#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 +/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ +#if !(defined WCHAR_MIN && defined WCHAR_MAX) +#error "WCHAR_MIN, WCHAR_MAX not defined in " +#endif + + + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + +#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 /* 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; +}; + +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 + + + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + +#include +#include +#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 + }; + +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_run "$LINENO"; then : + gl_cv_header_working_stdint_h=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 +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 + + 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 + gl_cv_header_stdint_predates_cxx11_h=yes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ +#include + + + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + +intmax_t im = INTMAX_MAX; +int32_t i32 = INT32_C (0x7fffffff); + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gl_cv_header_stdint_predates_cxx11_h=no +fi +rm -f core conftest.err conftest.$ac_objext 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. */ + + /* 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 + + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + int iw = UINTMAX_WIDTH; + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gl_cv_header_stdint_width=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include "; 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 + + + 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include "; 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 + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + int verify[2 * (($gltype) -1 < ($gltype) 0) - 1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + result=yes +else + result=no +fi +rm -f core conftest.err conftest.$ac_objext 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. */ + + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + extern $gltype foo; + extern $gltype1 foo; +int +main () +{ + + ; + return 0; +} +_ACEOF +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_ext + eval result=\$gl_cv_type_${gltype}_suffix + test "$result" != no && break + done +fi +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 + + done + + + fi + + + 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 + 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. */ + + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + extern $gltype foo; + extern $gltype1 foo; +int +main () +{ + + ; + return 0; +} +_ACEOF +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_ext + eval result=\$gl_cv_type_${gltype}_suffix + test "$result" != no && break + done +fi +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 + + done + + + + 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 + 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. */ +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_c_restrict=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_restrict" != no && break + done + +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 + #include + +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 ac_fn_c_try_run "$LINENO"; then : + gl_cv_func_strerror_0_works=yes +else + 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 + + +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 + +$as_echo "#define REPLACE_STRERROR_0 1" >>confdefs.h + + ;; + 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 " >&5 +$as_echo_n "checking absolute name of ... " >&6; } +if ${gl_cv_next_string_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_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 '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 + }' + + 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'"' + + +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 + + + + + + + + + + + + + + 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 " >&5 +$as_echo_n "checking absolute name of ... " >&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 +_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 '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 +{ $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 + + + + + + + + + + + + + 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 + + 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 + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if defined __GNUC__ || defined _AIX || defined _MSC_VER + Need own alloca +#endif + +_ACEOF +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 conftest* + + +fi +{ $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 + GL_GENERATE_ALLOCA_H_TRUE='#' + GL_GENERATE_ALLOCA_H_FALSE= +fi + + + 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 + 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 + # . + 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. */ + + #include + #include + #include + #include + #include + #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; + #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 +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 *.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 + + ;; + 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 + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +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 -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $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 + #include + #include + #include + #include + #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) ;; + *) + + + 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 +#ifndef F_DUPFD_CLOEXEC +choke me +#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 " >&5 +$as_echo_n "checking absolute name of ... " >&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 +_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 +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 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 , not . +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: must be included before + . */ + # include + # include + #endif + #include +" +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 , because Solaris 2 does not use dwarf (it +# uses stabs), but it is still SVR4. We cannot check for 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 +" +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 +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 +" +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 +" +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 +" +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 + #include + #include + #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 + # include + # 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 +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 + 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 + 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 " >&5 +$as_echo_n "checking absolute name of ... " >&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 +_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 " >&5 +$as_echo_n "checking absolute name of ... " >&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 +_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 + #include + /* 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 " >&5 +$as_echo_n "checking absolute name of ... " >&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 +_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 + +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 " >&5 +$as_echo_n "checking absolute name of ... " >&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 +_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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 +_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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 +_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 + #include + +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 + #include + +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 defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +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 + +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 &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 &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 +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 +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 +$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 +#include + +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 +#include + +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 +#include + +#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 + + + + + + + { $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 + 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 +$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 : + eval "$gt_func_gnugettext_libintl=yes" +else + eval "$gt_func_gnugettext_libintl=no" +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. */ + +#include +$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; } + 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 + + +$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h + + +$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h + + fi + + POSUB=po + fi + + + + INTLLIBS="$LIBINTL" + + + + + + + +# 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 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 + /* 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 () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +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 +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 + + { $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 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* 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 () +{ + + ; + 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 + /* 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 () +{ + + ; + 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 + /* 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 () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=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 _LARGE_FILES 1 +#include + /* 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 () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + 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 _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + 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 : + $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 getpwnam (); +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 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_getpwnam+:} false; then : + break +fi +done +if ${ac_cv_search_getpwnam+:} false; then : + +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" + +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 : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +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 + +_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 + +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 + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +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 +#include +#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; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +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 + +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 + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +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 +#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 +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 + +ac_header_dirent=$ac_hdr; break +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 : + $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 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 +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_search_opendir=no +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 : + $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 opendir (); +int +main () +{ +return opendir (); + ; + 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 +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_search_opendir=no +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 + +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 +#include + +#if defined S_ISBLK && defined S_IFDIR +extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; +#endif + +#if defined S_ISBLK && defined S_IFCHR +extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; +#endif + +#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_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=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 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 + + + +{ $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. */ + +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 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +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 +#include + +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; } + +cat >>confdefs.h <<_ACEOF +#define RETSIGTYPE $ac_cv_type_signal +_ACEOF + + +{ $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 + +_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* + +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 + +$as_echo "#define uid_t int" >>confdefs.h + + +$as_echo "#define gid_t int" >>confdefs.h + +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 + +cat >>confdefs.h <<_ACEOF +#define pid_t int +_ACEOF + +fi + +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 +#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 : + +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 + +fi + + + { $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 + 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 : + +else + 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 + + + + 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 + test $ac_cv_type_unsigned_long_long_int = yes \ + && ac_type='unsigned long long int' \ + || ac_type='unsigned long int' + +cat >>confdefs.h <<_ACEOF +#define uintmax_t $ac_type +_ACEOF + +fi + + + +# 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 +/* end confdefs.h. */ +#include +#include + +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 +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 +#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 +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 + +cat >>confdefs.h <<_ACEOF +#define FILE_TIMESTAMP_HI_RES $val +_ACEOF + + +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 + 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 +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 + ac_cv_search_clock_gettime=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 +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 : + $as_echo_n "(cached) " >&6 +else + + 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 + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_dos_paths=yes +else + 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 x"$ac_cv_dos_paths" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_DOS_PATHS 1 +_ACEOF + +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 + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + 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 : + +$as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h + + +fi + +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 : + 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 + + +# 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 +" +if test "x$ac_cv_have_decl_bsd_signal" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BSD_SIGNAL $ac_have_decl +_ACEOF + + +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 + +fi + +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 + +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 + if test "$cross_compiling" = yes; then : + ac_cv_func_fork_works=cross +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* By Ruediger Kuhlmann. */ + return fork () < 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_fork_works=yes +else + ac_cv_func_fork_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: $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_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_vfork_works=cross +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Thanks to Paul Eggert for this test. */ +$ac_includes_default +#include +#ifdef HAVE_VFORK_H +# include +#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 , but some compilers + (e.g. gcc -O) don't grok . 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 +sparc_address_test (int arg) +# else +sparc_address_test (arg) int arg; +#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); + } + } +} + +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 + ); + } +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_vfork_works=yes +else + ac_cv_func_vfork_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: $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;} +fi + +if test "x$ac_cv_func_vfork_works" = xyes; then + +$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h + +else + +$as_echo "#define vfork fork" >>confdefs.h + +fi +if test "x$ac_cv_func_fork_works" = xyes; then + +$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h + +fi + + +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 + + +# 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 + 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 +int +main () +{ +return (strcoll ("abc", "def") >= 0 || + strcoll ("ABC", "DEF") >= 0 || + strcoll ("123", "456") >= 0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_strcoll_works=yes +else + ac_cv_func_strcoll_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: $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 + +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 +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; +} +_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 + + +# dir.c and our glob.c use dirent.d_type if available + + + ac_fn_c_check_member "$LINENO" "struct dirent" "d_type" "ac_cv_member_struct_dirent_d_type" " +#include +#ifdef HAVE_DIRENT_H +# include +#else +# define dirent direct +# ifdef HAVE_SYS_NDIR_H +# include +# endif +# ifdef HAVE_SYS_DIR_H +# include +# endif +# ifdef HAVE_NDIR_H +# include +# endif +#endif + +" +if test "x$ac_cv_member_struct_dirent_d_type" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_DIRENT_D_TYPE 1 +_ACEOF + + +fi + + + +# 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 + + +# Annoyingly, each version of Guile comes with it's own PC file so we have to +# specify them as individual packages. Ugh. + + + + + + + +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 + +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 + 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-\$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 + + + +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: + +$GUILE_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +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. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +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; } + +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 : + +$as_echo "#define HAVE_GUILE 1" >>confdefs.h + +else + have_guile=no +fi + + + CPPFLAGS="$keep_CPPFLAGS" + +fi + +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 +/* NetBSD declares sys_siglist in unistd.h. */ +#if HAVE_UNISTD_H +# include +#endif + +" +if test "x$ac_cv_have_decl_sys_siglist" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGLIST $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "_sys_siglist" "ac_cv_have_decl__sys_siglist" "$ac_includes_default +#include +/* NetBSD declares sys_siglist in unistd.h. */ +#if HAVE_UNISTD_H +# include +#endif + +" +if test "x$ac_cv_have_decl__sys_siglist" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL__SYS_SIGLIST $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "__sys_siglist" "ac_cv_have_decl___sys_siglist" "$ac_includes_default +#include +/* NetBSD declares sys_siglist in unistd.h. */ +#if HAVE_UNISTD_H +# include +#endif + +" +if test "x$ac_cv_have_decl___sys_siglist" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL___SYS_SIGLIST $ac_have_decl +_ACEOF + + + +# Check out the wait reality. +for ac_header in sys/wait.h +do : + ac_fn_c_check_header_compile "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "#include +" +if test "x$ac_cv_header_sys_wait_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_WAIT_H 1 +_ACEOF + +fi + +done + +for ac_func in waitpid wait3 +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 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for union wait" >&5 +$as_echo_n "checking for union wait... " >&6; } +if ${make_cv_union_wait+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +union wait status; int pid; pid = wait (&status); +#ifdef WEXITSTATUS +/* Some POSIXoid systems have both the new-style macros and the old + union wait type, and they do not work together. If union wait + conflicts with WEXITSTATUS et al, we don't want to use it at all. */ + if (WEXITSTATUS (status) != 0) pid = -1; +#ifdef WTERMSIG + /* If we have WEXITSTATUS and WTERMSIG, just use them on ints. */ + -- blow chunks here -- +#endif +#endif +#ifdef HAVE_WAITPID + /* Make sure union wait works with waitpid. */ + pid = waitpid (-1, &status, 0); +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + make_cv_union_wait=yes +else + make_cv_union_wait=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_union_wait" >&5 +$as_echo "$make_cv_union_wait" >&6; } +if test "$make_cv_union_wait" = yes; then : + +$as_echo "#define HAVE_UNION_WAIT 1" >>confdefs.h + + +fi + + +# If we're building on Windows/DOS/OS/2, add some support for DOS drive specs. +if test "$PATH_SEPARATOR" = ';'; then : + +$as_echo "#define HAVE_DOS_PATHS 1" >>confdefs.h + + +fi + +# See if the user wants to use pmake's "customs" distributed build capability + REMOTE=stub +use_customs=false + +# Check whether --with-customs was given. +if test "${with_customs+set}" = set; then : + withval=$with_customs; case $withval in #( + n|no) : + : ;; #( + *) : + make_cppflags="$CPPFLAGS" + case $withval in #( + y|ye|yes) : + : ;; #( + *) : + CPPFLAGS="$CPPFLAGS -I$with_customs/include/customs" + make_ldflags="$LDFLAGS -L$with_customs/lib" ;; +esac + +cf_test_netlibs=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for network libraries" >&5 +$as_echo_n "checking for network libraries... " >&6; } +if ${cf_cv_netlibs+:} false; then : + $as_echo_n "(cached) " >&6 +else + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: working..." >&5 +$as_echo "working..." >&6; } +cf_cv_netlibs="" +cf_test_netlibs=yes +for ac_func in gethostname +do : + ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname" +if test "x$ac_cv_func_gethostname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETHOSTNAME 1 +_ACEOF + +else + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostname in -lnsl" >&5 +$as_echo_n "checking for gethostname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $cf_cv_netlibs $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 gethostname (); +int +main () +{ +return gethostname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostname=yes +else + ac_cv_lib_nsl_gethostname=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_nsl_gethostname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostname" >&6; } +if test "x$ac_cv_lib_nsl_gethostname" = xyes; then : + + +cf_tr_func=`echo gethostname | tr '[a-z]' '[A-Z]'` + + +cat >>confdefs.h <<_ACEOF +#define HAVE_$cf_tr_func 1 +_ACEOF + + ac_cv_func_gethostname=yes + cf_cv_netlibs="-lnsl $cf_cv_netlibs" +else + + ac_cv_func_gethostname=unknown + unset ac_cv_func_gethostname 2>/dev/null + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostname in -lsocket" >&5 +$as_echo_n "checking for gethostname in -lsocket... " >&6; } +if ${ac_cv_lib_socket_gethostname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $cf_cv_netlibs $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 gethostname (); +int +main () +{ +return gethostname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_gethostname=yes +else + ac_cv_lib_socket_gethostname=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_socket_gethostname" >&5 +$as_echo "$ac_cv_lib_socket_gethostname" >&6; } +if test "x$ac_cv_lib_socket_gethostname" = xyes; then : + + +cf_tr_func=`echo gethostname | tr '[a-z]' '[A-Z]'` + + +cat >>confdefs.h <<_ACEOF +#define HAVE_$cf_tr_func 1 +_ACEOF + + ac_cv_func_gethostname=yes + cf_cv_netlibs="-lsocket $cf_cv_netlibs" +else + + ac_cv_func_gethostname=unknown + unset ac_cv_func_gethostname 2>/dev/null + +fi + + +fi + + +fi +done + +# +# FIXME: sequent needs this library (i.e., -lsocket -linet -lnsl), but +# I don't know the entrypoints - 97/7/22 TD +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 +$as_echo_n "checking for main in -linet... " >&6; } +if ${ac_cv_lib_inet_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-linet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_inet_main=yes +else + ac_cv_lib_inet_main=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_inet_main" >&5 +$as_echo "$ac_cv_lib_inet_main" >&6; } +if test "x$ac_cv_lib_inet_main" = xyes; then : + cf_cv_netlibs="-linet $cf_cv_netlibs" +fi + +# +if test "$ac_cv_func_lsocket" != no ; then +for ac_func in socket +do : + ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" +if test "x$ac_cv_func_socket" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SOCKET 1 +_ACEOF + +else + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 +$as_echo_n "checking for socket in -lsocket... " >&6; } +if ${ac_cv_lib_socket_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $cf_cv_netlibs $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 socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_socket=yes +else + ac_cv_lib_socket_socket=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_socket_socket" >&5 +$as_echo "$ac_cv_lib_socket_socket" >&6; } +if test "x$ac_cv_lib_socket_socket" = xyes; then : + + +cf_tr_func=`echo socket | tr '[a-z]' '[A-Z]'` + + +cat >>confdefs.h <<_ACEOF +#define HAVE_$cf_tr_func 1 +_ACEOF + + ac_cv_func_socket=yes + cf_cv_netlibs="-lsocket $cf_cv_netlibs" +else + + ac_cv_func_socket=unknown + unset ac_cv_func_socket 2>/dev/null + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lbsd" >&5 +$as_echo_n "checking for socket in -lbsd... " >&6; } +if ${ac_cv_lib_bsd_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $cf_cv_netlibs $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 socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_socket=yes +else + ac_cv_lib_bsd_socket=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_bsd_socket" >&5 +$as_echo "$ac_cv_lib_bsd_socket" >&6; } +if test "x$ac_cv_lib_bsd_socket" = xyes; then : + + +cf_tr_func=`echo socket | tr '[a-z]' '[A-Z]'` + + +cat >>confdefs.h <<_ACEOF +#define HAVE_$cf_tr_func 1 +_ACEOF + + ac_cv_func_socket=yes + cf_cv_netlibs="-lbsd $cf_cv_netlibs" +else + + ac_cv_func_socket=unknown + unset ac_cv_func_socket 2>/dev/null + +fi + + +fi + + +fi +done + +fi +# +for ac_func in gethostbyname +do : + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETHOSTBYNAME 1 +_ACEOF + +else + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $cf_cv_netlibs $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 gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=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_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : + + +cf_tr_func=`echo gethostbyname | tr '[a-z]' '[A-Z]'` + + +cat >>confdefs.h <<_ACEOF +#define HAVE_$cf_tr_func 1 +_ACEOF + + ac_cv_func_gethostbyname=yes + cf_cv_netlibs="-lnsl $cf_cv_netlibs" +else + + ac_cv_func_gethostbyname=unknown + unset ac_cv_func_gethostbyname 2>/dev/null + +fi + + +fi +done + + +fi + +LIBS="$LIBS $cf_cv_netlibs" +test $cf_test_netlibs = no && echo "$cf_cv_netlibs" >&6 + + ac_fn_c_check_header_mongrel "$LINENO" "customs.h" "ac_cv_header_customs_h" "$ac_includes_default" +if test "x$ac_cv_header_customs_h" = xyes; then : + use_customs=true + REMOTE=cstms + LIBS="$LIBS -lcustoms" LDFLAGS="$make_ldflags" +else + with_customs=no + CPPFLAGS="$make_cppflags" make_badcust=yes +fi + + + ;; +esac + +fi + + +# Tell automake about this, so it can include the right .c files. + if test "$use_customs" = true; then + USE_CUSTOMS_TRUE= + USE_CUSTOMS_FALSE='#' +else + USE_CUSTOMS_TRUE='#' + USE_CUSTOMS_FALSE= +fi + + +# See if the user asked to handle case insensitive file systems. + +# Check whether --enable-case-insensitive-file-system was given. +if test "${enable_case_insensitive_file_system+set}" = set; then : + enableval=$enable_case_insensitive_file_system; if test "$enableval" = yes; then : + $as_echo "#define HAVE_CASE_INSENSITIVE_FS 1" >>confdefs.h + +fi +fi + + +# See if we can handle the job server feature, and if the user wants it. +# Check whether --enable-job-server was given. +if test "${enable_job_server+set}" = set; then : + enableval=$enable_job_server; make_cv_job_server="$enableval" user_job_server="$enableval" +else + make_cv_job_server="yes" +fi + + +if test "$ac_cv_func_waitpid" = no && test "$ac_cv_func_wait3" = no; then : + has_wait_nohang=no +else + has_wait_nohang=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SA_RESTART" >&5 +$as_echo_n "checking for SA_RESTART... " >&6; } +if ${make_cv_sa_restart+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +return SA_RESTART; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + make_cv_sa_restart=yes +else + make_cv_sa_restart=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_sa_restart" >&5 +$as_echo "$make_cv_sa_restart" >&6; } + +if test "$make_cv_sa_restart" != no; then : + +$as_echo "#define HAVE_SA_RESTART 1" >>confdefs.h + + +fi + +# Only allow jobserver on systems that support it +case /$ac_cv_func_pipe/$ac_cv_func_sigaction/$make_cv_sa_restart/$has_wait_nohang/ in #( + */no/*) : + make_cv_job_server=no ;; #( + *) : + ;; +esac + +# Also supported on OS2 and MinGW +case $host_os in #( + os2*|mingw*) : + make_cv_job_server=yes ;; #( + *) : + ;; +esac + +# If we support it and the user didn't disable it, build with jobserver +case /$make_cv_job_server/$user_job_server/ in #( + */no/*) : + : no jobserver ;; #( + *) : + +$as_echo "#define MAKE_JOBSERVER 1" >>confdefs.h + + ;; +esac + +# If dl*() functions are supported we can enable the load operation +ac_fn_c_check_decl "$LINENO" "dlopen" "ac_cv_have_decl_dlopen" "#include +" +if test "x$ac_cv_have_decl_dlopen" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_DLOPEN $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "dlsym" "ac_cv_have_decl_dlsym" "#include +" +if test "x$ac_cv_have_decl_dlsym" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_DLSYM $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "dlerror" "ac_cv_have_decl_dlerror" "#include +" +if test "x$ac_cv_have_decl_dlerror" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_DLERROR $ac_have_decl +_ACEOF + + +# Check whether --enable-load was given. +if test "${enable_load+set}" = set; then : + enableval=$enable_load; make_cv_load="$enableval" user_load="$enableval" +else + make_cv_load="yes" +fi + + +case /$ac_cv_have_decl_dlopen/$ac_cv_have_decl_dlsym/$ac_cv_have_decl_dlerror/ in #( + */no/*) : + make_cv_load=no ;; #( + *) : + ;; +esac + +# We might need -ldl +if test "$make_cv_load" = yes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 +$as_echo_n "checking for library containing dlopen... " >&6; } +if ${ac_cv_search_dlopen+:} 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 dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dl; 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_dlopen=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_dlopen+:} false; then : + break +fi +done +if ${ac_cv_search_dlopen+:} false; then : + +else + ac_cv_search_dlopen=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 +$as_echo "$ac_cv_search_dlopen" >&6; } +ac_res=$ac_cv_search_dlopen +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +else + make_cv_load= +fi + + +fi + +case /$make_cv_load/$user_load/ in #( + */no/*) : + make_cv_load=no ;; #( + *) : + +$as_echo "#define MAKE_LOAD 1" >>confdefs.h + + ;; +esac + +# If we want load support, we might need to link with export-dynamic. +# See if we can figure it out. Unfortunately this is very difficult. +# For example passing -rdynamic to the SunPRO linker gives a warning +# but succeeds and creates a shared object, not an executable! +if test "$make_cv_load" = yes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking If the linker accepts -Wl,--export-dynamic" >&5 +$as_echo_n "checking If the linker accepts -Wl,--export-dynamic... " >&6; } + old_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--export-dynamic" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(){} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + AM_LDFLAGS=-Wl,--export-dynamic + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking If the linker accepts -rdynamic" >&5 +$as_echo_n "checking If the linker accepts -rdynamic... " >&6; } + LDFLAGS="$old_LDFLAGS -rdynamic" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(){} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + AM_LDFLAGS=-rdynamic + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$old_LDFLAGS" + +fi + +# if we have both lstat() and readlink() then we can support symlink +# timechecks. +if test "$ac_cv_func_lstat" = yes && test "$ac_cv_func_readlink" = yes; then : + +$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 + #include + + 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 +$as_echo_n "checking for location of SCCS get command... " >&6; } +if ${make_cv_path_sccs_get+:} false; then : + $as_echo_n "(cached) " >&6 +else + + if test -f /usr/sccs/get; then : + make_cv_path_sccs_get=/usr/sccs/get +else + make_cv_path_sccs_get=get +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_path_sccs_get" >&5 +$as_echo "$make_cv_path_sccs_get" >&6; } + +cat >>confdefs.h <<_ACEOF +#define SCCS_GET "$make_cv_path_sccs_get" +_ACEOF + + +ac_clean_files="$ac_clean_files s.conftest conftoast" # Remove these later. +if (/usr/sccs/admin -n s.conftest || admin -n s.conftest) >/dev/null 2>&1 && + test -f s.conftest; then : + # We successfully created an SCCS file. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if SCCS get command understands -G" >&5 +$as_echo_n "checking if SCCS get command understands -G... " >&6; } +if ${make_cv_sys_get_minus_G+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $make_cv_path_sccs_get -Gconftoast s.conftest >/dev/null 2>&1 && + test -f conftoast; then : + make_cv_sys_get_minus_G=yes +else + make_cv_sys_get_minus_G=no +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_sys_get_minus_G" >&5 +$as_echo "$make_cv_sys_get_minus_G" >&6; } + if test "$make_cv_sys_get_minus_G" = yes; then : + +$as_echo "#define SCCS_GET_MINUS_G 1" >>confdefs.h + + +fi + +fi +rm -f s.conftest conftoast + +# Let the makefile know what our build host is + + +cat >>confdefs.h <<_ACEOF +#define MAKE_HOST "$host" +_ACEOF + +MAKE_HOST="$host" + + +w32_target_env=no + if false; then + WINDOWSENV_TRUE= + WINDOWSENV_FALSE='#' +else + WINDOWSENV_TRUE='#' + WINDOWSENV_FALSE= +fi + + +case $host in #( + *-*-mingw32) : + if true; then + WINDOWSENV_TRUE= + WINDOWSENV_FALSE='#' +else + WINDOWSENV_TRUE='#' + WINDOWSENV_FALSE= +fi + + w32_target_env=yes + +$as_echo "#define WINDOWS32 1" >>confdefs.h + + +$as_echo "#define HAVE_DOS_PATHS 1" >>confdefs.h + + ;; #( + *) : + ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define PATH_SEPARATOR_CHAR '$PATH_SEPARATOR' +_ACEOF + + +# Include the Maintainer's Makefile section, if it's here. + +MAINT_MAKEFILE=/dev/null +if test -r "$srcdir/maintMakefile"; then : + MAINT_MAKEFILE="$srcdir/maintMakefile" + +fi + + +# Allow building with dmalloc +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if malloc debugging is wanted" >&5 +$as_echo_n "checking if malloc debugging is wanted... " >&6; } + +# Check whether --with-dmalloc was given. +if test "${with_dmalloc+set}" = set; then : + withval=$with_dmalloc; if test "$withval" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define WITH_DMALLOC 1" >>confdefs.h + + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +# Forcibly disable SET_MAKE. If it's set it breaks things like the test +# scripts, etc. +SET_MAKE= + +# Sanity check and inform the user of what we found + +if test "x$make_badcust" = xyes; then : + +echo +echo "WARNING: --with-customs specified but no customs.h could be found;" +echo " disabling Customs support." +echo + +fi + +case $with_customs in #( + ""|n|no|y|ye|yes) : + : ;; #( + *) : + if test -f "$with_customs/lib/libcustoms.a"; then : + : +else + echo + echo "WARNING: '$with_customs/lib' does not appear to contain the" + echo " Customs library. You must build and install Customs" + echo " before compiling GNU make." + echo + +fi ;; +esac + +if test "x$has_wait_nohang" = xno; then : + echo + echo "WARNING: Your system has neither waitpid() nor wait3()." + echo " Without one of these, signal handling is unreliable." + echo " You should be aware that running GNU make with -j" + echo " could result in erratic behavior." + echo + +fi + +if test "x$make_cv_job_server" = xno && test "x$user_job_server" = xyes; then : + echo + echo "WARNING: Make job server requires a POSIX-ish system that" + echo " supports the pipe(), sigaction(), and either" + echo " waitpid() or wait3() functions. Your system doesn't" + echo " appear to provide one or more of those." + echo " Disabling job server support." + echo + +fi + +if test "x$make_cv_load" = xno && test "x$user_load" = xyes; then : + echo + echo "WARNING: 'load' support requires a POSIX-ish system that" + echo " supports the dlopen(), dlsym(), and dlerror() functions." + echo " Your system doesn't appear to provide one or more of these." + echo " Disabling 'load' support." + echo + +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 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! + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +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 "${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 +fi +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 "${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 +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 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +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 +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + 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 + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# 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.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to . +GNU make home page: . +General help using GNU software: ." + +_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.3 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +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. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "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" ;; + "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" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "tests/config-flags.pm") CONFIG_FILES="$CONFIG_FILES tests/config-flags.pm" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + +if $AWK 'BEGIN { getline <"/dev/null" }' /dev/null; then + ac_cs_awk_getline=: + ac_cs_awk_pipe_init= + ac_cs_awk_read_file=' + while ((getline aline < (F[key])) > 0) + print(aline) + close(F[key])' + ac_cs_awk_pipe_fini= +else + ac_cs_awk_getline=false + ac_cs_awk_pipe_init="print \"cat <<'|#_!!_#|' &&\"" + ac_cs_awk_read_file=' + print "|#_!!_#|" + print "cat " F[key] " &&" + '$ac_cs_awk_pipe_init + # The final `:' finishes the AND list. + ac_cs_awk_pipe_fini='END { print "|#_!!_#|"; print ":" }' +fi +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + +# Create commands to substitute file output variables. +{ + echo "cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1" && + echo 'cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&' && + echo "$ac_subst_files" | sed 's/.*/F["&"]="$&"/' && + echo "_ACAWK" && + echo "_ACEOF" +} >conf$$files.sh && +. ./conf$$files.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +rm -f conf$$files.sh + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + \$ac_cs_awk_pipe_init +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + if (nfields == 3 && !substed) { + key = field[2] + if (F[key] != "" && line ~ /^[ ]*@.*@[ ]*$/) { + \$ac_cs_awk_read_file + next + } + } + print line +} +\$ac_cs_awk_pipe_fini +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | +if $ac_cs_awk_getline; then + $AWK -f "$ac_tmp/subs.awk" +else + $AWK -f "$ac_tmp/subs.awk" | $SHELL +fi \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # 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. + # 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 + # 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. + 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. + 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 + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + 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\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { 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) + 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 ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + diff --git a/third_party/make/configure.ac b/third_party/make/configure.ac new file mode 100644 index 00000000000..cd49a2c5158 --- /dev/null +++ b/third_party/make/configure.ac @@ -0,0 +1,538 @@ +# Process this file with autoconf to produce a configure script. +# +# 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 . + +AC_INIT([GNU make],[4.3],[bug-make@gnu.org]) + +AC_PREREQ([2.69]) + +# Autoconf setup +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 +# 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 +AC_CHECK_PROG([AR], [ar], [ar], [ar]) +# Perl is needed for the test suite (only) +AC_CHECK_PROG([PERL], [perl], [perl], [perl]) + +# 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]) +AM_GNU_GETTEXT([external]) + +# 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. +AC_SYS_LARGEFILE + +# Checks for libraries. +AC_SEARCH_LIBS([getpwnam], [sun]) + +# Checks for header files. +AC_HEADER_STDC +AC_HEADER_DIRENT +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/file.h spawn.h]) + +AM_PROG_CC_C_O +AC_C_CONST +AC_TYPE_SIGNAL +AC_TYPE_UID_T +AC_TYPE_PID_T +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_TYPE_SSIZE_T +AC_TYPE_UINTMAX_T + +# Find out whether our struct stat returns nanosecond resolution timestamps. + +AC_STRUCT_ST_MTIM_NSEC +AC_CACHE_CHECK([whether to use high resolution file timestamps], + [make_cv_file_timestamp_hi_res], +[ make_cv_file_timestamp_hi_res=no + AS_IF([test "$ac_cv_struct_st_mtim_nsec" != no], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#if HAVE_INTTYPES_H +# include +#endif]], + [[char a[0x7fffffff < (uintmax_t)-1 >> 30 ? 1 : -1];]])], + [make_cv_file_timestamp_hi_res=yes]) + ])]) +AS_IF([test "$make_cv_file_timestamp_hi_res" = yes], [val=1], [val=0]) +AC_DEFINE_UNQUOTED([FILE_TIMESTAMP_HI_RES], [$val], + [Use high resolution file timestamps if nonzero.]) + +AS_IF([test "$make_cv_file_timestamp_hi_res" = yes], +[ # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function. + # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4. + AC_SEARCH_LIBS([clock_gettime], [rt posix4]) + AS_IF([test "$ac_cv_search_clock_gettime" != no], + [ AC_DEFINE([HAVE_CLOCK_GETTIME], [1], + [Define to 1 if you have the clock_gettime function.]) + ]) +]) + +# Check for DOS-style pathnames. +pds_AC_DOS_PATHS + +# See if we have a standard version of gettimeofday(). Since actual +# implementations can differ, just make sure we have the most common +# one. +AC_CACHE_CHECK([for standard gettimeofday], [ac_cv_func_gettimeofday], + [ac_cv_func_gettimeofday=no + AC_RUN_IFELSE([AC_LANG_SOURCE([[#include + 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; + }]])], + [ac_cv_func_gettimeofday=yes], + [ac_cv_func_gettimeofday=no], + [ac_cv_func_gettimeofday="no (cross-compiling)"])]) +AS_IF([test "$ac_cv_func_gettimeofday" = yes], +[ AC_DEFINE([HAVE_GETTIMEOFDAY], [1], + [Define to 1 if you have a standard gettimeofday function]) +]) + +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 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 +# other problems. We'll just use our own. +AC_CHECK_DECLS([bsd_signal], [], [], [[#define _GNU_SOURCE 1 +#include ]]) + +AC_FUNC_FORK + +AC_FUNC_SETVBUF_REVERSED + +# 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. +AC_CHECK_FUNCS([strcasecmp strncasecmp strcmpi strncmpi stricmp strnicmp]) + +# strcoll() is used by the GNU glob library +AC_FUNC_STRCOLL +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 +AC_ARG_WITH([guile], [AS_HELP_STRING([--with-guile], + [Support GNU Guile for embedded scripting])]) + +# 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 "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 +/* NetBSD declares sys_siglist in unistd.h. */ +#if HAVE_UNISTD_H +# include +#endif +]) + + +# Check out the wait reality. +AC_CHECK_HEADERS([sys/wait.h],[],[],[[#include ]]) +AC_CHECK_FUNCS([waitpid wait3]) +AC_CACHE_CHECK([for union wait], [make_cv_union_wait], +[ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include +#include ]], + [[union wait status; int pid; pid = wait (&status); +#ifdef WEXITSTATUS +/* Some POSIXoid systems have both the new-style macros and the old + union wait type, and they do not work together. If union wait + conflicts with WEXITSTATUS et al, we don't want to use it at all. */ + if (WEXITSTATUS (status) != 0) pid = -1; +#ifdef WTERMSIG + /* If we have WEXITSTATUS and WTERMSIG, just use them on ints. */ + -- blow chunks here -- +#endif +#endif +#ifdef HAVE_WAITPID + /* Make sure union wait works with waitpid. */ + pid = waitpid (-1, &status, 0); +#endif + ]])], + [make_cv_union_wait=yes], + [make_cv_union_wait=no]) +]) +AS_IF([test "$make_cv_union_wait" = yes], +[ AC_DEFINE([HAVE_UNION_WAIT], [1], + [Define to 1 if you have the 'union wait' type in .]) +]) + + +# If we're building on Windows/DOS/OS/2, add some support for DOS drive specs. +AS_IF([test "$PATH_SEPARATOR" = ';'], +[ AC_DEFINE([HAVE_DOS_PATHS], [1], + [Define to 1 if your system requires backslashes or drive specs in pathnames.]) +]) + +# See if the user wants to use pmake's "customs" distributed build capability +AC_SUBST([REMOTE]) REMOTE=stub +use_customs=false +AC_ARG_WITH([customs], +[AC_HELP_STRING([--with-customs=DIR], + [enable remote jobs via Customs--see README.customs])], +[ AS_CASE([$withval], [n|no], [:], + [make_cppflags="$CPPFLAGS" + AS_CASE([$withval], + [y|ye|yes], [:], + [CPPFLAGS="$CPPFLAGS -I$with_customs/include/customs" + make_ldflags="$LDFLAGS -L$with_customs/lib"]) + CF_NETLIBS + AC_CHECK_HEADER([customs.h], + [use_customs=true + REMOTE=cstms + LIBS="$LIBS -lcustoms" LDFLAGS="$make_ldflags"], + [with_customs=no + CPPFLAGS="$make_cppflags" make_badcust=yes]) + ]) +]) + +# Tell automake about this, so it can include the right .c files. +AM_CONDITIONAL([USE_CUSTOMS], [test "$use_customs" = true]) + +# See if the user asked to handle case insensitive file systems. +AH_TEMPLATE([HAVE_CASE_INSENSITIVE_FS], [Use case insensitive file names]) +AC_ARG_ENABLE([case-insensitive-file-system], + AC_HELP_STRING([--enable-case-insensitive-file-system], + [assume file systems are case insensitive]), + [AS_IF([test "$enableval" = yes], [AC_DEFINE([HAVE_CASE_INSENSITIVE_FS])])]) + +# See if we can handle the job server feature, and if the user wants it. +AC_ARG_ENABLE([job-server], + AC_HELP_STRING([--disable-job-server], + [disallow recursive make communication during -jN]), + [make_cv_job_server="$enableval" user_job_server="$enableval"], + [make_cv_job_server="yes"]) + +AS_IF([test "$ac_cv_func_waitpid" = no && test "$ac_cv_func_wait3" = no], + [has_wait_nohang=no], + [has_wait_nohang=yes]) + +AC_CACHE_CHECK([for SA_RESTART], [make_cv_sa_restart], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[return SA_RESTART;]])], + [make_cv_sa_restart=yes], + [make_cv_sa_restart=no])]) + +AS_IF([test "$make_cv_sa_restart" != no], +[ AC_DEFINE([HAVE_SA_RESTART], [1], + [Define to 1 if defines the SA_RESTART constant.]) +]) + +# Only allow jobserver on systems that support it +AS_CASE([/$ac_cv_func_pipe/$ac_cv_func_sigaction/$make_cv_sa_restart/$has_wait_nohang/], + [*/no/*], [make_cv_job_server=no]) + +# Also supported on OS2 and MinGW +AS_CASE([$host_os], [os2*|mingw*], [make_cv_job_server=yes]) + +# If we support it and the user didn't disable it, build with jobserver +AS_CASE([/$make_cv_job_server/$user_job_server/], + [*/no/*], [: no jobserver], + [AC_DEFINE(MAKE_JOBSERVER, 1, + [Define to 1 to enable job server support in GNU make.]) + ]) + +# If dl*() functions are supported we can enable the load operation +AC_CHECK_DECLS([dlopen, dlsym, dlerror], [], [], + [[#include ]]) + +AC_ARG_ENABLE([load], + AC_HELP_STRING([--disable-load], + [disable support for the 'load' operation]), + [make_cv_load="$enableval" user_load="$enableval"], + [make_cv_load="yes"]) + +AS_CASE([/$ac_cv_have_decl_dlopen/$ac_cv_have_decl_dlsym/$ac_cv_have_decl_dlerror/], + [*/no/*], [make_cv_load=no]) + +# We might need -ldl +AS_IF([test "$make_cv_load" = yes], [ + AC_SEARCH_LIBS([dlopen], [dl], [], [make_cv_load=]) + ]) + +AS_CASE([/$make_cv_load/$user_load/], + [*/no/*], [make_cv_load=no], + [AC_DEFINE(MAKE_LOAD, 1, + [Define to 1 to enable 'load' support in GNU make.]) + ]) + +# If we want load support, we might need to link with export-dynamic. +# See if we can figure it out. Unfortunately this is very difficult. +# For example passing -rdynamic to the SunPRO linker gives a warning +# but succeeds and creates a shared object, not an executable! +AS_IF([test "$make_cv_load" = yes], [ + AC_MSG_CHECKING([If the linker accepts -Wl,--export-dynamic]) + old_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--export-dynamic" + AC_LINK_IFELSE([AC_LANG_SOURCE([int main(){}])], + [AC_MSG_RESULT([yes]) + AC_SUBST([AM_LDFLAGS], [-Wl,--export-dynamic])], + [AC_MSG_RESULT([no]) + AC_MSG_CHECKING([If the linker accepts -rdynamic]) + LDFLAGS="$old_LDFLAGS -rdynamic" + AC_LINK_IFELSE([AC_LANG_SOURCE([int main(){}])], + [AC_MSG_RESULT([yes]) + AC_SUBST([AM_LDFLAGS], [-rdynamic])], + [AC_MSG_RESULT([no])]) + ]) + LDFLAGS="$old_LDFLAGS" +]) + +# if we have both lstat() and readlink() then we can support symlink +# timechecks. +AS_IF([test "$ac_cv_func_lstat" = yes && test "$ac_cv_func_readlink" = yes], + [ AC_DEFINE([MAKE_SYMLINKS], [1], + [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 + #include + + 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], [ + AS_IF([test -f /usr/sccs/get], + [make_cv_path_sccs_get=/usr/sccs/get], + [make_cv_path_sccs_get=get]) +]) +AC_DEFINE_UNQUOTED([SCCS_GET], ["$make_cv_path_sccs_get"], + [Define to the name of the SCCS 'get' command.]) + +ac_clean_files="$ac_clean_files s.conftest conftoast" # Remove these later. +AS_IF([(/usr/sccs/admin -n s.conftest || admin -n s.conftest) >/dev/null 2>&1 && + test -f s.conftest], +[ # We successfully created an SCCS file. + AC_CACHE_CHECK([if SCCS get command understands -G], [make_cv_sys_get_minus_G], + [AS_IF([$make_cv_path_sccs_get -Gconftoast s.conftest >/dev/null 2>&1 && + test -f conftoast], + [make_cv_sys_get_minus_G=yes], + [make_cv_sys_get_minus_G=no]) + ]) + AS_IF([test "$make_cv_sys_get_minus_G" = yes], + [AC_DEFINE([SCCS_GET_MINUS_G], [1], + [Define to 1 if the SCCS 'get' command understands the '-G' option.]) + ]) +]) +rm -f s.conftest conftoast + +# Let the makefile know what our build host is + +AC_DEFINE_UNQUOTED([MAKE_HOST],["$host"],[Build host information.]) +MAKE_HOST="$host" +AC_SUBST([MAKE_HOST]) + +w32_target_env=no +AM_CONDITIONAL([WINDOWSENV], [false]) + +AS_CASE([$host], + [*-*-mingw32], + [AM_CONDITIONAL([WINDOWSENV], [true]) + w32_target_env=yes + AC_DEFINE([WINDOWS32], [1], [Use platform specific coding]) + AC_DEFINE([HAVE_DOS_PATHS], [1], [Use platform specific coding]) + ]) + +AC_DEFINE_UNQUOTED([PATH_SEPARATOR_CHAR],['$PATH_SEPARATOR'], + [Define to the character that separates directories in PATH.]) + +# Include the Maintainer's Makefile section, if it's here. + +MAINT_MAKEFILE=/dev/null +AS_IF([test -r "$srcdir/maintMakefile"], +[ MAINT_MAKEFILE="$srcdir/maintMakefile" +]) +AC_SUBST_FILE([MAINT_MAKEFILE]) + +# Allow building with dmalloc +AM_WITH_DMALLOC + +# Forcibly disable SET_MAKE. If it's set it breaks things like the test +# scripts, etc. +SET_MAKE= + +# Sanity check and inform the user of what we found + +AS_IF([test "x$make_badcust" = xyes], [ +echo +echo "WARNING: --with-customs specified but no customs.h could be found;" +echo " disabling Customs support." +echo +]) + +AS_CASE([$with_customs], +[""|n|no|y|ye|yes], [:], +[AS_IF([test -f "$with_customs/lib/libcustoms.a"], [:], +[ echo + echo "WARNING: '$with_customs/lib' does not appear to contain the" + echo " Customs library. You must build and install Customs" + echo " before compiling GNU make." + echo +])]) + +AS_IF([test "x$has_wait_nohang" = xno], +[ echo + echo "WARNING: Your system has neither waitpid() nor wait3()." + echo " Without one of these, signal handling is unreliable." + echo " You should be aware that running GNU make with -j" + echo " could result in erratic behavior." + echo +]) + +AS_IF([test "x$make_cv_job_server" = xno && test "x$user_job_server" = xyes], +[ echo + echo "WARNING: Make job server requires a POSIX-ish system that" + echo " supports the pipe(), sigaction(), and either" + echo " waitpid() or wait3() functions. Your system doesn't" + echo " appear to provide one or more of those." + echo " Disabling job server support." + echo +]) + +AS_IF([test "x$make_cv_load" = xno && test "x$user_load" = xyes], +[ echo + echo "WARNING: 'load' support requires a POSIX-ish system that" + echo " supports the dlopen(), dlsym(), and dlerror() functions." + echo " Your system doesn't appear to provide one or more of these." + echo " Disabling 'load' support." + 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 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 + +dnl Local Variables: +dnl comment-start: "dnl " +dnl comment-end: "" +dnl comment-start-skip: "\\bdnl\\b\\s *" +dnl compile-command: "make configure config.h.in" +dnl End: diff --git a/third_party/make/doc/Makefile.am b/third_party/make/doc/Makefile.am new file mode 100644 index 00000000000..7bcf1c2b898 --- /dev/null +++ b/third_party/make/doc/Makefile.am @@ -0,0 +1,24 @@ +# -*-Makefile-*-, or close enough +# 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 +# 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 . + +TEXI2HTML = texi2html +TEXI2HTML_FLAGS = -split_chapter + +info_TEXINFOS = make.texi +make_TEXINFOS = fdl.texi make-stds.texi + +CLEANFILES = make*.html diff --git a/third_party/make/doc/Makefile.in b/third_party/make/doc/Makefile.in new file mode 100644 index 00000000000..fcabd94e7b5 --- /dev/null +++ b/third_party/make/doc/Makefile.in @@ -0,0 +1,1324 @@ +# 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@ + +# -*-Makefile-*-, or close enough +# 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 +# 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 . +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 = doc +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 $(srcdir)/version.texi \ + $(srcdir)/stamp-vti $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/src/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_V_DVIPS = $(am__v_DVIPS_@AM_V@) +am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) +am__v_DVIPS_0 = @echo " DVIPS " $@; +am__v_DVIPS_1 = +AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) +am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) +am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; +am__v_MAKEINFO_1 = +AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) +am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) +am__v_INFOHTML_0 = @echo " INFOHTML" $@; +am__v_INFOHTML_1 = +AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) +am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) +am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; +am__v_TEXI2DVI_1 = +AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) +am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) +am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; +am__v_TEXI2PDF_1 = +AM_V_texinfo = $(am__v_texinfo_@AM_V@) +am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) +am__v_texinfo_0 = -q +am__v_texinfo_1 = +AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) +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)/build-aux/texinfo.tex +am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux +DVIS = make.dvi +PDFS = make.pdf +PSS = make.ps +HTMLS = make.html +TEXINFOS = make.texi +TEXI2DVI = texi2dvi +TEXI2PDF = $(TEXI2DVI) --pdf --batch +MAKEINFOHTML = $(MAKEINFO) --html +AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) +DVIPS = dvips +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__installdirs = "$(DESTDIR)$(infodir)" +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(make_TEXINFOS) $(srcdir)/Makefile.in \ + $(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@ +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@ +TEXI2HTML = texi2html +TEXI2HTML_FLAGS = -split_chapter +info_TEXINFOS = make.texi +make_TEXINFOS = fdl.texi make-stds.texi +CLEANFILES = make*.html +all: all-am + +.SUFFIXES: +.SUFFIXES: .dvi .html .info .pdf .ps .texi +$(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 doc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/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): + +.texi.info: + $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && $(am__cd) $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ + cd "$$am__cwd"; \ + if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $@ $<; \ + then \ + rc=0; \ + $(am__cd) $(srcdir); \ + else \ + rc=$$?; \ + $(am__cd) $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; exit $$rc + +.texi.dvi: + $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ + $< + +.texi.pdf: + $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ + $< + +.texi.html: + $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) + $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $(@:.html=.htp) $<; \ + then \ + rm -rf $@ && mv $(@:.html=.htp) $@; \ + else \ + rm -rf $(@:.html=.htp); exit 1; \ + fi +$(srcdir)/make.info: make.texi $(srcdir)/version.texi $(make_TEXINFOS) +make.dvi: make.texi $(srcdir)/version.texi $(make_TEXINFOS) +make.pdf: make.texi $(srcdir)/version.texi $(make_TEXINFOS) +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)/build-aux/mdate-sh $$dir/make.texi`; \ + echo "@set UPDATED $$1 $$2 $$3"; \ + echo "@set UPDATED-MONTH $$2 $$3"; \ + echo "@set EDITION $(VERSION)"; \ + echo "@set VERSION $(VERSION)") > vti.tmp$$$$ && \ + (cmp -s vti.tmp$$$$ $(srcdir)/version.texi \ + || (echo "Updating $(srcdir)/version.texi" && \ + cp vti.tmp$$$$ $(srcdir)/version.texi.tmp$$$$ && \ + mv $(srcdir)/version.texi.tmp$$$$ $(srcdir)/version.texi)) && \ + rm -f vti.tmp$$$$ $(srcdir)/version.texi.$$$$ + @cp $(srcdir)/version.texi $@ + +mostlyclean-vti: + -rm -f vti.tmp* $(srcdir)/version.texi.tmp* + +maintainer-clean-vti: + -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi +.dvi.ps: + $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(DVIPS) $(AM_V_texinfo) -o $@ $< + +uninstall-dvi-am: + @$(NORMAL_UNINSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ + rm -f "$(DESTDIR)$(dvidir)/$$f"; \ + done + +uninstall-html-am: + @$(NORMAL_UNINSTALL) + @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ + rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ + done + +uninstall-info-am: + @$(PRE_UNINSTALL) + @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ + if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ + then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ + done; \ + else :; fi + @$(NORMAL_UNINSTALL) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ + (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ + echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ + rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ + else :; fi); \ + done + +uninstall-pdf-am: + @$(NORMAL_UNINSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ + done + +uninstall-ps-am: + @$(NORMAL_UNINSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ + rm -f "$(DESTDIR)$(psdir)/$$f"; \ + done + +dist-info: $(INFO_DEPS) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + case $$base in \ + $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$base; then d=.; else d=$(srcdir); fi; \ + base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ + for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ + if test -f $$file; then \ + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f "$(distdir)/$$relfile" || \ + cp -p $$file "$(distdir)/$$relfile"; \ + else :; fi; \ + done; \ + done + +mostlyclean-aminfo: + -rm -rf make.t2d make.t2p + +clean-aminfo: + -test -z "make.dvi make.pdf make.ps make.html" \ + || rm -rf make.dvi make.pdf make.ps make.html + +maintainer-clean-aminfo: + @list='$(INFO_DEPS)'; for i in $$list; do \ + i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-info +check-am: all-am +check: check-am +all-am: Makefile $(INFO_DEPS) +installdirs: + for dir in "$(DESTDIR)$(infodir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +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: + -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) + +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-aminfo clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: $(DVIS) + +html: html-am + +html-am: $(HTMLS) + +info: info-am + +info-am: $(INFO_DEPS) + +install-data-am: install-info-am + +install-dvi: install-dvi-am + +install-dvi-am: $(DVIS) + @$(NORMAL_INSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ + done +install-exec-am: + +install-html: install-html-am + +install-html-am: $(HTMLS) + @$(NORMAL_INSTALL) + @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__strip_dir) \ + d2=$$d$$p; \ + if test -d "$$d2"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ + echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ + else \ + list2="$$list2 $$d2"; \ + fi; \ + done; \ + test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done; } +install-info: install-info-am + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ + fi; \ + for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ + for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ + $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ + if test -f $$ifile; then \ + echo "$$ifile"; \ + else : ; fi; \ + done; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done + @$(POST_INSTALL) + @if $(am__can_run_installinfo); then \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: $(PDFS) + @$(NORMAL_INSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done +install-ps: install-ps-am + +install-ps-am: $(PSS) + @$(NORMAL_INSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-aminfo mostlyclean-generic mostlyclean-vti + +pdf: pdf-am + +pdf-am: $(PDFS) + +ps: ps-am + +ps-am: $(PSS) + +uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-pdf-am uninstall-ps-am + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-aminfo clean-generic \ + cscopelist-am ctags-am dist-info 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-aminfo \ + maintainer-clean-generic maintainer-clean-vti mostlyclean \ + mostlyclean-aminfo mostlyclean-generic mostlyclean-vti pdf \ + pdf-am ps ps-am tags-am uninstall uninstall-am \ + uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-pdf-am uninstall-ps-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/third_party/make/doc/fdl.texi b/third_party/make/doc/fdl.texi new file mode 100644 index 00000000000..542edaad258 --- /dev/null +++ b/third_party/make/doc/fdl.texi @@ -0,0 +1,505 @@ +@c The GNU Free Documentation License. +@center Version 1.3, 3 November 2008 + +@c This file is intended to be included within another document, +@c hence no sectioning command or @node. + +@display +Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. +@uref{https://fsf.org/} + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document @dfn{free} in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The ``Document'', below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as ``you''. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, La@TeX{} input +format, SGML or XML using a publicly available +DTD, and standard-conforming simple HTML, +PostScript or PDF designed for human modification. Examples +of transparent image formats include PNG, XCF and +JPG@. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, SGML or +XML for which the DTD and/or processing tools are +not generally available, and the machine-generated HTML, +PostScript or PDF produced by some word processors for +output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The ``publisher'' means any person or entity that distributes copies +of the Document to the public. + +A section ``Entitled XYZ'' means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as ``Acknowledgements'', +``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' +of such a section when you modify the Document means that it remains a +section ``Entitled XYZ'' according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section Entitled ``History'', Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section Entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section to be Entitled ``Endorsements'' or +to conflict in title with any Invariant Section. + +@item +Preserve any Warranty Disclaimers. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled ``History'' +in the various original documents, forming one section Entitled +``History''; likewise combine any sections Entitled ``Acknowledgements'', +and any sections Entitled ``Dedications''. You must delete all +sections Entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an ``aggregate'' if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled ``Acknowledgements'', +``Dedications'', or ``History'', the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +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, receipt of a copy of some or all of the same material does +not give you any rights to use it. + +@item +FUTURE REVISIONS OF THIS LICENSE + +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{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 +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +@item +RELICENSING + +``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the +site means any set of copyrightable works thus published on the MMC +site. + +``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +``Incorporate'' means to publish or republish a Document, in whole or +in part, as part of another Document. + +An MMC is ``eligible for relicensing'' if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + +@end enumerate + +@page +@heading ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the ``with@dots{}Texts.''@: line with this: + +@smallexample +@group + with the Invariant Sections being @var{list their titles}, with + the Front-Cover Texts being @var{list}, and with the Back-Cover Texts + being @var{list}. +@end group +@end smallexample + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: diff --git a/third_party/make/doc/make-stds.texi b/third_party/make/doc/make-stds.texi new file mode 100644 index 00000000000..d37b24418d4 --- /dev/null +++ b/third_party/make/doc/make-stds.texi @@ -0,0 +1,1173 @@ +@comment This file is included by both standards.texi and make.texinfo. +@comment It was broken out of standards.texi on 1/6/93 by roland. + +@node Makefile Conventions +@chapter Makefile Conventions +@cindex makefile, conventions for +@cindex conventions for makefiles +@cindex standards for makefiles + +@c Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, +@c 2004, 2005, 2006, 2007, 2008, 2010, 2013, 2014, 2015 +@c Free Software Foundation, Inc. +@c +@c Permission is granted to copy, distribute and/or modify this document +@c under the terms of the GNU Free Documentation License, Version 1.3 +@c or any later version published by the Free Software Foundation; +@c with no Invariant Sections, with no +@c Front-Cover Texts, and with no Back-Cover Texts. +@c A copy of the license is included in the section entitled ``GNU +@c Free Documentation License''. + +This +@ifinfo +node +@end ifinfo +@iftex +@ifset CODESTD +section +@end ifset +@ifclear CODESTD +chapter +@end ifclear +@end iftex +describes conventions for writing the Makefiles for GNU programs. +Using Automake will help you write a Makefile that follows these +conventions. For more information on portable Makefiles, see +@sc{posix} and @ref{Portable Make, Portable Make Programming,, autoconf, +Autoconf}. + + +@menu +* Makefile Basics:: General conventions for Makefiles. +* Utilities in Makefiles:: Utilities to be used in Makefiles. +* Command Variables:: Variables for specifying commands. +* DESTDIR:: Supporting staged installs. +* Directory Variables:: Variables for installation directories. +* Standard Targets:: Standard targets for users. +* Install Command Categories:: Three categories of commands in the @samp{install} + rule: normal, pre-install and post-install. +@end menu + +@node Makefile Basics +@section General Conventions for Makefiles + +Every Makefile should contain this line: + +@example +SHELL = /bin/sh +@end example + +@noindent +to avoid trouble on systems where the @code{SHELL} variable might be +inherited from the environment. (This is never a problem with GNU +@code{make}.) + +Different @code{make} programs have incompatible suffix lists and +implicit rules, and this sometimes creates confusion or misbehavior. So +it is a good idea to set the suffix list explicitly using only the +suffixes you need in the particular Makefile, like this: + +@example +.SUFFIXES: +.SUFFIXES: .c .o +@end example + +@noindent +The first line clears out the suffix list, the second introduces all +suffixes which may be subject to implicit rules in this Makefile. + +Don't assume that @file{.} is in the path for command execution. When +you need to run programs that are a part of your package during the +make, please make sure that it uses @file{./} if the program is built as +part of the make or @file{$(srcdir)/} if the file is an unchanging part +of the source code. Without one of these prefixes, the current search +path is used. + +The distinction between @file{./} (the @dfn{build directory}) and +@file{$(srcdir)/} (the @dfn{source directory}) is important because +users can build in a separate directory using the @samp{--srcdir} option +to @file{configure}. A rule of the form: + +@smallexample +foo.1 : foo.man sedscript + sed -f sedscript foo.man > foo.1 +@end smallexample + +@noindent +will fail when the build directory is not the source directory, because +@file{foo.man} and @file{sedscript} are in the source directory. + +When using GNU @code{make}, relying on @samp{VPATH} to find the source +file will work in the case where there is a single dependency file, +since the @code{make} automatic variable @samp{$<} will represent the +source file wherever it is. (Many versions of @code{make} set @samp{$<} +only in implicit rules.) A Makefile target like + +@smallexample +foo.o : bar.c + $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o +@end smallexample + +@noindent +should instead be written as + +@smallexample +foo.o : bar.c + $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@@ +@end smallexample + +@noindent +in order to allow @samp{VPATH} to work correctly. When the target has +multiple dependencies, using an explicit @samp{$(srcdir)} is the easiest +way to make the rule work well. For example, the target above for +@file{foo.1} is best written as: + +@smallexample +foo.1 : foo.man sedscript + sed -f $(srcdir)/sedscript $(srcdir)/foo.man > $@@ +@end smallexample + +GNU distributions usually contain some files which are not source +files---for example, Info files, and the output from Autoconf, Automake, +Bison or Flex. Since these files normally appear in the source +directory, they should always appear in the source directory, not in the +build directory. So Makefile rules to update them should put the +updated files in the source directory. + +However, if a file does not appear in the distribution, then the +Makefile should not put it in the source directory, because building a +program in ordinary circumstances should not modify the source directory +in any way. + +Try to make the build and installation targets, at least (and all their +subtargets) work correctly with a parallel @code{make}. + +@node Utilities in Makefiles +@section Utilities in Makefiles + +Write the Makefile commands (and any shell scripts, such as +@code{configure}) to run under @code{sh} (both the traditional Bourne +shell and the @sc{posix} shell), not @code{csh}. Don't use any +special features of @code{ksh} or @code{bash}, or @sc{posix} features +not widely supported in traditional Bourne @code{sh}. + +The @code{configure} script and the Makefile rules for building and +installation should not use any utilities directly except these: + +@c dd find +@c gunzip gzip md5sum +@c mkfifo mknod tee uname + +@example +awk cat cmp cp diff echo egrep expr false grep install-info ln ls +mkdir mv printf pwd rm rmdir sed sleep sort tar test touch tr true +@end example + +Compression programs such as @code{gzip} can be used in the +@code{dist} rule. + +Generally, stick to the widely-supported (usually +@sc{posix}-specified) options and features of these programs. For +example, don't use @samp{mkdir -p}, convenient as it may be, because a +few systems don't support it at all and with others, it is not safe +for parallel execution. For a list of known incompatibilities, see +@ref{Portable Shell, Portable Shell Programming,, autoconf, Autoconf}. + + +It is a good idea to avoid creating symbolic links in makefiles, since a +few file systems don't support them. + +The Makefile rules for building and installation can also use compilers +and related programs, but should do so via @code{make} variables so that the +user can substitute alternatives. Here are some of the programs we +mean: + +@example +ar bison cc flex install ld ldconfig lex +make makeinfo ranlib texi2dvi yacc +@end example + +Use the following @code{make} variables to run those programs: + +@example +$(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LDCONFIG) $(LEX) +$(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC) +@end example + +When you use @code{ranlib} or @code{ldconfig}, you should make sure +nothing bad happens if the system does not have the program in question. +Arrange to ignore an error from that command, and print a message before +the command to tell the user that failure of this command does not mean +a problem. (The Autoconf @samp{AC_PROG_RANLIB} macro can help with +this.) + +If you use symbolic links, you should implement a fallback for systems +that don't have symbolic links. + +Additional utilities that can be used via Make variables are: + +@example +chgrp chmod chown mknod +@end example + +It is ok to use other utilities in Makefile portions (or scripts) +intended only for particular systems where you know those utilities +exist. + +@node Command Variables +@section Variables for Specifying Commands + +Makefiles should provide variables for overriding certain commands, options, +and so on. + +In particular, you should run most utility programs via variables. +Thus, if you use Bison, have a variable named @code{BISON} whose default +value is set with @samp{BISON = bison}, and refer to it with +@code{$(BISON)} whenever you need to use Bison. + +File management utilities such as @code{ln}, @code{rm}, @code{mv}, and +so on, need not be referred to through variables in this way, since users +don't need to replace them with other programs. + +Each program-name variable should come with an options variable that is +used to supply options to the program. Append @samp{FLAGS} to the +program-name variable name to get the options variable name---for +example, @code{BISONFLAGS}. (The names @code{CFLAGS} for the C +compiler, @code{YFLAGS} for yacc, and @code{LFLAGS} for lex, are +exceptions to this rule, but we keep them because they are standard.) +Use @code{CPPFLAGS} in any compilation command that runs the +preprocessor, and use @code{LDFLAGS} in any compilation command that +does linking as well as in any direct use of @code{ld}. + +If there are C compiler options that @emph{must} be used for proper +compilation of certain files, do not include them in @code{CFLAGS}. +Users expect to be able to specify @code{CFLAGS} freely themselves. +Instead, arrange to pass the necessary options to the C compiler +independently of @code{CFLAGS}, by writing them explicitly in the +compilation commands or by defining an implicit rule, like this: + +@smallexample +CFLAGS = -g +ALL_CFLAGS = -I. $(CFLAGS) +.c.o: + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< +@end smallexample + +Do include the @samp{-g} option in @code{CFLAGS}, because that is not +@emph{required} for proper compilation. You can consider it a default +that is only recommended. If the package is set up so that it is +compiled with GCC by default, then you might as well include @samp{-O} +in the default value of @code{CFLAGS} as well. + +Put @code{CFLAGS} last in the compilation command, after other variables +containing compiler options, so the user can use @code{CFLAGS} to +override the others. + +@code{CFLAGS} should be used in every invocation of the C compiler, +both those which do compilation and those which do linking. + +Every Makefile should define the variable @code{INSTALL}, which is the +basic command for installing a file into the system. + +Every Makefile should also define the variables @code{INSTALL_PROGRAM} +and @code{INSTALL_DATA}. (The default for @code{INSTALL_PROGRAM} should +be @code{$(INSTALL)}; the default for @code{INSTALL_DATA} should be +@code{$@{INSTALL@} -m 644}.) Then it should use those variables as the +commands for actual installation, for executables and non-executables +respectively. Minimal use of these variables is as follows: + +@example +$(INSTALL_PROGRAM) foo $(bindir)/foo +$(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a +@end example + +However, it is preferable to support a @code{DESTDIR} prefix on the +target files, as explained in the next section. + +It is acceptable, but not required, to install multiple files in one +command, with the final argument being a directory, as in: + +@example +$(INSTALL_PROGRAM) foo bar baz $(bindir) +@end example + + +@node DESTDIR +@section @code{DESTDIR}: Support for Staged Installs + +@vindex DESTDIR +@cindex staged installs +@cindex installations, staged + +@code{DESTDIR} is a variable prepended to each installed target file, +like this: + +@example +$(INSTALL_PROGRAM) foo $(DESTDIR)$(bindir)/foo +$(INSTALL_DATA) libfoo.a $(DESTDIR)$(libdir)/libfoo.a +@end example + +The @code{DESTDIR} variable is specified by the user on the @code{make} +command line as an absolute file name. For example: + +@example +make DESTDIR=/tmp/stage install +@end example + +@noindent +@code{DESTDIR} should be supported only in the @code{install*} and +@code{uninstall*} targets, as those are the only targets where it is +useful. + +If your installation step would normally install +@file{/usr/local/bin/foo} and @file{/usr/@/local/@/lib/@/libfoo.a}, then an +installation invoked as in the example above would install +@file{/tmp/stage/usr/local/bin/foo} and +@file{/tmp/stage/usr/local/lib/libfoo.a} instead. + +Prepending the variable @code{DESTDIR} to each target in this way +provides for @dfn{staged installs}, where the installed files are not +placed directly into their expected location but are instead copied +into a temporary location (@code{DESTDIR}). However, installed files +maintain their relative directory structure and any embedded file names +will not be modified. + +You should not set the value of @code{DESTDIR} in your @file{Makefile} +at all; then the files are installed into their expected locations by +default. Also, specifying @code{DESTDIR} should not change the +operation of the software in any way, so its value should not be +included in any file contents. + +@code{DESTDIR} support is commonly used in package creation. It is +also helpful to users who want to understand what a given package will +install where, and to allow users who don't normally have permissions +to install into protected areas to build and install before gaining +those permissions. Finally, it can be useful with tools such as +@code{stow}, where code is installed in one place but made to appear +to be installed somewhere else using symbolic links or special mount +operations. So, we strongly recommend GNU packages support +@code{DESTDIR}, though it is not an absolute requirement. + + +@node Directory Variables +@section Variables for Installation Directories + +Installation directories should always be named by variables, so it is +easy to install in a nonstandard place. The standard names for these +variables and the values they should have in GNU packages are +described below. They are based on a standard file system layout; +variants of it are used in GNU/Linux and other modern operating +systems. + +Installers are expected to override these values when calling +@command{make} (e.g., @kbd{make prefix=/usr install}) or +@command{configure} (e.g., @kbd{configure --prefix=/usr}). GNU +packages should not try to guess which value should be appropriate for +these variables on the system they are being installed onto: use the +default settings specified here so that all GNU packages behave +identically, allowing the installer to achieve any desired layout. + +@cindex directories, creating installation +@cindex installation directories, creating +All installation directories, and their parent directories, should be +created (if necessary) before they are installed into. + +These first two variables set the root for the installation. All the +other installation directories should be subdirectories of one of +these two, and nothing should be directly installed into these two +directories. + +@table @code +@item prefix +@vindex prefix +A prefix used in constructing the default values of the variables listed +below. The default value of @code{prefix} should be @file{/usr/local}. +When building the complete GNU system, the prefix will be empty and +@file{/usr} will be a symbolic link to @file{/}. +(If you are using Autoconf, write it as @samp{@@prefix@@}.) + +Running @samp{make install} with a different value of @code{prefix} from +the one used to build the program should @emph{not} recompile the +program. + +@item exec_prefix +@vindex exec_prefix +A prefix used in constructing the default values of some of the +variables listed below. The default value of @code{exec_prefix} should +be @code{$(prefix)}. +(If you are using Autoconf, write it as @samp{@@exec_prefix@@}.) + +Generally, @code{$(exec_prefix)} is used for directories that contain +machine-specific files (such as executables and subroutine libraries), +while @code{$(prefix)} is used directly for other directories. + +Running @samp{make install} with a different value of @code{exec_prefix} +from the one used to build the program should @emph{not} recompile the +program. +@end table + +Executable programs are installed in one of the following directories. + +@table @code +@item bindir +@vindex bindir +The directory for installing executable programs that users can run. +This should normally be @file{/usr/local/bin}, but write it as +@file{$(exec_prefix)/bin}. +(If you are using Autoconf, write it as @samp{@@bindir@@}.) + +@item sbindir +@vindex sbindir +The directory for installing executable programs that can be run from +the shell, but are only generally useful to system administrators. This +should normally be @file{/usr/local/sbin}, but write it as +@file{$(exec_prefix)/sbin}. +(If you are using Autoconf, write it as @samp{@@sbindir@@}.) + +@item libexecdir +@vindex libexecdir +@comment This paragraph adjusted to avoid overfull hbox --roland 5jul94 +The directory for installing executable programs to be run by other +programs rather than by users. This directory should normally be +@file{/usr/local/libexec}, but write it as @file{$(exec_prefix)/libexec}. +(If you are using Autoconf, write it as @samp{@@libexecdir@@}.) + +The definition of @samp{libexecdir} is the same for all packages, so +you should install your data in a subdirectory thereof. Most packages +install their data under @file{$(libexecdir)/@var{package-name}/}, +possibly within additional subdirectories thereof, such as +@file{$(libexecdir)/@var{package-name}/@var{machine}/@var{version}}. +@end table + +Data files used by the program during its execution are divided into +categories in two ways. + +@itemize @bullet +@item +Some files are normally modified by programs; others are never normally +modified (though users may edit some of these). + +@item +Some files are architecture-independent and can be shared by all +machines at a site; some are architecture-dependent and can be shared +only by machines of the same kind and operating system; others may never +be shared between two machines. +@end itemize + +This makes for six different possibilities. However, we want to +discourage the use of architecture-dependent files, aside from object +files and libraries. It is much cleaner to make other data files +architecture-independent, and it is generally not hard. + +Here are the variables Makefiles should use to specify directories +to put these various kinds of files in: + +@table @samp +@item datarootdir +The root of the directory tree for read-only architecture-independent +data files. This should normally be @file{/usr/local/share}, but +write it as @file{$(prefix)/share}. (If you are using Autoconf, write +it as @samp{@@datarootdir@@}.) @samp{datadir}'s default value is +based on this variable; so are @samp{infodir}, @samp{mandir}, and +others. + +@item datadir +The directory for installing idiosyncratic read-only +architecture-independent data files for this program. This is usually +the same place as @samp{datarootdir}, but we use the two separate +variables so that you can move these program-specific files without +altering the location for Info files, man pages, etc. + +@c raggedright (not until next Texinfo release) +This should normally be @file{/usr/local/share}, but write it as +@file{$(datarootdir)}. (If you are using Autoconf, write it as +@samp{@@datadir@@}.) +@c end raggedright + +The definition of @samp{datadir} is the same for all packages, so you +should install your data in a subdirectory thereof. Most packages +install their data under @file{$(datadir)/@var{package-name}/}. + +@item sysconfdir +The directory for installing read-only data files that pertain to a +single machine--that is to say, files for configuring a host. Mailer +and network configuration files, @file{/etc/passwd}, and so forth belong +here. All the files in this directory should be ordinary ASCII text +files. This directory should normally be @file{/usr/local/etc}, but +write it as @file{$(prefix)/etc}. +(If you are using Autoconf, write it as @samp{@@sysconfdir@@}.) + +Do not install executables here in this directory (they probably belong +in @file{$(libexecdir)} or @file{$(sbindir)}). Also do not install +files that are modified in the normal course of their use (programs +whose purpose is to change the configuration of the system excluded). +Those probably belong in @file{$(localstatedir)}. + +@item sharedstatedir +The directory for installing architecture-independent data files which +the programs modify while they run. This should normally be +@file{/usr/local/com}, but write it as @file{$(prefix)/com}. +(If you are using Autoconf, write it as @samp{@@sharedstatedir@@}.) + +@item localstatedir +The directory for installing data files which the programs modify while +they run, and that pertain to one specific machine. Users should never +need to modify files in this directory to configure the package's +operation; put such configuration information in separate files that go +in @file{$(datadir)} or @file{$(sysconfdir)}. @file{$(localstatedir)} +should normally be @file{/usr/local/var}, but write it as +@file{$(prefix)/var}. +(If you are using Autoconf, write it as @samp{@@localstatedir@@}.) + +@item runstatedir +The directory for installing data files which the programs modify +while they run, that pertain to one specific machine, and which need +not persist longer than the execution of the program---which is +generally long-lived, for example, until the next reboot. PID files +for system daemons are a typical use. In addition, this directory +should not be cleaned except perhaps at reboot, while the general +@file{/tmp} (@code{TMPDIR}) may be cleaned arbitrarily. This should +normally be @file{/var/run}, but write it as +@file{$(localstatedir)/run}. Having it as a separate variable allows +the use of @file{/run} if desired, for example. (If you are using +Autoconf 2.70 or later, write it as @samp{@@runstatedir@@}.) +@end table + +These variables specify the directory for installing certain specific +types of files, if your program has them. Every GNU package should +have Info files, so every program needs @samp{infodir}, but not all +need @samp{libdir} or @samp{lispdir}. + +@table @samp +@item includedir +The directory for installing header files to be included by user +programs with the C @samp{#include} preprocessor directive. This +should normally be @file{/usr/local/include}, but write it as +@file{$(prefix)/include}. +(If you are using Autoconf, write it as @samp{@@includedir@@}.) + +Most compilers other than GCC do not look for header files in directory +@file{/usr/local/include}. So installing the header files this way is +only useful with GCC. Sometimes this is not a problem because some +libraries are only really intended to work with GCC. But some libraries +are intended to work with other compilers. They should install their +header files in two places, one specified by @code{includedir} and one +specified by @code{oldincludedir}. + +@item oldincludedir +The directory for installing @samp{#include} header files for use with +compilers other than GCC. This should normally be @file{/usr/include}. +(If you are using Autoconf, you can write it as @samp{@@oldincludedir@@}.) + +The Makefile commands should check whether the value of +@code{oldincludedir} is empty. If it is, they should not try to use +it; they should cancel the second installation of the header files. + +A package should not replace an existing header in this directory unless +the header came from the same package. Thus, if your Foo package +provides a header file @file{foo.h}, then it should install the header +file in the @code{oldincludedir} directory if either (1) there is no +@file{foo.h} there or (2) the @file{foo.h} that exists came from the Foo +package. + +To tell whether @file{foo.h} came from the Foo package, put a magic +string in the file---part of a comment---and @code{grep} for that string. + +@item docdir +The directory for installing documentation files (other than Info) for +this package. By default, it should be +@file{/usr/local/share/doc/@var{yourpkg}}, but it should be written as +@file{$(datarootdir)/doc/@var{yourpkg}}. (If you are using Autoconf, +write it as @samp{@@docdir@@}.) The @var{yourpkg} subdirectory, which +may include a version number, prevents collisions among files with +common names, such as @file{README}. + +@item infodir +The directory for installing the Info files for this package. By +default, it should be @file{/usr/local/share/info}, but it should be +written as @file{$(datarootdir)/info}. (If you are using Autoconf, +write it as @samp{@@infodir@@}.) @code{infodir} is separate from +@code{docdir} for compatibility with existing practice. + +@item htmldir +@itemx dvidir +@itemx pdfdir +@itemx psdir +Directories for installing documentation files in the particular +format. They should all be set to @code{$(docdir)} by default. (If +you are using Autoconf, write them as @samp{@@htmldir@@}, +@samp{@@dvidir@@}, etc.) Packages which supply several translations +of their documentation should install them in +@samp{$(htmldir)/}@var{ll}, @samp{$(pdfdir)/}@var{ll}, etc. where +@var{ll} is a locale abbreviation such as @samp{en} or @samp{pt_BR}. + +@item libdir +The directory for object files and libraries of object code. Do not +install executables here, they probably ought to go in @file{$(libexecdir)} +instead. The value of @code{libdir} should normally be +@file{/usr/local/lib}, but write it as @file{$(exec_prefix)/lib}. +(If you are using Autoconf, write it as @samp{@@libdir@@}.) + +@item lispdir +The directory for installing any Emacs Lisp files in this package. By +default, it should be @file{/usr/local/share/emacs/site-lisp}, but it +should be written as @file{$(datarootdir)/emacs/site-lisp}. + +If you are using Autoconf, write the default as @samp{@@lispdir@@}. +In order to make @samp{@@lispdir@@} work, you need the following lines +in your @file{configure.ac} file: + +@example +lispdir='$@{datarootdir@}/emacs/site-lisp' +AC_SUBST(lispdir) +@end example + +@item localedir +The directory for installing locale-specific message catalogs for this +package. By default, it should be @file{/usr/local/share/locale}, but +it should be written as @file{$(datarootdir)/locale}. (If you are +using Autoconf, write it as @samp{@@localedir@@}.) This directory +usually has a subdirectory per locale. +@end table + +Unix-style man pages are installed in one of the following: + +@table @samp +@item mandir +The top-level directory for installing the man pages (if any) for this +package. It will normally be @file{/usr/local/share/man}, but you +should write it as @file{$(datarootdir)/man}. (If you are using +Autoconf, write it as @samp{@@mandir@@}.) + +@item man1dir +The directory for installing section 1 man pages. Write it as +@file{$(mandir)/man1}. +@item man2dir +The directory for installing section 2 man pages. Write it as +@file{$(mandir)/man2} +@item @dots{} + +@strong{Don't make the primary documentation for any GNU software be a +man page. Write a manual in Texinfo instead. Man pages are just for +the sake of people running GNU software on Unix, which is a secondary +application only.} + +@item manext +The file name extension for the installed man page. This should contain +a period followed by the appropriate digit; it should normally be @samp{.1}. + +@item man1ext +The file name extension for installed section 1 man pages. +@item man2ext +The file name extension for installed section 2 man pages. +@item @dots{} +Use these names instead of @samp{manext} if the package needs to install man +pages in more than one section of the manual. +@end table + +And finally, you should set the following variable: + +@table @samp +@item srcdir +The directory for the sources being compiled. The value of this +variable is normally inserted by the @code{configure} shell script. +(If you are using Autoconf, use @samp{srcdir = @@srcdir@@}.) +@end table + +For example: + +@smallexample +@c I have changed some of the comments here slightly to fix an overfull +@c hbox, so the make manual can format correctly. --roland +# Common prefix for installation directories. +# NOTE: This directory must exist when you start the install. +prefix = /usr/local +datarootdir = $(prefix)/share +datadir = $(datarootdir) +exec_prefix = $(prefix) +# Where to put the executable for the command 'gcc'. +bindir = $(exec_prefix)/bin +# Where to put the directories used by the compiler. +libexecdir = $(exec_prefix)/libexec +# Where to put the Info files. +infodir = $(datarootdir)/info +@end smallexample + +If your program installs a large number of files into one of the +standard user-specified directories, it might be useful to group them +into a subdirectory particular to that program. If you do this, you +should write the @code{install} rule to create these subdirectories. + +Do not expect the user to include the subdirectory name in the value of +any of the variables listed above. The idea of having a uniform set of +variable names for installation directories is to enable the user to +specify the exact same values for several different GNU packages. In +order for this to be useful, all the packages must be designed so that +they will work sensibly when the user does so. + +At times, not all of these variables may be implemented in the current +release of Autoconf and/or Automake; but as of Autoconf@tie{}2.60, we +believe all of them are. When any are missing, the descriptions here +serve as specifications for what Autoconf will implement. As a +programmer, you can either use a development version of Autoconf or +avoid using these variables until a stable release is made which +supports them. + + +@node Standard Targets +@section Standard Targets for Users + +All GNU programs should have the following targets in their Makefiles: + +@table @samp +@item all +Compile the entire program. This should be the default target. This +target need not rebuild any documentation files; Info files should +normally be included in the distribution, and DVI (and other +documentation format) files should be made only when explicitly asked +for. + +By default, the Make rules should compile and link with @samp{-g}, so +that executable programs have debugging symbols. Otherwise, you are +essentially helpless in the face of a crash, and it is often far from +easy to reproduce with a fresh build. + +@item install +Compile the program and copy the executables, libraries, and so on to +the file names where they should reside for actual use. If there is a +simple test to verify that a program is properly installed, this target +should run that test. + +Do not strip executables when installing them. This helps eventual +debugging that may be needed later, and nowadays disk space is cheap +and dynamic loaders typically ensure debug sections are not loaded during +normal execution. Users that need stripped binaries may invoke the +@code{install-strip} target to do that. + +If possible, write the @code{install} target rule so that it does not +modify anything in the directory where the program was built, provided +@samp{make all} has just been done. This is convenient for building the +program under one user name and installing it under another. + +The commands should create all the directories in which files are to be +installed, if they don't already exist. This includes the directories +specified as the values of the variables @code{prefix} and +@code{exec_prefix}, as well as all subdirectories that are needed. +One way to do this is by means of an @code{installdirs} target +as described below. + +Use @samp{-} before any command for installing a man page, so that +@code{make} will ignore any errors. This is in case there are systems +that don't have the Unix man page documentation system installed. + +The way to install Info files is to copy them into @file{$(infodir)} +with @code{$(INSTALL_DATA)} (@pxref{Command Variables}), and then run +the @code{install-info} program if it is present. @code{install-info} +is a program that edits the Info @file{dir} file to add or update the +menu entry for the given Info file; it is part of the Texinfo package. + +Here is a sample rule to install an Info file that also tries to +handle some additional situations, such as @code{install-info} not +being present. + +@comment This example has been carefully formatted for the Make manual. +@comment Please do not reformat it without talking to bug-make@gnu.org. +@smallexample +do-install-info: foo.info installdirs + $(NORMAL_INSTALL) +# Prefer an info file in . to one in srcdir. + if test -f foo.info; then d=.; \ + else d="$(srcdir)"; fi; \ + $(INSTALL_DATA) $$d/foo.info \ + "$(DESTDIR)$(infodir)/foo.info" +# Run install-info only if it exists. +# Use 'if' instead of just prepending '-' to the +# line so we notice real errors from install-info. +# Use '$(SHELL) -c' because some shells do not +# fail gracefully when there is an unknown command. + $(POST_INSTALL) + if $(SHELL) -c 'install-info --version' \ + >/dev/null 2>&1; then \ + install-info --dir-file="$(DESTDIR)$(infodir)/dir" \ + "$(DESTDIR)$(infodir)/foo.info"; \ + else true; fi +@end smallexample + +When writing the @code{install} target, you must classify all the +commands into three categories: normal ones, @dfn{pre-installation} +commands and @dfn{post-installation} commands. @xref{Install Command +Categories}. + +@item install-html +@itemx install-dvi +@itemx install-pdf +@itemx install-ps +These targets install documentation in formats other than Info; +they're intended to be called explicitly by the person installing the +package, if that format is desired. GNU prefers Info files, so these +must be installed by the @code{install} target. + +When you have many documentation files to install, we recommend that +you avoid collisions and clutter by arranging for these targets to +install in subdirectories of the appropriate installation directory, +such as @code{htmldir}. As one example, if your package has multiple +manuals, and you wish to install HTML documentation with many files +(such as the ``split'' mode output by @code{makeinfo --html}), you'll +certainly want to use subdirectories, or two nodes with the same name +in different manuals will overwrite each other. + +Please make these @code{install-@var{format}} targets invoke the +commands for the @var{format} target, for example, by making +@var{format} a dependency. + +@item uninstall +Delete all the installed files---the copies that the @samp{install} +and @samp{install-*} targets create. + +This rule should not modify the directories where compilation is done, +only the directories where files are installed. + +The uninstallation commands are divided into three categories, just like +the installation commands. @xref{Install Command Categories}. + +@item install-strip +Like @code{install}, but strip the executable files while installing +them. In simple cases, this target can use the @code{install} target in +a simple way: + +@smallexample +install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \ + install +@end smallexample + +But if the package installs scripts as well as real executables, the +@code{install-strip} target can't just refer to the @code{install} +target; it has to strip the executables but not the scripts. + +@code{install-strip} should not strip the executables in the build +directory which are being copied for installation. It should only strip +the copies that are installed. + +Normally we do not recommend stripping an executable unless you are sure +the program has no bugs. However, it can be reasonable to install a +stripped executable for actual execution while saving the unstripped +executable elsewhere in case there is a bug. + +@item clean +Delete all files in the current directory that are normally created by +building the program. Also delete files in other directories if they +are created by this makefile. However, don't delete the files that +record the configuration. Also preserve files that could be made by +building, but normally aren't because the distribution comes with +them. There is no need to delete parent directories that were created +with @samp{mkdir -p}, since they could have existed anyway. + +Delete @file{.dvi} files here if they are not part of the distribution. + +@item distclean +Delete all files in the current directory (or created by this +makefile) that are created by configuring or building the program. If +you have unpacked the source and built the program without creating +any other files, @samp{make distclean} should leave only the files +that were in the distribution. However, there is no need to delete +parent directories that were created with @samp{mkdir -p}, since they +could have existed anyway. + +@item mostlyclean +Like @samp{clean}, but may refrain from deleting a few files that people +normally don't want to recompile. For example, the @samp{mostlyclean} +target for GCC does not delete @file{libgcc.a}, because recompiling it +is rarely necessary and takes a lot of time. + +@item maintainer-clean +Delete almost everything that can be reconstructed with this Makefile. +This typically includes everything deleted by @code{distclean}, plus +more: C source files produced by Bison, tags tables, Info files, and +so on. + +The reason we say ``almost everything'' is that running the command +@samp{make maintainer-clean} should not delete @file{configure} even +if @file{configure} can be remade using a rule in the Makefile. More +generally, @samp{make maintainer-clean} should not delete anything +that needs to exist in order to run @file{configure} and then begin to +build the program. Also, there is no need to delete parent +directories that were created with @samp{mkdir -p}, since they could +have existed anyway. These are the only exceptions; +@code{maintainer-clean} should delete everything else that can be +rebuilt. + +The @samp{maintainer-clean} target is intended to be used by a maintainer of +the package, not by ordinary users. You may need special tools to +reconstruct some of the files that @samp{make maintainer-clean} deletes. +Since these files are normally included in the distribution, we don't +take care to make them easy to reconstruct. If you find you need to +unpack the full distribution again, don't blame us. + +To help make users aware of this, the commands for the special +@code{maintainer-clean} target should start with these two: + +@smallexample +@@echo 'This command is intended for maintainers to use; it' +@@echo 'deletes files that may need special tools to rebuild.' +@end smallexample + +@item TAGS +Update a tags table for this program. +@c ADR: how? + +@item info +Generate any Info files needed. The best way to write the rules is as +follows: + +@smallexample +info: foo.info + +foo.info: foo.texi chap1.texi chap2.texi + $(MAKEINFO) $(srcdir)/foo.texi +@end smallexample + +@noindent +You must define the variable @code{MAKEINFO} in the Makefile. It should +run the @code{makeinfo} program, which is part of the Texinfo +distribution. + +Normally a GNU distribution comes with Info files, and that means the +Info files are present in the source directory. Therefore, the Make +rule for an info file should update it in the source directory. When +users build the package, ordinarily Make will not update the Info files +because they will already be up to date. + +@item dvi +@itemx html +@itemx pdf +@itemx ps +Generate documentation files in the given format. These targets +should always exist, but any or all can be a no-op if the given output +format cannot be generated. These targets should not be dependencies +of the @code{all} target; the user must manually invoke them. + +Here's an example rule for generating DVI files from Texinfo: + +@smallexample +dvi: foo.dvi + +foo.dvi: foo.texi chap1.texi chap2.texi + $(TEXI2DVI) $(srcdir)/foo.texi +@end smallexample + +@noindent +You must define the variable @code{TEXI2DVI} in the Makefile. It +should run the program @code{texi2dvi}, which is part of the Texinfo +distribution. (@code{texi2dvi} uses @TeX{} to do the real work of +formatting. @TeX{} is not distributed with Texinfo.) Alternatively, +write only the dependencies, and allow GNU @code{make} to provide the +command. + +Here's another example, this one for generating HTML from Texinfo: + +@smallexample +html: foo.html + +foo.html: foo.texi chap1.texi chap2.texi + $(TEXI2HTML) $(srcdir)/foo.texi +@end smallexample + +@noindent +Again, you would define the variable @code{TEXI2HTML} in the Makefile; +for example, it might run @code{makeinfo --no-split --html} +(@command{makeinfo} is part of the Texinfo distribution). + +@item dist +Create a distribution tar file for this program. The tar file should be +set up so that the file names in the tar file start with a subdirectory +name which is the name of the package it is a distribution for. This +name can include the version number. + +For example, the distribution tar file of GCC version 1.40 unpacks into +a subdirectory named @file{gcc-1.40}. + +The easiest way to do this is to create a subdirectory appropriately +named, use @code{ln} or @code{cp} to install the proper files in it, and +then @code{tar} that subdirectory. + +Compress the tar file with @code{gzip}. For example, the actual +distribution file for GCC version 1.40 is called @file{gcc-1.40.tar.gz}. +It is ok to support other free compression formats as well. + +The @code{dist} target should explicitly depend on all non-source files +that are in the distribution, to make sure they are up to date in the +distribution. +@ifset CODESTD +@xref{Releases, , Making Releases}. +@end ifset +@ifclear CODESTD +@xref{Releases, , Making Releases, standards, GNU Coding Standards}. +@end ifclear + +@item check +Perform self-tests (if any). The user must build the program before +running the tests, but need not install the program; you should write +the self-tests so that they work when the program is built but not +installed. +@end table + +The following targets are suggested as conventional names, for programs +in which they are useful. + +@table @code +@item installcheck +Perform installation tests (if any). The user must build and install +the program before running the tests. You should not assume that +@file{$(bindir)} is in the search path. + +@item installdirs +It's useful to add a target named @samp{installdirs} to create the +directories where files are installed, and their parent directories. +There is a script called @file{mkinstalldirs} which is convenient for +this; you can find it in the Gnulib package. +You can use a rule like this: + +@comment This has been carefully formatted to look decent in the Make manual. +@comment Please be sure not to make it extend any further to the right.--roland +@smallexample +# Make sure all installation directories (e.g. $(bindir)) +# actually exist by making them if necessary. +installdirs: mkinstalldirs + $(srcdir)/mkinstalldirs $(bindir) $(datadir) \ + $(libdir) $(infodir) \ + $(mandir) +@end smallexample + +@noindent +or, if you wish to support @env{DESTDIR} (strongly encouraged), + +@smallexample +# Make sure all installation directories (e.g. $(bindir)) +# actually exist by making them if necessary. +installdirs: mkinstalldirs + $(srcdir)/mkinstalldirs \ + $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) \ + $(DESTDIR)$(libdir) $(DESTDIR)$(infodir) \ + $(DESTDIR)$(mandir) +@end smallexample + +This rule should not modify the directories where compilation is done. +It should do nothing but create installation directories. +@end table + +@node Install Command Categories +@section Install Command Categories + +@cindex pre-installation commands +@cindex post-installation commands +When writing the @code{install} target, you must classify all the +commands into three categories: normal ones, @dfn{pre-installation} +commands and @dfn{post-installation} commands. + +Normal commands move files into their proper places, and set their +modes. They may not alter any files except the ones that come entirely +from the package they belong to. + +Pre-installation and post-installation commands may alter other files; +in particular, they can edit global configuration files or data bases. + +Pre-installation commands are typically executed before the normal +commands, and post-installation commands are typically run after the +normal commands. + +The most common use for a post-installation command is to run +@code{install-info}. This cannot be done with a normal command, since +it alters a file (the Info directory) which does not come entirely and +solely from the package being installed. It is a post-installation +command because it needs to be done after the normal command which +installs the package's Info files. + +Most programs don't need any pre-installation commands, but we have the +feature just in case it is needed. + +To classify the commands in the @code{install} rule into these three +categories, insert @dfn{category lines} among them. A category line +specifies the category for the commands that follow. + +A category line consists of a tab and a reference to a special Make +variable, plus an optional comment at the end. There are three +variables you can use, one for each category; the variable name +specifies the category. Category lines are no-ops in ordinary execution +because these three Make variables are normally undefined (and you +@emph{should not} define them in the makefile). + +Here are the three possible category lines, each with a comment that +explains what it means: + +@smallexample + $(PRE_INSTALL) # @r{Pre-install commands follow.} + $(POST_INSTALL) # @r{Post-install commands follow.} + $(NORMAL_INSTALL) # @r{Normal commands follow.} +@end smallexample + +If you don't use a category line at the beginning of the @code{install} +rule, all the commands are classified as normal until the first category +line. If you don't use any category lines, all the commands are +classified as normal. + +These are the category lines for @code{uninstall}: + +@smallexample + $(PRE_UNINSTALL) # @r{Pre-uninstall commands follow.} + $(POST_UNINSTALL) # @r{Post-uninstall commands follow.} + $(NORMAL_UNINSTALL) # @r{Normal commands follow.} +@end smallexample + +Typically, a pre-uninstall command would be used for deleting entries +from the Info directory. + +If the @code{install} or @code{uninstall} target has any dependencies +which act as subroutines of installation, then you should start +@emph{each} dependency's commands with a category line, and start the +main target's commands with a category line also. This way, you can +ensure that each command is placed in the right category regardless of +which of the dependencies actually run. + +Pre-installation and post-installation commands should not run any +programs except for these: + +@example +[ basename bash cat chgrp chmod chown cmp cp dd diff echo +egrep expand expr false fgrep find getopt grep gunzip gzip +hostname install install-info kill ldconfig ln ls md5sum +mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee +test touch true uname xargs yes +@end example + +@cindex binary packages +The reason for distinguishing the commands in this way is for the sake +of making binary packages. Typically a binary package contains all the +executables and other files that need to be installed, and has its own +method of installing them---so it does not need to run the normal +installation commands. But installing the binary package does need to +execute the pre-installation and post-installation commands. + +Programs to build binary packages work by extracting the +pre-installation and post-installation commands. Here is one way of +extracting the pre-installation commands (the @option{-s} option to +@command{make} is needed to silence messages about entering +subdirectories): + +@smallexample +make -s -n install -o all \ + PRE_INSTALL=pre-install \ + POST_INSTALL=post-install \ + NORMAL_INSTALL=normal-install \ + | gawk -f pre-install.awk +@end smallexample + +@noindent +where the file @file{pre-install.awk} could contain this: + +@smallexample +$0 ~ /^(normal-install|post-install)[ \t]*$/ @{on = 0@} +on @{print $0@} +$0 ~ /^pre-install[ \t]*$/ @{on = 1@} +@end smallexample diff --git a/third_party/make/doc/make.1 b/third_party/make/doc/make.1 new file mode 100644 index 00000000000..dbd023fa4a8 --- /dev/null +++ b/third_party/make/doc/make.1 @@ -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/ . diff --git a/third_party/make/doc/make.info b/third_party/make/doc/make.info new file mode 100644 index 00000000000..b84710fd6f2 --- /dev/null +++ b/third_party/make/doc/make.info @@ -0,0 +1,207 @@ +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.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, 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, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being "A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + "GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: "You have the freedom to copy and + modify this GNU manual. Buying copies from the FSF supports it in + developing GNU and promoting software freedom." +INFO-DIR-SECTION Software development +START-INFO-DIR-ENTRY +* Make: (make). Remake files automatically. +END-INFO-DIR-ENTRY + + +Indirect: +make.info-1: 1379 +make.info-2: 301593 + +Tag Table: +(Indirect) +Node: Top1379 +Node: Overview16646 +Node: Preparing17659 +Node: Reading18627 +Node: Bugs19554 +Node: Introduction21383 +Node: Rule Introduction22976 +Node: Simple Makefile24909 +Node: How Make Works28645 +Node: Variables Simplify31294 +Node: make Deduces33500 +Node: Combine By Prerequisite35233 +Node: Cleanup36262 +Node: Makefiles37680 +Node: Makefile Contents38575 +Node: Splitting Lines41748 +Node: Makefile Names44231 +Node: Include45838 +Ref: Include-Footnote-149582 +Node: MAKEFILES Variable49716 +Node: Remaking Makefiles51257 +Node: Overriding Makefiles55587 +Node: Reading Makefiles57615 +Node: Parsing Makefiles61057 +Node: Secondary Expansion62915 +Node: Rules70363 +Node: Rule Example73036 +Node: Rule Syntax73884 +Node: Prerequisite Types76479 +Node: Wildcards79346 +Node: Wildcard Examples81065 +Node: Wildcard Pitfall82415 +Node: Wildcard Function84204 +Node: Directory Search85988 +Node: General Search87123 +Node: Selective Search88830 +Node: Search Algorithm91820 +Node: Recipes/Search94338 +Node: Implicit/Search95661 +Node: Libraries/Search96603 +Node: Phony Targets98574 +Node: Force Targets103411 +Node: Empty Targets104448 +Node: Special Targets105750 +Node: Multiple Targets113550 +Node: Multiple Rules117783 +Node: Static Pattern120001 +Node: Static Usage120653 +Node: Static versus Implicit124372 +Node: Double-Colon126112 +Node: Automatic Prerequisites127872 +Node: Recipes132133 +Node: Recipe Syntax133305 +Node: Splitting Recipe Lines135420 +Node: Variables in Recipes138573 +Node: Echoing139899 +Node: Execution141111 +Ref: Execution-Footnote-1142524 +Node: One Shell142669 +Node: Choosing the Shell145987 +Node: Parallel150131 +Node: Parallel Output152800 +Node: Parallel Input157227 +Node: Errors158346 +Node: Interrupts161981 +Node: Recursion164342 +Node: MAKE Variable166439 +Node: Variables/Recursion168682 +Node: Options/Recursion174127 +Node: -w Option180133 +Node: Canned Recipes181128 +Node: Empty Recipes184111 +Node: Using Variables185551 +Node: Reference188979 +Node: Flavors190789 +Node: Advanced196768 +Node: Substitution Refs197273 +Node: Computed Names198875 +Node: Values203423 +Node: Setting204340 +Node: Appending207379 +Node: Override Directive211350 +Node: Multi-Line212977 +Node: Undefine Directive215840 +Node: Environment216929 +Node: Target-specific219181 +Node: Pattern-specific222208 +Node: Suppressing Inheritance224055 +Node: Special Variables225508 +Node: Conditionals233749 +Node: Conditional Example234462 +Node: Conditional Syntax237025 +Node: Testing Flags242785 +Node: Functions243886 +Node: Syntax of Functions245446 +Node: Text Functions247780 +Node: File Name Functions256341 +Node: Conditional Functions261567 +Node: Foreach Function263943 +Node: File Function267156 +Node: Call Function269713 +Node: Value Function272598 +Node: Eval Function274035 +Node: Origin Function276311 +Node: Flavor Function279537 +Node: Make Control Functions280581 +Node: Shell Function282267 +Node: Guile Function284026 +Node: Running284776 +Node: Makefile Arguments286757 +Node: Goals287473 +Node: Instead of Execution292212 +Node: Avoiding Compilation295927 +Node: Overriding297902 +Node: Testing301593 +Node: Options Summary303477 +Node: Implicit Rules315181 +Node: Using Implicit317318 +Node: Catalogue of Rules320837 +Node: Implicit Variables330181 +Node: Chained Rules335254 +Node: Pattern Rules339475 +Node: Pattern Intro341009 +Node: Pattern Examples343160 +Node: Automatic Variables344967 +Node: Pattern Match352342 +Node: Match-Anything Rules355665 +Node: Canceling Rules359586 +Node: Last Resort360300 +Node: Suffix Rules362129 +Node: Implicit Rule Search365863 +Node: Archives369414 +Node: Archive Members370119 +Node: Archive Update371729 +Node: Archive Symbols373640 +Node: Archive Pitfalls374873 +Node: Archive Suffix Rules375595 +Node: Extending make377143 +Node: Guile Integration378288 +Node: Guile Types379516 +Node: Guile Interface381936 +Node: Guile Example383222 +Node: Loading Objects385413 +Node: load Directive386903 +Node: Remaking Loaded Objects389657 +Node: Loaded Object API390291 +Node: Loaded Object Example397053 +Node: Integrating make399300 +Node: Job Slots400051 +Node: POSIX Jobserver403483 +Node: Windows Jobserver405951 +Node: Terminal Output407304 +Node: Features409693 +Node: Missing418862 +Node: Makefile Conventions422590 +Node: Makefile Basics423569 +Node: Utilities in Makefiles426736 +Node: Command Variables429235 +Node: DESTDIR432475 +Node: Directory Variables434642 +Node: Standard Targets449999 +Node: Install Command Categories464105 +Node: Quick Reference468631 +Node: Error Messages481345 +Node: Complex Makefile490140 +Node: GNU Free Documentation License498758 +Node: Concept Index523916 +Node: Name Index596081 + +End Tag Table diff --git a/third_party/make/doc/make.info-1 b/third_party/make/doc/make.info-1 new file mode 100644 index 00000000000..abd0357a1bc --- /dev/null +++ b/third_party/make/doc/make.info-1 @@ -0,0 +1,7224 @@ +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.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, 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, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being "A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + "GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: "You have the freedom to copy and + modify this GNU manual. Buying copies from the FSF supports it in + developing GNU and promoting software freedom." +INFO-DIR-SECTION Software development +START-INFO-DIR-ENTRY +* Make: (make). Remake files automatically. +END-INFO-DIR-ENTRY + + +File: make.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir) + +GNU 'make' +********** + +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.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, 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, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being "A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + "GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: "You have the freedom to copy and + modify this GNU manual. Buying copies from the FSF supports it in + developing GNU and promoting software freedom." + +* Menu: + +* Overview:: Overview of 'make'. +* Introduction:: An introduction to 'make'. +* Makefiles:: Makefiles tell 'make' what to do. +* Rules:: Rules describe when a file must be remade. +* Recipes:: Recipes say how to remake a file. +* Using Variables:: You can use variables to avoid repetition. +* Conditionals:: Use or ignore parts of the makefile based + on the values of variables. +* Functions:: Many powerful ways to manipulate text. +* Invoking make: Running. How to invoke 'make' on the command line. +* Implicit Rules:: Use implicit rules to treat many files alike, + based on their file names. +* Archives:: How 'make' can update library archives. +* Extending make:: Using extensions to 'make'. +* Integrating make:: Integrating 'make' with other tools. +* Features:: Features GNU 'make' has over other 'make's. +* Missing:: What GNU 'make' lacks from other 'make's. +* Makefile Conventions:: Conventions for writing makefiles for + GNU programs. +* Quick Reference:: A quick reference for experienced users. +* Error Messages:: A list of common errors generated by 'make'. +* Complex Makefile:: A real example of a straightforward, + but nontrivial, makefile. + +* GNU Free Documentation License:: License for copying this manual. +* Concept Index:: Index of Concepts. +* Name Index:: Index of Functions, Variables, & Directives. + + -- The Detailed Node Listing -- + +Overview of 'make' + +* Preparing:: Preparing and running 'make'. +* Reading:: On reading this text. +* Bugs:: Problems and bugs. + +An Introduction to Makefiles + +* Rule Introduction:: What a rule looks like. +* Simple Makefile:: A simple makefile. +* How Make Works:: How 'make' processes this makefile. +* Variables Simplify:: Variables make makefiles simpler. +* make Deduces:: Letting 'make' deduce the recipes. +* Combine By Prerequisite:: Another style of makefile. +* Cleanup:: Rules for cleaning the directory. + +Writing Makefiles + +* Makefile Contents:: What makefiles contain. +* Makefile Names:: How to name your makefile. +* Include:: How one makefile can use another makefile. +* MAKEFILES Variable:: The environment can specify extra makefiles. +* Remaking Makefiles:: How makefiles get remade. +* Overriding Makefiles:: How to override part of one makefile + with another makefile. +* 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 + +* Splitting Lines:: Splitting long lines in makefiles + +Writing Rules + +* Rule Example:: An example explained. +* Rule Syntax:: General syntax explained. +* Prerequisite Types:: There are two types of prerequisites. +* Wildcards:: Using wildcard characters such as '*'. +* Directory Search:: Searching other directories for source files. +* Phony Targets:: Using a target that is not a real file's name. +* Force Targets:: You can use a target without a recipe + or prerequisites to mark other targets + as phony. +* Empty Targets:: When only the date matters and the + files are empty. +* Special Targets:: Targets with special built-in meanings. +* Multiple Targets:: When to make use of several targets in a rule. +* Multiple Rules:: How to use several rules with the same target. +* Static Pattern:: Static pattern rules apply to multiple targets + and can vary the prerequisites according to + the target name. +* Double-Colon:: How to use a special kind of rule to allow + several independent rules for one target. +* Automatic Prerequisites:: How to automatically generate rules giving + prerequisites from source files themselves. + +Using Wildcard Characters in File Names + +* Wildcard Examples:: Several examples. +* Wildcard Pitfall:: Problems to avoid. +* Wildcard Function:: How to cause wildcard expansion where + it does not normally take place. + +Searching Directories for Prerequisites + +* General Search:: Specifying a search path that applies + to every prerequisite. +* Selective Search:: Specifying a search path + for a specified class of names. +* Search Algorithm:: When and how search paths are applied. +* Recipes/Search:: How to write recipes that work together + with search paths. +* Implicit/Search:: How search paths affect implicit rules. +* Libraries/Search:: Directory search for link libraries. + +Static Pattern Rules + +* Static Usage:: The syntax of static pattern rules. +* Static versus Implicit:: When are they better than implicit rules? + +Writing Recipes in Rules + +* Recipe Syntax:: Recipe syntax features and pitfalls. +* Echoing:: How to control when recipes are echoed. +* Execution:: How recipes are executed. +* Parallel:: How recipes can be executed in parallel. +* Errors:: What happens after a recipe execution error. +* Interrupts:: What happens when a recipe is interrupted. +* Recursion:: Invoking 'make' from makefiles. +* Canned Recipes:: Defining canned recipes. +* Empty Recipes:: Defining useful, do-nothing recipes. + +Recipe Syntax + +* Splitting Recipe Lines:: Breaking long recipe lines for readability. +* Variables in Recipes:: Using 'make' variables in recipes. + +Recipe Execution + +* One Shell:: One shell for all lines in a recipe. +* Choosing the Shell:: How 'make' chooses the shell used + to run recipes. + +Parallel Execution + +* Parallel Output:: Handling output during parallel execution +* Parallel Input:: Handling input during parallel execution + +Recursive Use of 'make' + +* MAKE Variable:: The special effects of using '$(MAKE)'. +* Variables/Recursion:: How to communicate variables to a sub-'make'. +* Options/Recursion:: How to communicate options to a sub-'make'. +* -w Option:: How the '-w' or '--print-directory' option + helps debug use of recursive 'make' commands. + +How to Use Variables + +* Reference:: How to use the value of a variable. +* Flavors:: Variables come in two flavors. +* Advanced:: Advanced features for referencing a variable. +* Values:: All the ways variables get their values. +* Setting:: How to set a variable in the makefile. +* Appending:: How to append more text to the old value + of a variable. +* Override Directive:: How to set a variable in the makefile even if + the user has set it with a command argument. +* Multi-Line:: An alternate way to set a variable + to a multi-line string. +* Undefine Directive:: How to undefine a variable so that it appears + as if it was never set. +* Environment:: Variable values can come from the environment. +* Target-specific:: Variable values can be defined on a per-target + basis. +* Pattern-specific:: Target-specific variable values can be applied + to a group of targets that match a pattern. +* Suppressing Inheritance:: Suppress inheritance of variables. +* Special Variables:: Variables with special meaning or behavior. + +Advanced Features for Reference to Variables + +* Substitution Refs:: Referencing a variable with + substitutions on the value. +* Computed Names:: Computing the name of the variable to refer to. + +Conditional Parts of Makefiles + +* Conditional Example:: Example of a conditional +* Conditional Syntax:: The syntax of conditionals. +* Testing Flags:: Conditionals that test flags. + +Functions for Transforming Text + +* Syntax of Functions:: How to write a function call. +* Text Functions:: General-purpose text manipulation functions. +* File Name Functions:: Functions for manipulating file names. +* Conditional Functions:: Functions that implement conditions. +* Foreach Function:: Repeat some text with controlled variation. +* File Function:: Write text to a file. +* Call Function:: Expand a user-defined function. +* Value Function:: Return the un-expanded value of a variable. +* Eval Function:: Evaluate the arguments as makefile syntax. +* Origin Function:: Find where a variable got its value. +* Flavor Function:: Find out the flavor of a variable. +* Make Control Functions:: Functions that control how make runs. +* Shell Function:: Substitute the output of a shell command. +* Guile Function:: Use GNU Guile embedded scripting language. + +How to Run 'make' + +* Makefile Arguments:: How to specify which makefile to use. +* Goals:: How to use goal arguments to specify which + parts of the makefile to use. +* Instead of Execution:: How to use mode flags to specify what + kind of thing to do with the recipes + in the makefile other than simply + execute them. +* Avoiding Compilation:: How to avoid recompiling certain files. +* Overriding:: How to override a variable to specify + an alternate compiler and other things. +* Testing:: How to proceed past some errors, to + test compilation. +* Options Summary:: Summary of Options + +Using Implicit Rules + +* Using Implicit:: How to use an existing implicit rule + to get the recipes for updating a file. +* Catalogue of Rules:: A list of built-in rules. +* Implicit Variables:: How to change what predefined rules do. +* Chained Rules:: How to use a chain of implicit rules. +* Pattern Rules:: How to define new implicit rules. +* Last Resort:: How to define a recipe for rules which + cannot find any. +* Suffix Rules:: The old-fashioned style of implicit rule. +* Implicit Rule Search:: The precise algorithm for applying + implicit rules. + +Defining and Redefining Pattern Rules + +* Pattern Intro:: An introduction to pattern rules. +* Pattern Examples:: Examples of pattern rules. +* Automatic Variables:: How to use automatic variables in the + recipe of implicit rules. +* Pattern Match:: How patterns match. +* Match-Anything Rules:: Precautions you should take prior to + defining rules that can match any + target file whatever. +* Canceling Rules:: How to override or cancel built-in rules. + +Using 'make' to Update Archive Files + +* Archive Members:: Archive members as targets. +* Archive Update:: The implicit rule for archive member targets. +* Archive Pitfalls:: Dangers to watch out for when using archives. +* Archive Suffix Rules:: You can write a special kind of suffix rule + for updating archives. + +Implicit Rule for Archive Member Targets + +* Archive Symbols:: How to update archive symbol directories. + +Extending GNU 'make' + +* Guile Integration:: Using Guile as an embedded scripting language. +* Loading Objects:: Loading dynamic objects as extensions. + +GNU Guile Integration + +* Guile Types:: Converting Guile types to 'make' strings. +* Guile Interface:: Invoking 'make' functions from Guile. +* Guile Example:: Example using Guile in 'make'. + +Loading Dynamic Objects + +* load Directive:: Loading dynamic objects as extensions. +* Remaking Loaded Objects:: How loaded objects get remade. +* Loaded Object API:: Programmatic interface for loaded objects. +* Loaded Object Example:: Example of a loaded object + +Integrating GNU 'make' + +* Job Slots:: Share job slots with GNU 'make'. +* Terminal Output:: Control output to terminals. + +Sharing Job Slots with GNU 'make' + +* POSIX Jobserver:: Using the jobserver on POSIX systems. +* Windows Jobserver:: Using the jobserver on Windows systems. + + + +File: make.info, Node: Overview, Next: Introduction, Prev: Top, Up: Top + +1 Overview of 'make' +******************** + +The 'make' utility automatically determines which pieces of a large +program need to be recompiled, and issues commands to recompile them. +This manual describes GNU 'make', which was implemented by Richard +Stallman and Roland McGrath. Development since Version 3.76 has been +handled by Paul D. Smith. + + GNU 'make' conforms to section 6.2 of 'IEEE Standard 1003.2-1992' +(POSIX.2). + + Our examples show C programs, since they are most common, but you can +use 'make' with any programming language whose compiler can be run with +a shell command. Indeed, '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. + +* Menu: + +* Preparing:: Preparing and running 'make'. +* Reading:: On reading this text. +* Bugs:: Problems and bugs. + + +File: make.info, Node: Preparing, Next: Reading, Prev: Overview, Up: Overview + +Preparing and Running Make +========================== + +To prepare to use 'make', you must write a file called the "makefile" +that describes the relationships among files in your program and +provides 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. + + Once a suitable makefile exists, each time you change some source +files, this simple shell command: + + make + +suffices to perform all necessary recompilations. The 'make' program +uses the makefile data base 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 recipes recorded in the data base. + + You can provide command line arguments to 'make' to control which +files should be recompiled, or how. *Note How to Run 'make': Running. + + +File: make.info, Node: Reading, Next: Bugs, Prev: Preparing, Up: Overview + +1.1 How to Read This Manual +=========================== + +If you are new to 'make', or are looking for a general introduction, +read the first few sections of each chapter, skipping the later +sections. In each chapter, the first few sections contain introductory +or general information and the later sections contain specialized or +technical information. The exception is the second chapter, *note An +Introduction to Makefiles: Introduction, all of which is introductory. + + If you are familiar with other 'make' programs, see *note Features of +GNU 'make': Features, which lists the enhancements GNU 'make' has, and +*note Incompatibilities and Missing Features: Missing, which explains +the few things GNU 'make' lacks that others have. + + For a quick summary, see *note Options Summary::, *note Quick +Reference::, and *note Special Targets::. + + +File: make.info, Node: Bugs, Prev: Reading, Up: Overview + +1.2 Problems and Bugs +===================== + +If you have problems with GNU 'make' or think you've found a bug, please +report it to the developers; we cannot promise to do anything but we +might well want to fix it. + + Before reporting a bug, make sure you've actually found a real bug. +Carefully reread the documentation and see if it really says you can do +what you're trying to do. If it's not clear whether you should be able +to do something or not, report that too; it's a bug in the +documentation! + + Before reporting a bug or trying to fix it yourself, try to isolate +it to the smallest possible makefile that reproduces the problem. Then +send us the makefile and the exact results 'make' gave you, including +any error or warning messages. Please don't paraphrase these messages: +it's best to cut and paste them into your report. When generating this +small makefile, be sure to not use any non-free or unusual tools in your +recipes: you can almost always emulate what such a tool would do with +simple shell commands. Finally, be sure to explain what you expected to +occur; this will help us decide whether the problem was really in the +documentation. + + Once you have a precise problem you can report it in one of two ways. +Either send electronic mail to: + + bug-make@gnu.org + +or use our Web-based project management tool, at: + + http://savannah.gnu.org/projects/make/ + +In addition to the information above, please be careful to include the +version number of 'make' you are using. You can get this information +with the command 'make --version'. Be sure also to include the type of +machine and operating system you are using. One way to obtain this +information is by looking at the final lines of output from the command +'make --help'. + + +File: make.info, Node: Introduction, Next: Makefiles, Prev: Overview, Up: Top + +2 An Introduction to Makefiles +****************************** + +You need a file called a "makefile" to tell 'make' what to do. Most +often, the makefile tells 'make' how to compile and link a program. + + In this chapter, we will discuss a simple makefile that describes how +to compile and link a text editor which consists of eight C source files +and three header files. The makefile can also tell 'make' how to run +miscellaneous commands when explicitly asked (for example, to remove +certain files as a clean-up operation). To see a more complex example +of a makefile, see *note Complex Makefile::. + + When 'make' recompiles the editor, each changed C source file must be +recompiled. If a header file has changed, each C source file that +includes the header file must be recompiled to be safe. Each +compilation produces an object file corresponding to the source file. +Finally, if any source file has been recompiled, all the object files, +whether newly made or saved from previous compilations, must be linked +together to produce the new executable editor. + +* Menu: + +* Rule Introduction:: What a rule looks like. +* Simple Makefile:: A simple makefile. +* How Make Works:: How 'make' processes this makefile. +* Variables Simplify:: Variables make makefiles simpler. +* make Deduces:: Letting 'make' deduce the recipes. +* Combine By Prerequisite:: Another style of makefile. +* Cleanup:: Rules for cleaning the directory. + + +File: make.info, Node: Rule Introduction, Next: Simple Makefile, Prev: Introduction, Up: Introduction + +2.1 What a Rule Looks Like +========================== + +A simple makefile consists of "rules" with the following shape: + + TARGET ... : PREREQUISITES ... + RECIPE + ... + ... + + A "target" is usually the name of a file that is generated by a +program; examples of targets are executable or object files. A target +can also be the name of an action to carry out, such as 'clean' (*note +Phony Targets::). + + A "prerequisite" is a file that is used as input to create the +target. A target often depends on several files. + + A "recipe" is an action that 'make' carries out. A recipe may have +more than one command, either on the same line or each on its own line. +*Please note:* you need to put a tab character at the beginning of every +recipe line! This is an obscurity that catches the unwary. If you +prefer to prefix your recipes with a character other than tab, you can +set the '.RECIPEPREFIX' variable to an alternate character (*note +Special Variables::). + + Usually a recipe is in a rule with prerequisites and serves to create +a target file if any of the prerequisites change. However, the rule +that specifies a recipe for the target need not have prerequisites. For +example, the rule containing the delete command associated with the +target 'clean' does not have prerequisites. + + A "rule", then, explains how and when to remake certain files which +are the targets of the particular rule. 'make' carries out the recipe +on the prerequisites to create or update the target. A rule can also +explain how and when to carry out an action. *Note Writing Rules: +Rules. + + A makefile may contain other text besides rules, but a simple +makefile need only contain rules. Rules may look somewhat more +complicated than shown in this template, but all fit the pattern more or +less. + + +File: make.info, Node: Simple Makefile, Next: How Make Works, Prev: Rule Introduction, Up: Introduction + +2.2 A Simple Makefile +===================== + +Here is a straightforward makefile that describes the way an executable +file called 'edit' depends on eight object files which, in turn, depend +on eight C source and three header files. + + In this example, all the C files include 'defs.h', but only those +defining editing commands include 'command.h', and only low level files +that change the editor buffer include 'buffer.h'. + + edit : main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + cc -o edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + + main.o : main.c defs.h + cc -c main.c + kbd.o : kbd.c defs.h command.h + cc -c kbd.c + command.o : command.c defs.h command.h + cc -c command.c + display.o : display.c defs.h buffer.h + cc -c display.c + insert.o : insert.c defs.h buffer.h + cc -c insert.c + search.o : search.c defs.h buffer.h + cc -c search.c + files.o : files.c defs.h buffer.h command.h + cc -c files.c + utils.o : utils.c defs.h + cc -c utils.c + clean : + rm edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +We split each long line into two lines using backslash/newline; this is +like using one long line, but is easier to read. *Note Splitting Long +Lines: Splitting Lines. + + To use this makefile to create the executable file called 'edit', +type: + + make + + To use this makefile to delete the executable file and all the object +files from the directory, type: + + make clean + + In the example makefile, the targets include the executable file +'edit', and the object files 'main.o' and 'kbd.o'. The prerequisites +are files such as 'main.c' and 'defs.h'. In fact, each '.o' file is +both a target and a prerequisite. Recipes include 'cc -c main.c' and +'cc -c kbd.c'. + + When a target is a file, it needs to be recompiled or relinked if any +of its prerequisites change. In addition, any prerequisites that are +themselves automatically generated should be updated first. In this +example, 'edit' depends on each of the eight object files; the object +file 'main.o' depends on the source file 'main.c' and on the header file +'defs.h'. + + A recipe may follow each line that contains a target and +prerequisites. These recipes say how to update the target file. A tab +character (or whatever character is specified by the '.RECIPEPREFIX' +variable; *note Special Variables::) must come at the beginning of every +line in the recipe to distinguish recipes from other lines in the +makefile. (Bear in mind that 'make' does not know anything about how +the recipes work. It is up to you to supply recipes that will update +the target file properly. All 'make' does is execute the recipe you +have specified when the target file needs to be updated.) + + The target 'clean' is not a file, but merely the name of an action. +Since you normally do not want to carry out the actions in this rule, +'clean' is not a prerequisite of any other rule. Consequently, 'make' +never does anything with it unless you tell it specifically. Note that +this rule not only is not a prerequisite, it also does not have any +prerequisites, so the only purpose of the rule is to run the specified +recipe. Targets that do not refer to files but are just actions are +called "phony targets". *Note Phony Targets::, for information about +this kind of target. *Note Errors in Recipes: Errors, to see how to +cause 'make' to ignore errors from 'rm' or any other command. + + +File: make.info, Node: How Make Works, Next: Variables Simplify, Prev: Simple Makefile, Up: Introduction + +2.3 How 'make' Processes a Makefile +=================================== + +By default, 'make' starts with the first target (not targets whose names +start with '.'). This is called the "default goal". ("Goals" are the +targets that 'make' strives ultimately to update. You can override this +behavior using the command line (*note Arguments to Specify the Goals: +Goals.) or with the '.DEFAULT_GOAL' special variable (*note Other +Special Variables: Special Variables.). + + In the simple example of the previous section, the default goal is to +update the executable program 'edit'; therefore, we put that rule first. + + Thus, when you give the command: + + make + +'make' reads the makefile in the current directory and begins by +processing the first rule. In the example, this rule is for relinking +'edit'; but before 'make' can fully process this rule, it must process +the rules for the files that 'edit' depends on, which in this case are +the object files. Each of these files is processed according to its own +rule. These rules say to update each '.o' file by compiling its source +file. The recompilation must be done if the source file, or any of the +header files named as prerequisites, is more recent than the object +file, or if the object file does not exist. + + The other rules are processed because their targets appear as +prerequisites of the goal. If some other rule is not depended on by the +goal (or anything it depends on, etc.), that rule is not processed, +unless you tell 'make' to do so (with a command such as 'make clean'). + + Before recompiling an object file, 'make' considers updating its +prerequisites, the source file and header files. This makefile does not +specify anything to be done for them--the '.c' and '.h' files are not +the targets of any rules--so 'make' does nothing for these files. But +'make' would update automatically generated C programs, such as those +made by Bison or Yacc, by their own rules at this time. + + After recompiling whichever object files need it, 'make' decides +whether to relink 'edit'. This must be done if the file 'edit' does not +exist, or if any of the object files are newer than it. If an object +file was just recompiled, it is now newer than 'edit', so 'edit' is +relinked. + + Thus, if we change the file 'insert.c' and run 'make', 'make' will +compile that file to update 'insert.o', and then link 'edit'. If we +change the file 'command.h' and run 'make', 'make' will recompile the +object files 'kbd.o', 'command.o' and 'files.o' and then link the file +'edit'. + + +File: make.info, Node: Variables Simplify, Next: make Deduces, Prev: How Make Works, Up: Introduction + +2.4 Variables Make Makefiles Simpler +==================================== + +In our example, we had to list all the object files twice in the rule +for 'edit' (repeated here): + + edit : main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + cc -o edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + + Such duplication is error-prone; if a new object file is added to the +system, we might add it to one list and forget the other. We can +eliminate the risk and simplify the makefile by using a variable. +"Variables" allow a text string to be defined once and substituted in +multiple places later (*note How to Use Variables: Using Variables.). + + It is standard practice for every makefile to have a variable named +'objects', 'OBJECTS', 'objs', 'OBJS', 'obj', or 'OBJ' which is a list of +all object file names. We would define such a variable 'objects' with a +line like this in the makefile: + + objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +Then, each place we want to put a list of the object file names, we can +substitute the variable's value by writing '$(objects)' (*note How to +Use Variables: Using Variables.). + + Here is how the complete simple makefile looks when you use a +variable for the object files: + + objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + + edit : $(objects) + cc -o edit $(objects) + main.o : main.c defs.h + cc -c main.c + kbd.o : kbd.c defs.h command.h + cc -c kbd.c + command.o : command.c defs.h command.h + cc -c command.c + display.o : display.c defs.h buffer.h + cc -c display.c + insert.o : insert.c defs.h buffer.h + cc -c insert.c + search.o : search.c defs.h buffer.h + cc -c search.c + files.o : files.c defs.h buffer.h command.h + cc -c files.c + utils.o : utils.c defs.h + cc -c utils.c + clean : + rm edit $(objects) + + +File: make.info, Node: make Deduces, Next: Combine By Prerequisite, Prev: Variables Simplify, Up: Introduction + +2.5 Letting 'make' Deduce the Recipes +===================================== + +It is not necessary to spell out the recipes for compiling the +individual C source files, because 'make' can figure them out: it has an +"implicit rule" for updating a '.o' file from a correspondingly named +'.c' file using a 'cc -c' command. For example, it will use the recipe +'cc -c main.c -o main.o' to compile 'main.c' into 'main.o'. We can +therefore omit the recipes from the rules for the object files. *Note +Using Implicit Rules: Implicit Rules. + + When a '.c' file is used automatically in this way, it is also +automatically added to the list of prerequisites. We can therefore omit +the '.c' files from the prerequisites, provided we omit the recipe. + + Here is the entire example, with both of these changes, and a +variable 'objects' as suggested above: + + objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + + edit : $(objects) + cc -o edit $(objects) + + main.o : defs.h + kbd.o : defs.h command.h + command.o : defs.h command.h + display.o : defs.h buffer.h + insert.o : defs.h buffer.h + search.o : defs.h buffer.h + files.o : defs.h buffer.h command.h + utils.o : defs.h + + .PHONY : clean + clean : + rm edit $(objects) + +This is how we would write the makefile in actual practice. (The +complications associated with 'clean' are described elsewhere. See +*note Phony Targets::, and *note Errors in Recipes: Errors.) + + Because implicit rules are so convenient, they are important. You +will see them used frequently. + + +File: make.info, Node: Combine By Prerequisite, Next: Cleanup, Prev: make Deduces, Up: Introduction + +2.6 Another Style of Makefile +============================= + +When the objects of a makefile are created only by implicit rules, an +alternative style of makefile is possible. In this style of makefile, +you group entries by their prerequisites instead of by their targets. +Here is what one looks like: + + objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + + edit : $(objects) + cc -o edit $(objects) + + $(objects) : defs.h + kbd.o command.o files.o : command.h + display.o insert.o search.o files.o : buffer.h + +Here 'defs.h' is given as a prerequisite of all the object files; +'command.h' and 'buffer.h' are prerequisites of the specific object +files listed for them. + + Whether this is better is a matter of taste: it is more compact, but +some people dislike it because they find it clearer to put all the +information about each target in one place. + + +File: make.info, Node: Cleanup, Prev: Combine By Prerequisite, Up: Introduction + +2.7 Rules for Cleaning the Directory +==================================== + +Compiling a program is not the only thing you might want to write rules +for. Makefiles commonly tell how to do a few other things besides +compiling a program: for example, how to delete all the object files and +executables so that the directory is 'clean'. + + Here is how we could write a 'make' rule for cleaning our example +editor: + + clean: + rm edit $(objects) + + In practice, we might want to write the rule in a somewhat more +complicated manner to handle unanticipated situations. We would do +this: + + .PHONY : clean + clean : + -rm edit $(objects) + +This prevents 'make' from getting confused by an actual file called +'clean' and causes it to continue in spite of errors from 'rm'. (See +*note Phony Targets::, and *note Errors in Recipes: Errors.) + +A rule such as this should not be placed at the beginning of the +makefile, because we do not want it to run by default! Thus, in the +example makefile, we want the rule for 'edit', which recompiles the +editor, to remain the default goal. + + Since 'clean' is not a prerequisite of 'edit', this rule will not run +at all if we give the command 'make' with no arguments. In order to +make the rule run, we have to type 'make clean'. *Note How to Run +'make': Running. + + +File: make.info, Node: Makefiles, Next: Rules, Prev: Introduction, Up: Top + +3 Writing Makefiles +******************* + +The information that tells 'make' how to recompile a system comes from +reading a data base called the "makefile". + +* Menu: + +* Makefile Contents:: What makefiles contain. +* Makefile Names:: How to name your makefile. +* Include:: How one makefile can use another makefile. +* MAKEFILES Variable:: The environment can specify extra makefiles. +* Remaking Makefiles:: How makefiles get remade. +* Overriding Makefiles:: How to override part of one makefile + with another makefile. +* Reading Makefiles:: How makefiles are read in. +* Parsing Makefiles:: How makefiles are parsed. +* Secondary Expansion:: How and when secondary expansion is performed. + + +File: make.info, Node: Makefile Contents, Next: Makefile Names, Prev: Makefiles, Up: Makefiles + +3.1 What Makefiles Contain +========================== + +Makefiles contain five kinds of things: "explicit rules", "implicit +rules", "variable definitions", "directives", and "comments". Rules, +variables, and directives are described at length in later chapters. + + * An "explicit rule" says when and how to remake one or more files, + called the rule's "targets". It lists the other files that the + targets depend on, called the "prerequisites" of the target, and + may also give a recipe to use to create or update the targets. + *Note Writing Rules: Rules. + + * An "implicit rule" says when and how to remake a class of files + based on their names. It describes how a target may depend on a + file with a name similar to the target and gives a recipe to create + or update such a target. *Note Using Implicit Rules: Implicit + Rules. + + * A "variable definition" is a line that specifies a text string + value for a variable that can be substituted into the text later. + The simple makefile example shows a variable definition for + 'objects' as a list of all object files (*note Variables Make + Makefiles Simpler: Variables Simplify.). + + * A "directive" is an instruction for 'make' to do something special + while reading the makefile. These include: + + * Reading another makefile (*note Including Other Makefiles: + Include.). + + * Deciding (based on the values of variables) whether to use or + ignore a part of the makefile (*note Conditional Parts of + Makefiles: Conditionals.). + + * Defining a variable from a verbatim string containing multiple + lines (*note Defining Multi-Line Variables: Multi-Line.). + + * '#' in a line of a makefile starts a "comment". It and the rest of + the line are ignored, except that a trailing backslash not escaped + by another backslash will continue the comment across multiple + lines. A line containing just a comment (with perhaps spaces + before it) is effectively blank, and is ignored. If you want a + literal '#', escape it with a backslash (e.g., '\#'). Comments may + appear on any line in the makefile, although they are treated + specially in certain situations. + + You cannot use comments within variable references or function + calls: any instance of '#' will be treated literally (rather than + as the start of a comment) inside a variable reference or function + call. + + Comments within a recipe are passed to the shell, just as with any + other recipe text. The shell decides how to interpret it: whether + or not this is a comment is up to the shell. + + Within a 'define' directive, comments are not ignored during the + definition of the variable, but rather kept intact in the value of + the variable. When the variable is expanded they will either be + treated as 'make' comments or as recipe text, depending on the + context in which the variable is evaluated. + +* Menu: + +* Splitting Lines:: Splitting long lines in makefiles + + +File: make.info, Node: Splitting Lines, Prev: Makefile Contents, Up: Makefile Contents + +3.1.1 Splitting Long Lines +-------------------------- + +Makefiles use a "line-based" syntax in which the newline character is +special and marks the end of a statement. GNU 'make' has no limit on +the length of a statement line, up to the amount of memory in your +computer. + + However, it is difficult to read lines which are too long to display +without wrapping or scrolling. So, you can format your makefiles for +readability by adding newlines into the middle of a statement: you do +this by escaping the internal newlines with a backslash ('\') character. +Where we need to make a distinction we will refer to "physical lines" as +a single line ending with a newline (regardless of whether it is +escaped) and a "logical line" being a complete statement including all +escaped newlines up to the first non-escaped newline. + + The way in which backslash/newline combinations are handled depends +on whether the statement is a recipe line or a non-recipe line. +Handling of backslash/newline in a recipe line is discussed later (*note +Splitting Recipe Lines::). + + Outside of recipe lines, backslash/newlines are converted into a +single space character. Once that is done, all whitespace around the +backslash/newline is condensed into a single space: this includes all +whitespace preceding the backslash, all whitespace at the beginning of +the line after the backslash/newline, and any consecutive +backslash/newline combinations. + + If the '.POSIX' special target is defined then backslash/newline +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 + + +File: make.info, Node: Makefile Names, Next: Include, Prev: Makefile Contents, Up: Makefiles + +3.2 What Name to Give Your Makefile +=================================== + +By default, when 'make' looks for the makefile, it tries the following +names, in order: 'GNUmakefile', 'makefile' and 'Makefile'. + + Normally you should call your makefile either 'makefile' or +'Makefile'. (We recommend 'Makefile' because it appears prominently +near the beginning of a directory listing, right near other important +files such as 'README'.) The first name checked, 'GNUmakefile', is not +recommended for most makefiles. You should use this name if you have a +makefile that is specific to GNU 'make', and will not be understood by +other versions of 'make'. Other 'make' programs look for 'makefile' and +'Makefile', but not 'GNUmakefile'. + + If 'make' finds none of these names, it does not use any makefile. +Then you must specify a goal with a command argument, and 'make' will +attempt to figure out how to remake it using only its built-in implicit +rules. *Note Using Implicit Rules: Implicit Rules. + + If you want to use a nonstandard name for your makefile, you can +specify the makefile name with the '-f' or '--file' option. The +arguments '-f NAME' or '--file=NAME' tell 'make' to read the file NAME +as the makefile. If you use more than one '-f' or '--file' option, you +can specify several makefiles. All the makefiles are effectively +concatenated in the order specified. The default makefile names +'GNUmakefile', 'makefile' and 'Makefile' are not checked automatically +if you specify '-f' or '--file'. + + +File: make.info, Node: Include, Next: MAKEFILES Variable, Prev: Makefile Names, Up: Makefiles + +3.3 Including Other Makefiles +============================= + +The 'include' directive tells 'make' to suspend reading the current +makefile and read one or more other makefiles before continuing. The +directive is a line in the makefile that looks like this: + + include FILENAMES... + +FILENAMES can contain shell file name patterns. If FILENAMES is empty, +nothing is included and no error is printed. + + Extra spaces are allowed and ignored at the beginning of the line, +but the first character must not be a tab (or the value of +'.RECIPEPREFIX')--if the line begins with a tab, it will be considered a +recipe line. Whitespace is required between 'include' and the file +names, and between file names; extra whitespace is ignored there and at +the end of the directive. A comment starting with '#' is allowed at the +end of the line. If the file names contain any variable or function +references, they are expanded. *Note How to Use Variables: Using +Variables. + + For example, if you have three '.mk' files, 'a.mk', 'b.mk', and +'c.mk', and '$(bar)' expands to 'bish bash', then the following +expression + + include foo *.mk $(bar) + + is equivalent to + + include foo a.mk b.mk c.mk bish bash + + When 'make' processes an 'include' directive, it suspends reading of +the containing makefile and reads from each listed file in turn. When +that is finished, 'make' resumes reading the makefile in which the +directive appears. + + One occasion for using 'include' directives is when several programs, +handled by individual makefiles in various directories, need to use a +common set of variable definitions (*note Setting Variables: Setting.) +or pattern rules (*note Defining and Redefining Pattern Rules: Pattern +Rules.). + + Another such occasion is when you want to generate prerequisites from +source files automatically; the prerequisites can be put in a file that +is included by the main makefile. This practice is generally cleaner +than that of somehow appending the prerequisites to the end of the main +makefile as has been traditionally done with other versions of 'make'. +*Note Automatic Prerequisites::. + + If the specified name does not start with a slash, and the file is +not found in the current directory, several other directories are +searched. First, any directories you have specified with the '-I' or +'--include-dir' option are searched (*note Summary of Options: Options +Summary.). Then the following directories (if they exist) are searched, +in this order: 'PREFIX/include' (normally '/usr/local/include' (1)) +'/usr/gnu/include', '/usr/local/include', '/usr/include'. + + If an included makefile cannot be found in any of these directories, +a warning message is generated, but it is not an immediately fatal +error; processing of the makefile containing the 'include' continues. +Once it has finished reading makefiles, 'make' will try to remake any +that are out of date or don't exist. *Note How Makefiles Are Remade: +Remaking Makefiles. Only after it has tried to find a way to remake a +makefile and failed, will 'make' diagnose the missing makefile as a +fatal error. + + If you want 'make' to simply ignore a makefile which does not exist +or cannot be remade, with no error message, use the '-include' directive +instead of 'include', like this: + + -include FILENAMES... + + This acts like 'include' in every way except that there is no error +(not even a warning) if any of the FILENAMES (or any prerequisites of +any of the FILENAMES) do not exist or cannot be remade. + + For compatibility with some other 'make' implementations, 'sinclude' +is another name for '-include'. + + ---------- Footnotes ---------- + + (1) GNU Make compiled for MS-DOS and MS-Windows behaves as if PREFIX +has been defined to be the root of the DJGPP tree hierarchy. + + +File: make.info, Node: MAKEFILES Variable, Next: Remaking Makefiles, Prev: Include, Up: Makefiles + +3.4 The Variable 'MAKEFILES' +============================ + +If the environment variable 'MAKEFILES' is defined, 'make' considers its +value as a list of names (separated by whitespace) of additional +makefiles to be read before the others. This works much like the +'include' directive: various directories are searched for those files +(*note Including Other Makefiles: Include.). In addition, the default +goal is never taken from one of these makefiles (or any makefile +included by them) and it is not an error if the files listed in +'MAKEFILES' are not found. + + The main use of 'MAKEFILES' is in communication between recursive +invocations of 'make' (*note Recursive Use of 'make': Recursion.). It +usually is not desirable to set the environment variable before a +top-level invocation of 'make', because it is usually better not to mess +with a makefile from outside. However, if you are running 'make' +without a specific makefile, a makefile in 'MAKEFILES' can do useful +things to help the built-in implicit rules work better, such as defining +search paths (*note Directory Search::). + + Some users are tempted to set 'MAKEFILES' in the environment +automatically on login, and program makefiles to expect this to be done. +This is a very bad idea, because such makefiles will fail to work if run +by anyone else. It is much better to write explicit 'include' +directives in the makefiles. *Note Including Other Makefiles: Include. + + +File: make.info, Node: Remaking Makefiles, Next: Overriding Makefiles, Prev: MAKEFILES Variable, Up: Makefiles + +3.5 How Makefiles Are Remade +============================ + +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.) 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, +perhaps for efficiency reasons, you can use any normal method of +preventing implicit rule look-up to do so. For example, you can write +an explicit rule with the makefile as the target, and an empty recipe +(*note Using Empty Recipes: Empty Recipes.). + + If the makefiles specify a double-colon rule to remake a file with a +recipe but no prerequisites, that file will always be remade (*note +Double-Colon::). In the case of makefiles, a makefile that has a +double-colon rule with a recipe but no prerequisites will be remade +every time 'make' is run, and then again after 'make' starts over and +reads the makefiles in again. This would cause an infinite loop: 'make' +would constantly remake the makefile, and never do anything else. So, +to avoid this, 'make' will *not* attempt to remake makefiles which are +specified as targets of a double-colon rule with a recipe but no +prerequisites. + + If you do not specify any makefiles to be read with '-f' or '--file' +options, 'make' will try the default makefile names; *note What Name to +Give Your Makefile: Makefile Names. Unlike makefiles explicitly +requested with '-f' or '--file' options, 'make' is not certain that +these makefiles should exist. However, if a default makefile does not +exist but can be created by running 'make' rules, you probably want the +rules to be run so that the makefile can be used. + + Therefore, if none of the default makefiles exists, 'make' will try +to make each of them in the same order in which they are searched for +(*note What Name to Give Your Makefile: Makefile Names.) until it +succeeds in making one, or it runs out of names to try. Note that it is +not an error if 'make' cannot find or make any makefile; a makefile is +not always necessary. + + When you use the '-t' or '--touch' option (*note Instead of Executing +Recipes: Instead of Execution.), you would not want to use an +out-of-date makefile to decide which targets to touch. So the '-t' +option has no effect on updating makefiles; they are really updated even +if '-t' is specified. Likewise, '-q' (or '--question') and '-n' (or +'--just-print') do not prevent updating of makefiles, because an +out-of-date makefile would result in the wrong output for other targets. +Thus, 'make -f mfile -n foo' will update 'mfile', read it in, and then +print the recipe to update 'foo' and its prerequisites without running +it. The recipe printed for 'foo' will be the one specified in the +updated contents of 'mfile'. + + However, on occasion you might actually wish to prevent updating of +even the makefiles. You can do this by specifying the makefiles as +goals in the command line as well as specifying them as makefiles. When +the makefile name is specified explicitly as a goal, the options '-t' +and so on do apply to them. + + Thus, 'make -f mfile -n mfile foo' would read the makefile 'mfile', +print the recipe needed to update it without actually running it, and +then print the recipe needed to update 'foo' without running that. The +recipe for 'foo' will be the one specified by the existing contents of +'mfile'. + + +File: make.info, Node: Overriding Makefiles, Next: Reading Makefiles, Prev: Remaking Makefiles, Up: Makefiles + +3.6 Overriding Part of Another Makefile +======================================= + +Sometimes it is useful to have a makefile that is mostly just like +another makefile. You can often use the 'include' directive to include +one in the other, and add more targets or variable definitions. +However, it is invalid for two makefiles to give different recipes for +the same target. But there is another way. + + In the containing makefile (the one that wants to include the other), +you can use a match-anything pattern rule to say that to remake any +target that cannot be made from the information in the containing +makefile, 'make' should look in another makefile. *Note Pattern +Rules::, for more information on pattern rules. + + For example, if you have a makefile called 'Makefile' that says how +to make the target 'foo' (and other targets), you can write a makefile +called 'GNUmakefile' that contains: + + foo: + frobnicate > foo + + %: force + @$(MAKE) -f Makefile $@ + force: ; + + If you say 'make foo', 'make' will find 'GNUmakefile', read it, and +see that to make 'foo', it needs to run the recipe 'frobnicate > foo'. +If you say 'make bar', 'make' will find no way to make 'bar' in +'GNUmakefile', so it will use the recipe from the pattern rule: 'make -f +Makefile bar'. If 'Makefile' provides a rule for updating 'bar', 'make' +will apply the rule. And likewise for any other target that +'GNUmakefile' does not say how to make. + + The way this works is that the pattern rule has a pattern of just +'%', so it matches any target whatever. The rule specifies a +prerequisite 'force', to guarantee that the recipe will be run even if +the target file already exists. We give the 'force' target an empty +recipe to prevent 'make' from searching for an implicit rule to build +it--otherwise it would apply the same match-anything rule to 'force' +itself and create a prerequisite loop! + + +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 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. 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 +chapters. + +Variable Assignment +------------------- + +Variable definitions are parsed as follows: + + IMMEDIATE = DEFERRED + IMMEDIATE ?= DEFERRED + IMMEDIATE := IMMEDIATE + IMMEDIATE ::= IMMEDIATE + IMMEDIATE += DEFERRED or IMMEDIATE + IMMEDIATE != IMMEDIATE + + define IMMEDIATE + DEFERRED + endef + + define IMMEDIATE = + DEFERRED + endef + + define IMMEDIATE ?= + DEFERRED + endef + + define IMMEDIATE := + IMMEDIATE + endef + + define IMMEDIATE ::= + IMMEDIATE + endef + + define IMMEDIATE += + DEFERRED or IMMEDIATE + endef + + define IMMEDIATE != + IMMEDIATE + endef + + 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 +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). + +Conditional Directives +---------------------- + +Conditional directives are parsed immediately. This means, for example, +that automatic variables cannot be used in conditional directives, as +automatic variables are not set until the recipe for that rule is +invoked. If you need to use automatic variables in a conditional +directive you _must_ move the condition into the recipe and use shell +conditional syntax instead. + +Rule Definition +--------------- + +A rule is always expanded the same way, regardless of the form: + + IMMEDIATE : IMMEDIATE ; DEFERRED + DEFERRED + + 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. + + +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::). + + +File: make.info, Node: Secondary Expansion, Prev: Parsing Makefiles, Up: Makefiles + +3.9 Secondary Expansion +======================= + +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 +prerequisites of the targets defined after the special target are +expanded a _second time_. In most circumstances this secondary +expansion will have no effect, since all variable and function +references will have been expanded during the initial parsing of the +makefiles. In order to take advantage of the secondary expansion phase +of the parser, then, it's necessary to _escape_ the variable or function +reference in the makefile. In this case the first expansion merely +un-escapes the reference but doesn't expand it, and expansion is left to +the secondary expansion phase. For example, consider this makefile: + + .SECONDEXPANSION: + ONEVAR = onefile + TWOVAR = twofile + myfile: $(ONEVAR) $$(TWOVAR) + + After the first expansion phase the prerequisites list of the +'myfile' target will be 'onefile' and '$(TWOVAR)'; the first (unescaped) +variable reference to ONEVAR is expanded, while the second (escaped) +variable reference is simply unescaped, without being recognized as a +variable reference. Now during the secondary expansion the first word +is expanded again but since it contains no variable or function +references it remains the value 'onefile', while the second word is now +a normal reference to the variable TWOVAR, which is expanded to the +value 'twofile'. The final result is that there are two prerequisites, +'onefile' and 'twofile'. + + Obviously, this is not a very interesting case since the same result +could more easily have been achieved simply by having both variables +appear, unescaped, in the prerequisites list. One difference becomes +apparent if the variables are reset; consider this example: + + .SECONDEXPANSION: + AVAR = top + onefile: $(AVAR) + twofile: $$(AVAR) + AVAR = bottom + + Here the prerequisite of 'onefile' will be expanded immediately, and +resolve to the value 'top', while the prerequisite of 'twofile' will not +be full expanded until the secondary expansion and yield a value of +'bottom'. + + This is marginally more exciting, but the true power of this feature +only becomes apparent when you discover that secondary expansions always +take place within the scope of the automatic variables for that target. +This means that you can use variables such as '$@', '$*', etc. during +the second expansion and they will have their expected values, just as +in the recipe. All you have to do is defer the expansion by escaping +the '$'. Also, secondary expansion occurs for both explicit and +implicit (pattern) rules. Knowing this, the possible uses for this +feature increase dramatically. For example: + + .SECONDEXPANSION: + main_OBJS := main.o try.o test.o + lib_OBJS := lib.o api.o + + main lib: $$($$@_OBJS) + + Here, after the initial expansion the prerequisites of both the +'main' and 'lib' targets will be '$($@_OBJS)'. During the secondary +expansion, the '$@' variable is set to the name of the target and so the +expansion for the 'main' target will yield '$(main_OBJS)', or 'main.o +try.o test.o', while the secondary expansion for the 'lib' target will +yield '$(lib_OBJS)', or 'lib.o api.o'. + + You can also mix in functions here, as long as they are properly +escaped: + + main_SRCS := main.c try.c test.c + lib_SRCS := lib.c api.c + + .SECONDEXPANSION: + main lib: $$(patsubst %.c,%.o,$$($$@_SRCS)) + + This version allows users to specify source files rather than object +files, but gives the same resulting prerequisites list as the previous +example. + + Evaluation of automatic variables during the secondary expansion +phase, especially of the target name variable '$$@', behaves similarly +to evaluation within recipes. However, there are some subtle +differences and "corner cases" which come into play for the different +types of rule definitions that 'make' understands. The subtleties of +using the different automatic variables are described below. + +Secondary Expansion of Explicit Rules +------------------------------------- + +During the secondary expansion of explicit rules, '$$@' and '$$%' +evaluate, respectively, to the file name of the target and, when the +target is an archive member, the target member name. The '$$<' variable +evaluates to the first prerequisite in the first rule for this target. +'$$^' and '$$+' evaluate to the list of all prerequisites of rules _that +have already appeared_ for the same target ('$$+' with repetitions and +'$$^' without). The following example will help illustrate these +behaviors: + + .SECONDEXPANSION: + + foo: foo.1 bar.1 $$< $$^ $$+ # line #1 + + foo: foo.2 bar.2 $$< $$^ $$+ # line #2 + + foo: foo.3 bar.3 $$< $$^ $$+ # line #3 + + In the first prerequisite list, all three variables ('$$<', '$$^', +and '$$+') expand to the empty string. In the second, they will have +values 'foo.1', 'foo.1 bar.1', and 'foo.1 bar.1' respectively. In the +third they will have values 'foo.1', 'foo.1 bar.1 foo.2 bar.2', and +'foo.1 bar.1 foo.2 bar.2 foo.1 foo.1 bar.1 foo.1 bar.1' respectively. + + Rules undergo secondary expansion in makefile order, except that the +rule with the recipe is always evaluated last. + + The variables '$$?' and '$$*' are not available and expand to the +empty string. + +Secondary Expansion of Static Pattern Rules +------------------------------------------- + +Rules for secondary expansion of static pattern rules are identical to +those for explicit rules, above, with one exception: for static pattern +rules the '$$*' variable is set to the pattern stem. As with explicit +rules, '$$?' is not available and expands to the empty string. + +Secondary Expansion of Implicit Rules +------------------------------------- + +As 'make' searches for an implicit rule, it substitutes the stem and +then performs secondary expansion for every rule with a matching target +pattern. The value of the automatic variables is derived in the same +fashion as for static pattern rules. As an example: + + .SECONDEXPANSION: + + foo: bar + + foo foz: fo%: bo% + + %oo: $$< $$^ $$+ $$* + + When the implicit rule is tried for target 'foo', '$$<' expands to +'bar', '$$^' expands to 'bar boo', '$$+' also expands to 'bar boo', and +'$$*' expands to 'f'. + + Note that the directory prefix (D), as described in *note Implicit +Rule Search Algorithm: Implicit Rule Search, is appended (after +expansion) to all the patterns in the prerequisites list. As an +example: + + .SECONDEXPANSION: + + /tmp/foo.o: + + %.o: $$(addsuffix /%.c,foo bar) foo.h + @echo $^ + + The prerequisite list printed, after the secondary expansion and +directory prefix reconstruction, will be '/tmp/foo/foo.c /tmp/bar/foo.c +foo.h'. If you are not interested in this reconstruction, you can use +'$$*' instead of '%' in the prerequisites list. + + +File: make.info, Node: Rules, Next: Recipes, Prev: Makefiles, Up: Top + +4 Writing Rules +*************** + +A "rule" appears in the makefile and says when and how to remake certain +files, called the rule's "targets" (most often only one per rule). It +lists the other files that are the "prerequisites" of the target, and +the "recipe" to use to create or update the target. + + The order of rules is not significant, except for determining the +"default goal": the target for 'make' to consider, if you do not +otherwise specify one. The default goal is the target of the first rule +in the first makefile. If the first rule has multiple targets, only the +first target is taken as the default. There are two exceptions: a +target starting with a period is not a default unless it contains one or +more slashes, '/', as well; and, a target that defines a pattern rule +has no effect on the default goal. (*Note Defining and Redefining +Pattern Rules: Pattern Rules.) + + Therefore, we usually write the makefile so that the first rule is +the one for compiling the entire program or all the programs described +by the makefile (often with a target called 'all'). *Note Arguments to +Specify the Goals: Goals. + +* Menu: + +* Rule Example:: An example explained. +* Rule Syntax:: General syntax explained. +* Prerequisite Types:: There are two types of prerequisites. +* Wildcards:: Using wildcard characters such as '*'. +* Directory Search:: Searching other directories for source files. +* Phony Targets:: Using a target that is not a real file's name. +* Force Targets:: You can use a target without a recipe + or prerequisites to mark other targets + as phony. +* Empty Targets:: When only the date matters and the + files are empty. +* Special Targets:: Targets with special built-in meanings. +* Multiple Targets:: When to make use of several targets in a rule. +* Multiple Rules:: How to use several rules with the same target. +* Static Pattern:: Static pattern rules apply to multiple targets + and can vary the prerequisites according to + the target name. +* Double-Colon:: How to use a special kind of rule to allow + several independent rules for one target. +* Automatic Prerequisites:: How to automatically generate rules giving + prerequisites from source files themselves. + + +File: make.info, Node: Rule Example, Next: Rule Syntax, Prev: Rules, Up: Rules + +4.1 Rule Example +================ + +Here is an example of a rule: + + foo.o : foo.c defs.h # module for twiddling the frobs + cc -c -g foo.c + + Its target is 'foo.o' and its prerequisites are 'foo.c' and 'defs.h'. +It has one command in the recipe: 'cc -c -g foo.c'. The recipe starts +with a tab to identify it as a recipe. + + This rule says two things: + + * How to decide whether 'foo.o' is out of date: it is out of date if + it does not exist, or if either 'foo.c' or 'defs.h' is more recent + than it. + + * 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 is why 'defs.h' was added to the + prerequisites. + + +File: make.info, Node: Rule Syntax, Next: Prerequisite Types, Prev: Rule Example, Up: Rules + +4.2 Rule Syntax +=============== + +In general, a rule looks like this: + + TARGETS : PREREQUISITES + RECIPE + ... + +or like this: + + TARGETS : PREREQUISITES ; RECIPE + RECIPE + ... + + The TARGETS are file names, separated by spaces. Wildcard characters +may be used (*note Using Wildcard Characters in File Names: Wildcards.) +and a name of the form 'A(M)' represents member M in archive file A +(*note Archive Members as Targets: Archive Members.). Usually there is +only one target per rule, but occasionally there is a reason to have +more (*note Multiple Targets in a Rule: Multiple Targets.). + + The RECIPE lines start with a tab character (or the first character +in the value of the '.RECIPEPREFIX' variable; *note Special +Variables::). The first recipe line may appear on the line after the +prerequisites, with a tab character, or may appear on the same line, +with a semicolon. Either way, the effect is the same. There are other +differences in the syntax of recipes. *Note Writing Recipes in Rules: +Recipes. + + Because dollar signs are used to start 'make' variable references, if +you really want a dollar sign in a target or prerequisite you must write +two of them, '$$' (*note How to Use Variables: Using Variables.). If +you have enabled secondary expansion (*note Secondary Expansion::) and +you want a literal dollar sign in the prerequisites list, you must +actually write _four_ dollar signs ('$$$$'). + + You may split a long line by inserting a backslash followed by a +newline, but this is not required, as 'make' places no limit on the +length of a line in a makefile. + + A rule tells 'make' two things: when the targets are out of date, and +how to update them when necessary. + + The criterion for being out of date is specified in terms of the +PREREQUISITES, which consist of file names separated by spaces. +(Wildcards and archive members (*note Archives::) are allowed here too.) +A target is out of date if it does not exist or if it is older than any +of the prerequisites (by comparison of last-modification times). The +idea is that the contents of the target file are computed based on +information in the prerequisites, so if any of the prerequisites +changes, the contents of the existing target file are no longer +necessarily valid. + + How to update is specified by a RECIPE. This is one or more lines to +be executed by the shell (normally 'sh'), but with some extra features +(*note Writing Recipes in Rules: Recipes.). + + +File: make.info, Node: Prerequisite Types, Next: Wildcards, Prev: Rule Syntax, Up: Rules + +4.3 Types of Prerequisites +========================== + +There are actually two different types of prerequisites understood by +GNU 'make': normal prerequisites such as described in the previous +section, and "order-only" prerequisites. A normal prerequisite makes +two statements: first, it imposes an order in which recipes will be +invoked: the recipes for all prerequisites of a target will be completed +before the recipe for the target is run. Second, it imposes a +dependency relationship: if any prerequisite is newer than the target, +then the target is considered out-of-date and must be rebuilt. + + Normally, this is exactly what you want: if a target's prerequisite +is updated, then the target should also be updated. + + Occasionally, however, you have a situation where you want to impose +a specific ordering on the rules to be invoked _without_ forcing the +target to be updated if one of those rules is executed. In that case, +you want to define "order-only" prerequisites. Order-only prerequisites +can be specified by placing a pipe symbol ('|') in the prerequisites +list: any prerequisites to the left of the pipe symbol are normal; any +prerequisites to the right are order-only: + + TARGETS : NORMAL-PREREQUISITES | ORDER-ONLY-PREREQUISITES + + The normal prerequisites section may of course be empty. Also, you +may still declare multiple lines of prerequisites for the same target: +they are appended appropriately (normal prerequisites are appended to +the list of normal prerequisites; order-only prerequisites are appended +to the list of order-only prerequisites). Note that if you declare the +same file to be both a normal and an order-only prerequisite, the normal +prerequisite takes precedence (since they have a strict superset of the +behavior of an order-only prerequisite). + + Consider an example where your targets are to be placed in a separate +directory, and that directory might not exist before 'make' is run. In +this situation, you want the directory to be created before any targets +are placed into it but, because the timestamps on directories change +whenever a file is added, removed, or renamed, we certainly don't want +to rebuild all the targets whenever the directory's timestamp changes. +One way to manage this is with order-only prerequisites: make the +directory an order-only prerequisite on all the targets: + + OBJDIR := objdir + OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o) + + $(OBJDIR)/%.o : %.c + $(COMPILE.c) $(OUTPUT_OPTION) $< + + all: $(OBJS) + + $(OBJS): | $(OBJDIR) + + $(OBJDIR): + mkdir $(OBJDIR) + + Now the rule to create the 'objdir' directory will be run, if needed, +before any '.o' is built, but no '.o' will be built because the 'objdir' +directory timestamp changed. + + +File: make.info, Node: Wildcards, Next: Directory Search, Prev: Prerequisite Types, Up: Rules + +4.4 Using Wildcard Characters in File Names +=========================================== + +A single file name can specify many files using "wildcard characters". +The wildcard characters in 'make' are '*', '?' and '[...]', the same as +in the Bourne shell. For example, '*.c' specifies a list of all the +files (in the working directory) whose names end in '.c'. + + The character '~' at the beginning of a file name also has special +significance. If alone, or followed by a slash, it represents your home +directory. For example '~/bin' expands to '/home/you/bin'. If the '~' +is followed by a word, the string represents the home directory of the +user named by that word. For example '~john/bin' expands to +'/home/john/bin'. On systems which don't have a home directory for each +user (such as MS-DOS or MS-Windows), this functionality can be simulated +by setting the environment variable HOME. + + Wildcard expansion is performed by 'make' automatically in targets +and in prerequisites. In recipes, the shell is responsible for wildcard +expansion. In other contexts, wildcard expansion happens only if you +request it explicitly with the 'wildcard' function. + + The special significance of a wildcard character can be turned off by +preceding it with a backslash. Thus, 'foo\*bar' would refer to a +specific file whose name consists of 'foo', an asterisk, and 'bar'. + +* Menu: + +* Wildcard Examples:: Several examples. +* Wildcard Pitfall:: Problems to avoid. +* Wildcard Function:: How to cause wildcard expansion where + it does not normally take place. + + +File: make.info, Node: Wildcard Examples, Next: Wildcard Pitfall, Prev: Wildcards, Up: Wildcards + +4.4.1 Wildcard Examples +----------------------- + +Wildcards can be used in the recipe of a rule, where they are expanded +by the shell. For example, here is a rule to delete all the object +files: + + clean: + rm -f *.o + + Wildcards are also useful in the prerequisites of a rule. With the +following rule in the makefile, 'make print' will print all the '.c' +files that have changed since the last time you printed them: + + print: *.c + lpr -p $? + touch print + +This rule uses 'print' as an empty target file; see *note Empty Target +Files to Record Events: Empty Targets. (The automatic variable '$?' is +used to print only those files that have changed; see *note Automatic +Variables::.) + + Wildcard expansion does not happen when you define a variable. Thus, +if you write this: + + objects = *.o + +then the value of the variable 'objects' is the actual string '*.o'. +However, if you use the value of 'objects' in a target or prerequisite, +wildcard expansion will take place there. If you use the value of +'objects' in a recipe, the shell may perform wildcard expansion when the +recipe runs. To set 'objects' to the expansion, instead use: + + objects := $(wildcard *.o) + +*Note Wildcard Function::. + + +File: make.info, Node: Wildcard Pitfall, Next: Wildcard Function, Prev: Wildcard Examples, Up: Wildcards + +4.4.2 Pitfalls of Using Wildcards +--------------------------------- + +Now here is an example of a naive way of using wildcard expansion, that +does not do what you would intend. Suppose you would like to say that +the executable file 'foo' is made from all the object files in the +directory, and you write this: + + objects = *.o + + foo : $(objects) + cc -o foo $(CFLAGS) $(objects) + +The value of 'objects' is the actual string '*.o'. Wildcard expansion +happens in the rule for 'foo', so that each _existing_ '.o' file becomes +a prerequisite of 'foo' and will be recompiled if necessary. + + But what if you delete all the '.o' files? When a wildcard matches +no files, it is left as it is, so then 'foo' will depend on the +oddly-named file '*.o'. Since no such file is likely to exist, 'make' +will give you an error saying it cannot figure out how to make '*.o'. +This is not what you want! + + Actually it is possible to obtain the desired result with wildcard +expansion, but you need more sophisticated techniques, including the +'wildcard' function and string substitution. *Note The Function +'wildcard': Wildcard Function. + + Microsoft operating systems (MS-DOS and MS-Windows) use backslashes +to separate directories in pathnames, like so: + + c:\foo\bar\baz.c + + This is equivalent to the Unix-style 'c:/foo/bar/baz.c' (the 'c:' +part is the so-called drive letter). When 'make' runs on these systems, +it supports backslashes as well as the Unix-style forward slashes in +pathnames. However, this support does _not_ include the wildcard +expansion, where backslash is a quote character. Therefore, you _must_ +use Unix-style slashes in these cases. + + +File: make.info, Node: Wildcard Function, Prev: Wildcard Pitfall, Up: Wildcards + +4.4.3 The Function 'wildcard' +----------------------------- + +Wildcard expansion happens automatically in rules. But wildcard +expansion does not normally take place when a variable is set, or inside +the arguments of a function. If you want to do wildcard expansion in +such places, you need to use the 'wildcard' function, like this: + + $(wildcard PATTERN...) + +This string, used anywhere in a makefile, is replaced by a +space-separated list of names of existing files that match one of the +given file name patterns. If no existing file name matches a pattern, +then that pattern is omitted from the output of the 'wildcard' function. +Note that this is different from how unmatched wildcards behave in +rules, where they are used verbatim rather than ignored (*note Wildcard +Pitfall::). + + One use of the 'wildcard' function is to get a list of all the C +source files in a directory, like this: + + $(wildcard *.c) + + We can change the list of C source files into a list of object files +by replacing the '.c' suffix with '.o' in the result, like this: + + $(patsubst %.c,%.o,$(wildcard *.c)) + +(Here we have used another function, 'patsubst'. *Note Functions for +String Substitution and Analysis: Text Functions.) + + Thus, a makefile to compile all C source files in the directory and +then link them together could be written as follows: + + objects := $(patsubst %.c,%.o,$(wildcard *.c)) + + foo : $(objects) + cc -o foo $(objects) + +(This takes advantage of the implicit rule for compiling C programs, so +there is no need to write explicit rules for compiling the files. *Note +The Two Flavors of Variables: Flavors, for an explanation of ':=', which +is a variant of '='.) + + +File: make.info, Node: Directory Search, Next: Phony Targets, Prev: Wildcards, Up: Rules + +4.5 Searching Directories for Prerequisites +=========================================== + +For large systems, it is often desirable to put sources in a separate +directory from the binaries. The "directory search" features of 'make' +facilitate this by searching several directories automatically to find a +prerequisite. When you redistribute the files among directories, you do +not need to change the individual rules, just the search paths. + +* Menu: + +* General Search:: Specifying a search path that applies + to every prerequisite. +* Selective Search:: Specifying a search path + for a specified class of names. +* Search Algorithm:: When and how search paths are applied. +* Recipes/Search:: How to write recipes that work together + with search paths. +* Implicit/Search:: How search paths affect implicit rules. +* Libraries/Search:: Directory search for link libraries. + + +File: make.info, Node: General Search, Next: Selective Search, Prev: Directory Search, Up: Directory Search + +4.5.1 'VPATH': Search Path for All Prerequisites +------------------------------------------------ + +The value of the 'make' variable 'VPATH' specifies a list of directories +that 'make' should search. Most often, the directories are expected to +contain prerequisite files that are not in the current directory; +however, 'make' uses 'VPATH' as a search list for both prerequisites and +targets of rules. + + Thus, if a file that is listed as a target or prerequisite does not +exist in the current directory, 'make' searches the directories listed +in 'VPATH' for a file with that name. If a file is found in one of +them, that file may become the prerequisite (see below). Rules may then +specify the names of files in the prerequisite list as if they all +existed in the current directory. *Note Writing Recipes with Directory +Search: Recipes/Search. + + In the 'VPATH' variable, directory names are separated by colons or +blanks. The order in which directories are listed is the order followed +by 'make' in its search. (On MS-DOS and MS-Windows, semi-colons are +used as separators of directory names in 'VPATH', since the colon can be +used in the pathname itself, after the drive letter.) + + For example, + + VPATH = src:../headers + +specifies a path containing two directories, 'src' and '../headers', +which 'make' searches in that order. + + With this value of 'VPATH', the following rule, + + foo.o : foo.c + +is interpreted as if it were written like this: + + foo.o : src/foo.c + +assuming the file 'foo.c' does not exist in the current directory but is +found in the directory 'src'. + + +File: make.info, Node: Selective Search, Next: Search Algorithm, Prev: General Search, Up: Directory Search + +4.5.2 The 'vpath' Directive +--------------------------- + +Similar to the 'VPATH' variable, but more selective, is the 'vpath' +directive (note lower case), which allows you to specify a search path +for a particular class of file names: those that match a particular +pattern. Thus you can supply certain search directories for one class +of file names and other directories (or none) for other file names. + + There are three forms of the 'vpath' directive: + +'vpath PATTERN DIRECTORIES' + Specify the search path DIRECTORIES for file names that match + PATTERN. + + The search path, DIRECTORIES, is a list of directories to be + searched, separated by colons (semi-colons on MS-DOS and + MS-Windows) or blanks, just like the search path used in the + 'VPATH' variable. + +'vpath PATTERN' + Clear out the search path associated with PATTERN. + +'vpath' + + Clear all search paths previously specified with 'vpath' + directives. + + A 'vpath' pattern is a string containing a '%' character. The string +must match the file name of a prerequisite that is being searched for, +the '%' character matching any sequence of zero or more characters (as +in pattern rules; *note Defining and Redefining Pattern Rules: Pattern +Rules.). For example, '%.h' matches files that end in '.h'. (If there +is no '%', the pattern must match the prerequisite exactly, which is not +useful very often.) + + '%' characters in a 'vpath' directive's pattern can be quoted with +preceding backslashes ('\'). Backslashes that would otherwise quote '%' +characters can be quoted with more backslashes. Backslashes that quote +'%' characters or other backslashes are removed from the pattern before +it is compared to file names. Backslashes that are not in danger of +quoting '%' characters go unmolested. + + When a prerequisite fails to exist in the current directory, if the +PATTERN in a 'vpath' directive matches the name of the prerequisite +file, then the DIRECTORIES in that directive are searched just like (and +before) the directories in the 'VPATH' variable. + + For example, + + vpath %.h ../headers + +tells 'make' to look for any prerequisite whose name ends in '.h' in the +directory '../headers' if the file is not found in the current +directory. + + If several 'vpath' patterns match the prerequisite file's name, then +'make' processes each matching 'vpath' directive one by one, searching +all the directories mentioned in each directive. 'make' handles +multiple 'vpath' directives in the order in which they appear in the +makefile; multiple directives with the same pattern are independent of +each other. + + Thus, + + vpath %.c foo + vpath % blish + vpath %.c bar + +will look for a file ending in '.c' in 'foo', then 'blish', then 'bar', +while + + vpath %.c foo:bar + vpath % blish + +will look for a file ending in '.c' in 'foo', then 'bar', then 'blish'. + + +File: make.info, Node: Search Algorithm, Next: Recipes/Search, Prev: Selective Search, Up: Directory Search + +4.5.3 How Directory Searches are Performed +------------------------------------------ + +When a prerequisite is found through directory search, regardless of +type (general or selective), the pathname located may not be the one +that 'make' actually provides you in the prerequisite list. Sometimes +the path discovered through directory search is thrown away. + + The algorithm 'make' uses to decide whether to keep or abandon a path +found via directory search is as follows: + + 1. If a target file does not exist at the path specified in the + makefile, directory search is performed. + + 2. If the directory search is successful, that path is kept and this + file is tentatively stored as the target. + + 3. All prerequisites of this target are examined using this same + method. + + 4. After processing the prerequisites, the target may or may not need + to be rebuilt: + + a. If the target does _not_ need to be rebuilt, the path to the + file found during directory search is used for any + prerequisite lists which contain this target. In short, if + 'make' doesn't need to rebuild the target then you use the + path found via directory search. + + b. If the target _does_ need to be rebuilt (is out-of-date), the + pathname found during directory search is _thrown away_, and + the target is rebuilt using the file name specified in the + makefile. In short, if 'make' must rebuild, then the target + is rebuilt locally, not in the directory found via directory + search. + + This algorithm may seem complex, but in practice it is quite often +exactly what you want. + + Other versions of 'make' use a simpler algorithm: if the file does +not exist, and it is found via directory search, then that pathname is +always used whether or not the target needs to be built. Thus, if the +target is rebuilt it is created at the pathname discovered during +directory search. + + If, in fact, this is the behavior you want for some or all of your +directories, you can use the 'GPATH' variable to indicate this to +'make'. + + 'GPATH' has the same syntax and format as 'VPATH' (that is, a space- +or colon-delimited list of pathnames). If an out-of-date target is +found by directory search in a directory that also appears in 'GPATH', +then that pathname is not thrown away. The target is rebuilt using the +expanded path. + + +File: make.info, Node: Recipes/Search, Next: Implicit/Search, Prev: Search Algorithm, Up: Directory Search + +4.5.4 Writing Recipes with Directory Search +------------------------------------------- + +When a prerequisite is found in another directory through directory +search, this cannot change the recipe of the rule; they will execute as +written. Therefore, you must write the recipe with care so that it will +look for the prerequisite in the directory where 'make' finds it. + + This is done with the "automatic variables" such as '$^' (*note +Automatic Variables::). For instance, the value of '$^' is a list of +all the prerequisites of the rule, including the names of the +directories in which they were found, and the value of '$@' is the +target. Thus: + + foo.o : foo.c + cc -c $(CFLAGS) $^ -o $@ + +(The variable 'CFLAGS' exists so you can specify flags for C compilation +by implicit rules; we use it here for consistency so it will affect all +C compilations uniformly; *note Variables Used by Implicit Rules: +Implicit Variables.) + + Often the prerequisites include header files as well, which you do +not want to mention in the recipe. The automatic variable '$<' is just +the first prerequisite: + + VPATH = src:../headers + foo.o : foo.c defs.h hack.h + cc -c $(CFLAGS) $< -o $@ + + +File: make.info, Node: Implicit/Search, Next: Libraries/Search, Prev: Recipes/Search, Up: Directory Search + +4.5.5 Directory Search and Implicit Rules +----------------------------------------- + +The search through the directories specified in 'VPATH' or with 'vpath' +also happens during consideration of implicit rules (*note Using +Implicit Rules: Implicit Rules.). + + For example, when a file 'foo.o' has no explicit rule, 'make' +considers implicit rules, such as the built-in rule to compile 'foo.c' +if that file exists. If such a file is lacking in the current +directory, the appropriate directories are searched for it. If 'foo.c' +exists (or is mentioned in the makefile) in any of the directories, the +implicit rule for C compilation is applied. + + The recipes of implicit rules normally use automatic variables as a +matter of necessity; consequently they will use the file names found by +directory search with no extra effort. + + +File: make.info, Node: Libraries/Search, Prev: Implicit/Search, Up: Directory Search + +4.5.6 Directory Search for Link Libraries +----------------------------------------- + +Directory search applies in a special way to libraries used with the +linker. This special feature comes into play when you write a +prerequisite whose name is of the form '-lNAME'. (You can tell +something strange is going on here because the prerequisite is normally +the name of a file, and the _file name_ of a library generally looks +like 'libNAME.a', not like '-lNAME'.) + + When a prerequisite's name has the form '-lNAME', 'make' handles it +specially by searching for the file 'libNAME.so', and, if it is not +found, for the file 'libNAME.a' in the current directory, in directories +specified by matching 'vpath' search paths and the 'VPATH' search path, +and then in the directories '/lib', '/usr/lib', and 'PREFIX/lib' +(normally '/usr/local/lib', but MS-DOS/MS-Windows versions of 'make' +behave as if PREFIX is defined to be the root of the DJGPP installation +tree). + + For example, if there is a '/usr/lib/libcurses.a' library on your +system (and no '/usr/lib/libcurses.so' file), then + + foo : foo.c -lcurses + cc $^ -o $@ + +would cause the command 'cc foo.c /usr/lib/libcurses.a -o foo' to be +executed when 'foo' is older than 'foo.c' or than +'/usr/lib/libcurses.a'. + + Although the default set of files to be searched for is 'libNAME.so' +and 'libNAME.a', this is customizable via the '.LIBPATTERNS' variable. +Each word in the value of this variable is a pattern string. When a +prerequisite like '-lNAME' is seen, 'make' will replace the percent in +each pattern in the list with NAME and perform the above directory +searches using each library file name. + + The default value for '.LIBPATTERNS' is 'lib%.so lib%.a', which +provides the default behavior described above. + + You can turn off link library expansion completely by setting this +variable to an empty value. + + +File: make.info, Node: Phony Targets, Next: Force Targets, Prev: Directory Search, Up: Rules + +4.6 Phony Targets +================= + +A phony target is one that is not really the name of a file; rather it +is just a name for a recipe to be executed when you make an explicit +request. There are two reasons to use a phony target: to avoid a +conflict with a file of the same name, and to improve performance. + + If you write a rule whose recipe will not create the target file, the +recipe will be executed every time the target comes up for remaking. +Here is an example: + + clean: + rm *.o temp + +Because the 'rm' command does not create a file named 'clean', probably +no such file will ever exist. Therefore, the 'rm' command will be +executed every time you say 'make clean'. + + In this example, the 'clean' target will not work properly if a file +named 'clean' is ever created in this directory. Since it has no +prerequisites, 'clean' would always be considered up to date and its +recipe would not be executed. To avoid this problem you can explicitly +declare the target to be phony by making it a prerequisite of the +special target '.PHONY' (*note Special Built-in Target Names: Special +Targets.) as follows: + + .PHONY: clean + clean: + rm *.o temp + +Once this is done, 'make clean' will run the recipe regardless of +whether there is a file named 'clean'. + + Phony targets are also useful in conjunction with recursive +invocations of 'make' (*note Recursive Use of 'make': Recursion.). In +this situation the makefile will often contain a variable which lists a +number of sub-directories to be built. A simplistic way to handle this +is to define one rule with a recipe that loops over the sub-directories, +like this: + + SUBDIRS = foo bar baz + + subdirs: + for dir in $(SUBDIRS); do \ + $(MAKE) -C $$dir; \ + done + + There are problems with this method, however. First, any error +detected in a sub-make is ignored by this rule, so it will continue to +build the rest of the directories even when one fails. This can be +overcome by adding shell commands to note the error and exit, but then +it will do so even if 'make' is invoked with the '-k' option, which is +unfortunate. Second, and perhaps more importantly, you cannot take +advantage of 'make''s ability to build targets in parallel (*note +Parallel Execution: Parallel.), since there is only one rule. + + By declaring the sub-directories as '.PHONY' targets (you must do +this as the sub-directory obviously always exists; otherwise it won't be +built) you can remove these problems: + + SUBDIRS = foo bar baz + + .PHONY: subdirs $(SUBDIRS) + + subdirs: $(SUBDIRS) + + $(SUBDIRS): + $(MAKE) -C $@ + + foo: baz + + Here we've also declared that the 'foo' sub-directory cannot be built +until after the 'baz' sub-directory is complete; this kind of +relationship declaration is particularly important when attempting +parallel builds. + + The implicit rule search (*note Implicit Rules::) is skipped for +'.PHONY' targets. This is why declaring a target as '.PHONY' is good +for performance, even if you are not worried about the actual file +existing. + + A phony target should not be a prerequisite of a real target file; if +it is, its recipe will be run every time 'make' goes to update that +file. As long as a phony target is never a prerequisite of a real +target, the phony target recipe will be executed only when the phony +target is a specified goal (*note Arguments to Specify the Goals: +Goals.). + + Phony targets can have prerequisites. When one directory contains +multiple programs, it is most convenient to describe all of the programs +in one makefile './Makefile'. Since the target remade by default will +be the first one in the makefile, it is common to make this a phony +target named 'all' and give it, as prerequisites, all the individual +programs. For example: + + all : prog1 prog2 prog3 + .PHONY : all + + prog1 : prog1.o utils.o + cc -o prog1 prog1.o utils.o + + prog2 : prog2.o + cc -o prog2 prog2.o + + prog3 : prog3.o sort.o utils.o + cc -o prog3 prog3.o sort.o utils.o + +Now you can say just 'make' to remake all three programs, or specify as +arguments the ones to remake (as in 'make prog1 prog3'). Phoniness is +not inherited: the prerequisites of a phony target are not themselves +phony, unless explicitly declared to be so. + + When one phony target is a prerequisite of another, it serves as a +subroutine of the other. For example, here 'make cleanall' will delete +the object files, the difference files, and the file 'program': + + .PHONY: cleanall cleanobj cleandiff + + cleanall : cleanobj cleandiff + rm program + + cleanobj : + rm *.o + + cleandiff : + rm *.diff + + +File: make.info, Node: Force Targets, Next: Empty Targets, Prev: Phony Targets, Up: Rules + +4.7 Rules without Recipes or Prerequisites +========================================== + +If a rule has no prerequisites or recipe, and the target of the rule is +a nonexistent file, then 'make' imagines this target to have been +updated whenever its rule is run. This implies that all targets +depending on this one will always have their recipe run. + + An example will illustrate this: + + clean: FORCE + rm $(objects) + FORCE: + + Here the target 'FORCE' satisfies the special conditions, so the +target 'clean' that depends on it is forced to run its recipe. There is +nothing special about the name 'FORCE', but that is one name commonly +used this way. + + As you can see, using 'FORCE' this way has the same results as using +'.PHONY: clean'. + + Using '.PHONY' is more explicit and more efficient. However, other +versions of 'make' do not support '.PHONY'; thus 'FORCE' appears in many +makefiles. *Note Phony Targets::. + + +File: make.info, Node: Empty Targets, Next: Special Targets, Prev: Force Targets, Up: Rules + +4.8 Empty Target Files to Record Events +======================================= + +The "empty target" is a variant of the phony target; it is used to hold +recipes for an action that you request explicitly from time to time. +Unlike a phony target, this target file can really exist; but the file's +contents do not matter, and usually are empty. + + The purpose of the empty target file is to record, with its +last-modification time, when the rule's recipe was last executed. It +does so because one of the commands in the recipe is a 'touch' command +to update the target file. + + The empty target file should have some prerequisites (otherwise it +doesn't make sense). When you ask to remake the empty target, the +recipe is executed if any prerequisite is more recent than the target; +in other words, if a prerequisite has changed since the last time you +remade the target. Here is an example: + + print: foo.c bar.c + lpr -p $? + touch print + +With this rule, 'make print' will execute the 'lpr' command if either +source file has changed since the last 'make print'. The automatic +variable '$?' is used to print only those files that have changed (*note +Automatic Variables::). + + +File: make.info, Node: Special Targets, Next: Multiple Targets, Prev: Empty Targets, Up: Rules + +4.9 Special Built-in Target Names +================================= + +Certain names have special meanings if they appear as targets. + +'.PHONY' + + The prerequisites of the special target '.PHONY' are considered to + be phony targets. When it is time to consider such a target, + 'make' will run its recipe unconditionally, regardless of whether a + file with that name exists or what its last-modification time is. + *Note Phony Targets: Phony Targets. + +'.SUFFIXES' + + The prerequisites of the special target '.SUFFIXES' are the list of + suffixes to be used in checking for suffix rules. *Note + Old-Fashioned Suffix Rules: Suffix Rules. + +'.DEFAULT' + + The recipe specified for '.DEFAULT' is used for any target for + which no rules are found (either explicit rules or implicit rules). + *Note Last Resort::. If a '.DEFAULT' recipe is specified, every + file mentioned as a prerequisite, but not as a target in a rule, + will have that recipe executed on its behalf. *Note Implicit Rule + Search Algorithm: Implicit Rule Search. + +'.PRECIOUS' + + The targets which '.PRECIOUS' depends on are given the following + special treatment: if 'make' is killed or interrupted during the + execution of their recipes, the target is not deleted. *Note + Interrupting or Killing 'make': Interrupts. Also, if the target is + an intermediate file, it will not be deleted after it is no longer + needed, as is normally done. *Note Chains of Implicit Rules: + Chained Rules. In this latter respect it overlaps with the + '.SECONDARY' special target. + + You can also list the target pattern of an implicit rule (such as + '%.o') as a prerequisite file of the special target '.PRECIOUS' to + preserve intermediate files created by rules whose target patterns + match that file's name. + +'.INTERMEDIATE' + + The targets which '.INTERMEDIATE' depends on are treated as + intermediate files. *Note Chains of Implicit Rules: Chained Rules. + '.INTERMEDIATE' with no prerequisites has no effect. + +'.SECONDARY' + + The targets which '.SECONDARY' depends on are treated as + intermediate files, except that they are never automatically + deleted. *Note Chains of Implicit Rules: Chained Rules. + + '.SECONDARY' with no prerequisites causes all targets to be treated + as secondary (i.e., no target is removed because it is considered + intermediate). + +'.SECONDEXPANSION' + + If '.SECONDEXPANSION' is mentioned as a target anywhere in the + makefile, then all prerequisite lists defined _after_ it appears + will be expanded a second time after all makefiles have been read + in. *Note Secondary Expansion: Secondary Expansion. + +'.DELETE_ON_ERROR' + + If '.DELETE_ON_ERROR' is mentioned as a target anywhere in the + makefile, then 'make' will delete the target of a rule if it has + changed and its recipe exits with a nonzero exit status, just as it + does when it receives a signal. *Note Errors in Recipes: Errors. + +'.IGNORE' + + If you specify prerequisites for '.IGNORE', then 'make' will ignore + errors in execution of the recipe for those particular files. The + recipe for '.IGNORE' (if any) is ignored. + + If mentioned as a target with no prerequisites, '.IGNORE' says to + ignore errors in execution of recipes for all files. This usage of + '.IGNORE' is supported only for historical compatibility. Since + this affects every recipe in the makefile, it is not very useful; + we recommend you use the more selective ways to ignore errors in + specific recipes. *Note Errors in Recipes: Errors. + +'.LOW_RESOLUTION_TIME' + + If you specify prerequisites for '.LOW_RESOLUTION_TIME', 'make' + assumes that these files are created by commands that generate low + resolution time stamps. The recipe for the '.LOW_RESOLUTION_TIME' + target are ignored. + + The high resolution file time stamps of many modern file systems + lessen the chance of 'make' incorrectly concluding that a file is + up to date. Unfortunately, some hosts do not provide a way to set + a high resolution file time stamp, so commands like 'cp -p' that + explicitly set a file's time stamp must discard its sub-second + part. If a file is created by such a command, you should list it + as a prerequisite of '.LOW_RESOLUTION_TIME' so that 'make' does not + mistakenly conclude that the file is out of date. For example: + + .LOW_RESOLUTION_TIME: dst + dst: src + cp -p src dst + + Since 'cp -p' discards the sub-second part of 'src''s time stamp, + 'dst' is typically slightly older than 'src' even when it is up to + date. The '.LOW_RESOLUTION_TIME' line causes 'make' to consider + 'dst' to be up to date if its time stamp is at the start of the + same second that 'src''s time stamp is in. + + Due to a limitation of the archive format, archive member time + stamps are always low resolution. You need not list archive + members as prerequisites of '.LOW_RESOLUTION_TIME', as 'make' does + this automatically. + +'.SILENT' + + If you specify prerequisites for '.SILENT', then 'make' will not + print the recipe used to remake those particular files before + 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. 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' + + Simply by being mentioned as a target, this tells 'make' to export + all variables to child processes by default. *Note Communicating + Variables to a Sub-'make': Variables/Recursion. + +'.NOTPARALLEL' + + If '.NOTPARALLEL' is mentioned as a target, then this invocation of + 'make' will be run serially, even if the '-j' option is given. Any + recursively invoked 'make' command will still run recipes in + parallel (unless its makefile also contains this target). Any + prerequisites on this target are ignored. + +'.ONESHELL' + + If '.ONESHELL' is mentioned as a target, then when a target is + built all lines of the recipe will be given to a single invocation + of the shell rather than each line being invoked separately (*note + Recipe Execution: Execution.). + +'.POSIX' + + If '.POSIX' is mentioned as a target, then the makefile will be + parsed and run in POSIX-conforming mode. This does _not_ mean that + only POSIX-conforming makefiles will be accepted: all advanced GNU + 'make' features are still available. Rather, this target causes + 'make' to behave as required by POSIX in those areas where 'make''s + default behavior differs. + + In particular, if this target is mentioned then recipes will be + invoked as if the shell had been passed the '-e' flag: the first + failing command in a recipe will cause the recipe to fail + immediately. + + Any defined implicit rule suffix also counts as a special target if +it appears as a target, and so does the concatenation of two suffixes, +such as '.c.o'. These targets are suffix rules, an obsolete way of +defining implicit rules (but a way still widely used). In principle, +any target name could be special in this way if you break it in two and +add both pieces to the suffix list. In practice, suffixes normally +begin with '.', so these special target names also begin with '.'. +*Note Old-Fashioned Suffix Rules: Suffix Rules. + + +File: make.info, Node: Multiple Targets, Next: Multiple Rules, Prev: Special Targets, Up: Rules + +4.10 Multiple Targets in a Rule +=============================== + +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. + +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. 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 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,,$@) > $@ + + is equivalent to + + bigoutput : text.g + generate text.g -big > bigoutput + littleoutput : text.g + generate text.g -little > littleoutput + + Here we assume the hypothetical program 'generate' makes two types + of output, one if given '-big' and one if given '-little'. *Note + Functions for String Substitution and Analysis: Text Functions, for + an explanation of the 'subst' function. + + Suppose you would like to vary the prerequisites according to the +target, much as the variable '$@' allows you to vary the recipe. You +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. + + +File: make.info, Node: Multiple Rules, Next: Static Pattern, Prev: Multiple Targets, Up: Rules + +4.11 Multiple Rules for One Target +================================== + +One file can be the target of several rules. All the prerequisites +mentioned in all the rules are merged into one list of prerequisites for +the target. If the target is older than any prerequisite from any rule, +the recipe is executed. + + There can only be one recipe to be executed for a file. If more than +one rule gives a recipe for the same file, 'make' uses the last one +given and prints an error message. (As a special case, if the file's +name begins with a dot, no error message is printed. This odd behavior +is only for compatibility with other implementations of 'make'... you +should avoid using it). Occasionally it is useful to have the same +target invoke multiple recipes which are defined in different parts of +your makefile; you can use "double-colon rules" (*note Double-Colon::) +for this. + + An extra rule with just prerequisites can be used to give a few extra +prerequisites to many files at once. For example, makefiles often have +a variable, such as 'objects', containing a list of all the compiler +output files in the system being made. An easy way to say that all of +them must be recompiled if 'config.h' changes is to write the following: + + objects = foo.o bar.o + foo.o : defs.h + bar.o : defs.h test.h + $(objects) : config.h + + This could be inserted or taken out without changing the rules that +really specify how to make the object files, making it a convenient form +to use if you wish to add the additional prerequisite intermittently. + + Another wrinkle is that the additional prerequisites could be +specified with a variable that you set with a command line argument to +'make' (*note Overriding Variables: Overriding.). For example, + + extradeps= + $(objects) : $(extradeps) + +means that the command 'make extradeps=foo.h' will consider 'foo.h' as a +prerequisite of each object file, but plain 'make' will not. + + If none of the explicit rules for a target has a recipe, then 'make' +searches for an applicable implicit rule to find one *note Using +Implicit Rules: Implicit Rules.). + + +File: make.info, Node: Static Pattern, Next: Double-Colon, Prev: Multiple Rules, Up: Rules + +4.12 Static Pattern Rules +========================= + +"Static pattern rules" are rules which specify multiple targets and +construct the prerequisite names for each target based on the target +name. They are more general than ordinary rules with multiple targets +because the targets do not have to have identical prerequisites. Their +prerequisites must be _analogous_, but not necessarily _identical_. + +* Menu: + +* Static Usage:: The syntax of static pattern rules. +* Static versus Implicit:: When are they better than implicit rules? + + +File: make.info, Node: Static Usage, Next: Static versus Implicit, Prev: Static Pattern, Up: Static Pattern + +4.12.1 Syntax of Static Pattern Rules +------------------------------------- + +Here is the syntax of a static pattern rule: + + TARGETS ...: TARGET-PATTERN: PREREQ-PATTERNS ... + RECIPE + ... + +The TARGETS list specifies the targets that the rule applies to. The +targets can contain wildcard characters, just like the targets of +ordinary rules (*note Using Wildcard Characters in File Names: +Wildcards.). + + The TARGET-PATTERN and PREREQ-PATTERNS say how to compute the +prerequisites of each target. Each target is matched against the +TARGET-PATTERN to extract a part of the target name, called the "stem". +This stem is substituted into each of the PREREQ-PATTERNS to make the +prerequisite names (one from each PREREQ-PATTERN). + + Each pattern normally contains the character '%' just once. When the +TARGET-PATTERN matches a target, the '%' can match any part of the +target name; this part is called the "stem". The rest of the pattern +must match exactly. For example, the target 'foo.o' matches the pattern +'%.o', with 'foo' as the stem. The targets 'foo.c' and 'foo.out' do not +match that pattern. + + The prerequisite names for each target are made by substituting the +stem for the '%' in each prerequisite pattern. For example, if one +prerequisite pattern is '%.c', then substitution of the stem 'foo' gives +the prerequisite name 'foo.c'. It is legitimate to write a prerequisite +pattern that does not contain '%'; then this prerequisite is the same +for all targets. + + '%' characters in pattern rules can be quoted with preceding +backslashes ('\'). Backslashes that would otherwise quote '%' +characters can be quoted with more backslashes. Backslashes that quote +'%' characters or other backslashes are removed from the pattern before +it is compared to file names or has a stem substituted into it. +Backslashes that are not in danger of quoting '%' characters go +unmolested. For example, the pattern 'the\%weird\\%pattern\\' has +'the%weird\' preceding the operative '%' character, and 'pattern\\' +following it. The final two backslashes are left alone because they +cannot affect any '%' character. + + Here is an example, which compiles each of 'foo.o' and 'bar.o' from +the corresponding '.c' file: + + objects = foo.o bar.o + + all: $(objects) + + $(objects): %.o: %.c + $(CC) -c $(CFLAGS) $< -o $@ + +Here '$<' is the automatic variable that holds the name of the +prerequisite and '$@' is the automatic variable that holds the name of +the target; see *note Automatic Variables::. + + Each target specified must match the target pattern; a warning is +issued for each target that does not. If you have a list of files, only +some of which will match the pattern, you can use the 'filter' function +to remove non-matching file names (*note Functions for String +Substitution and Analysis: Text Functions.): + + files = foo.elc bar.o lose.o + + $(filter %.o,$(files)): %.o: %.c + $(CC) -c $(CFLAGS) $< -o $@ + $(filter %.elc,$(files)): %.elc: %.el + emacs -f batch-byte-compile $< + +In this example the result of '$(filter %.o,$(files))' is 'bar.o +lose.o', and the first static pattern rule causes each of these object +files to be updated by compiling the corresponding C source file. The +result of '$(filter %.elc,$(files))' is 'foo.elc', so that file is made +from 'foo.el'. + + Another example shows how to use '$*' in static pattern rules: + + bigoutput littleoutput : %output : text.g + generate text.g -$* > $@ + +When the 'generate' command is run, '$*' will expand to the stem, either +'big' or 'little'. + + +File: make.info, Node: Static versus Implicit, Prev: Static Usage, Up: Static Pattern + +4.12.2 Static Pattern Rules versus Implicit Rules +------------------------------------------------- + +A static pattern rule has much in common with an implicit rule defined +as a pattern rule (*note Defining and Redefining Pattern Rules: Pattern +Rules.). Both have a pattern for the target and patterns for +constructing the names of prerequisites. The difference is in how +'make' decides _when_ the rule applies. + + An implicit rule _can_ apply to any target that matches its pattern, +but it _does_ apply only when the target has no recipe otherwise +specified, and only when the prerequisites can be found. If more than +one implicit rule appears applicable, only one applies; the choice +depends on the order of rules. + + By contrast, a static pattern rule applies to the precise list of +targets that you specify in the rule. It cannot apply to any other +target and it invariably does apply to each of the targets specified. +If two conflicting rules apply, and both have recipes, that's an error. + + The static pattern rule can be better than an implicit rule for these +reasons: + + * You may wish to override the usual implicit rule for a few files + whose names cannot be categorized syntactically but can be given in + an explicit list. + + * If you cannot be sure of the precise contents of the directories + you are using, you may not be sure which other irrelevant files + might lead 'make' to use the wrong implicit rule. The choice might + depend on the order in which the implicit rule search is done. + With static pattern rules, there is no uncertainty: each rule + applies to precisely the targets specified. + + +File: make.info, Node: Double-Colon, Next: Automatic Prerequisites, Prev: Static Pattern, Up: Rules + +4.13 Double-Colon Rules +======================= + +"Double-colon" rules are explicit rules written with '::' instead of ':' +after the target names. They are handled differently from ordinary +rules when the same target appears in more than one rule. Pattern rules +with double-colons have an entirely different meaning (*note +Match-Anything Rules::). + + When a target appears in multiple rules, all the rules must be the +same type: all ordinary, or all double-colon. If they are double-colon, +each of them is independent of the others. Each double-colon rule's +recipe is executed if the target is older than any prerequisites of that +rule. If there are no prerequisites for that rule, its recipe is always +executed (even if the target already exists). This can result in +executing none, any, or all of the double-colon rules. + + Double-colon rules with the same target are in fact completely +separate from one another. Each double-colon rule is processed +individually, just as rules with different targets are processed. + + The double-colon rules for a target are executed in the order they +appear in the makefile. However, the cases where double-colon rules +really make sense are those where the order of executing the recipes +would not matter. + + Double-colon rules are somewhat obscure and not often very useful; +they provide a mechanism for cases in which the method used to update a +target differs depending on which prerequisite files caused the update, +and such cases are rare. + + Each double-colon rule should specify a recipe; if it does not, an +implicit rule will be used if one applies. *Note Using Implicit Rules: +Implicit Rules. + + +File: make.info, Node: Automatic Prerequisites, Prev: Double-Colon, Up: Rules + +4.14 Generating Prerequisites Automatically +=========================================== + +In the makefile for a program, many of the rules you need to write often +say only that some object file depends on some header file. For +example, if 'main.c' uses 'defs.h' via an '#include', you would write: + + main.o: defs.h + +You need this rule so that 'make' knows that it must remake 'main.o' +whenever 'defs.h' changes. You can see that for a large program you +would have to write dozens of such rules in your makefile. And, you +must always be very careful to update the makefile every time you add or +remove an '#include'. + + To avoid this hassle, most modern C compilers can write these rules +for you, by looking at the '#include' lines in the source files. +Usually this is done with the '-M' option to the compiler. For example, +the command: + + cc -M main.c + +generates the output: + + main.o : main.c defs.h + +Thus you no longer have to write all those rules yourself. The compiler +will do it for you. + + Note that such a rule constitutes mentioning 'main.o' in a makefile, +so it can never be considered an intermediate file by implicit rule +search. This means that 'make' won't ever remove the file after using +it; *note Chains of Implicit Rules: Chained Rules. + + With old 'make' programs, it was traditional practice to use this +compiler feature to generate prerequisites on demand with a command like +'make depend'. That command would create a file 'depend' containing all +the automatically-generated prerequisites; then the makefile could use +'include' to read them in (*note Include::). + + In GNU 'make', the feature of remaking makefiles makes this practice +obsolete--you need never tell 'make' explicitly to regenerate the +prerequisites, because it always regenerates any makefile that is out of +date. *Note Remaking Makefiles::. + + The practice we recommend for automatic prerequisite generation is to +have one makefile corresponding to each source file. For each source +file 'NAME.c' there is a makefile 'NAME.d' which lists what files the +object file 'NAME.o' depends on. That way only the source files that +have changed need to be rescanned to produce the new prerequisites. + + Here is the pattern rule to generate a file of prerequisites (i.e., a +makefile) called 'NAME.d' from a C source file called 'NAME.c': + + %.d: %.c + @set -e; rm -f $@; \ + $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + +*Note Pattern Rules::, for information on defining pattern rules. The +'-e' flag to the shell causes it to exit immediately if the '$(CC)' +command (or any other command) fails (exits with a nonzero status). + + With the GNU C compiler, you may wish to use the '-MM' flag instead +of '-M'. This omits prerequisites on system header files. *Note +Options Controlling the Preprocessor: (gcc)Preprocessor Options, for +details. + + The purpose of the 'sed' command is to translate (for example): + + main.o : main.c defs.h + +into: + + main.o main.d : main.c defs.h + +This makes each '.d' file depend on all the source and header files that +the corresponding '.o' file depends on. 'make' then knows it must +regenerate the prerequisites whenever any of the source or header files +changes. + + Once you've defined the rule to remake the '.d' files, you then use +the 'include' directive to read them all in. *Note Include::. For +example: + + sources = foo.c bar.c + + include $(sources:.c=.d) + +(This example uses a substitution variable reference to translate the +list of source files 'foo.c bar.c' into a list of prerequisite +makefiles, 'foo.d bar.d'. *Note Substitution Refs::, for full +information on substitution references.) Since the '.d' files are +makefiles like any others, 'make' will remake them as necessary with no +further work from you. *Note Remaking Makefiles::. + + Note that the '.d' files contain target definitions; you should be +sure to place the 'include' directive _after_ the first, default goal in +your makefiles or run the risk of having a random object file become the +default goal. *Note How Make Works::. + + +File: make.info, Node: Recipes, Next: Using Variables, Prev: Rules, Up: Top + +5 Writing Recipes in Rules +************************** + +The recipe of a rule consists of one or more shell command lines to be +executed, one at a time, in the order they appear. Typically, the +result of executing these commands is that the target of the rule is +brought up to date. + + Users use many different shell programs, but recipes in makefiles are +always interpreted by '/bin/sh' unless the makefile specifies otherwise. +*Note Recipe Execution: Execution. + +* Menu: + +* Recipe Syntax:: Recipe syntax features and pitfalls. +* Echoing:: How to control when recipes are echoed. +* Execution:: How recipes are executed. +* Parallel:: How recipes can be executed in parallel. +* Errors:: What happens after a recipe execution error. +* Interrupts:: What happens when a recipe is interrupted. +* Recursion:: Invoking 'make' from makefiles. +* Canned Recipes:: Defining canned recipes. +* Empty Recipes:: Defining useful, do-nothing recipes. + + +File: make.info, Node: Recipe Syntax, Next: Echoing, Prev: Recipes, Up: Recipes + +5.1 Recipe Syntax +================= + +Makefiles have the unusual property that there are really two distinct +syntaxes in one file. Most of the makefile uses 'make' syntax (*note +Writing Makefiles: Makefiles.). However, recipes are meant to be +interpreted by the shell and so they are written using shell syntax. +The 'make' program does not try to understand shell syntax: it performs +only a very few specific translations on the content of the recipe +before handing it to the shell. + + Each line in the recipe must start with a tab (or the first character +in the value of the '.RECIPEPREFIX' variable; *note Special +Variables::), except that the first recipe line may be attached to the +target-and-prerequisites line with a semicolon in between. _Any_ line +in the makefile that begins with a tab and appears in a "rule context" +(that is, after a rule has been started until another rule or variable +definition) will be considered part of a recipe for that rule. Blank +lines and lines of just comments may appear among the recipe lines; they +are ignored. + + Some consequences of these rules include: + + * A blank line that begins with a tab is not blank: it's an empty + recipe (*note Empty Recipes::). + + * A comment in a recipe is not a 'make' comment; it will be passed to + the shell as-is. Whether the shell treats it as a comment or not + depends on your shell. + + * A variable definition in a "rule context" which is indented by a + tab as the first character on the line, will be considered part of + a recipe, not a 'make' variable definition, and passed to the + shell. + + * A conditional expression ('ifdef', 'ifeq', etc. *note Syntax of + Conditionals: Conditional Syntax.) in a "rule context" which is + indented by a tab as the first character on the line, will be + considered part of a recipe and be passed to the shell. + +* Menu: + +* Splitting Recipe Lines:: Breaking long recipe lines for readability. +* Variables in Recipes:: Using 'make' variables in recipes. + + +File: make.info, Node: Splitting Recipe Lines, Next: Variables in Recipes, Prev: Recipe Syntax, Up: Recipe Syntax + +5.1.1 Splitting Recipe Lines +---------------------------- + +One of the few ways in which 'make' does interpret recipes is checking +for a backslash just before the newline. As in normal makefile syntax, +a single logical recipe line can be split into multiple physical lines +in the makefile by placing a backslash before each newline. A sequence +of lines like this is considered a single recipe line, and one instance +of the shell will be invoked to run it. + + However, in contrast to how they are treated in other places in a +makefile (*note Splitting Long Lines: Splitting Lines.), +backslash/newline pairs are _not_ removed from the recipe. Both the +backslash and the newline characters are preserved and passed to the +shell. How the backslash/newline is interpreted depends on your shell. +If the first character of the next line after the backslash/newline is +the recipe prefix character (a tab by default; *note Special +Variables::), then that character (and only that character) is removed. +Whitespace is never added to the recipe. + + For example, the recipe for the all target in this makefile: + + all : + @echo no\ + space + @echo no\ + space + @echo one \ + space + @echo one\ + space + +consists of four separate shell commands where the output is: + + nospace + nospace + one space + one space + + As a more complex example, this makefile: + + all : ; @echo 'hello \ + world' ; echo "hello \ + world" + +will invoke one shell with a command of: + + echo 'hello \ + world' ; echo "hello \ + world" + +which, according to shell quoting rules, will yield the following +output: + + hello \ + world + hello world + +Notice how the backslash/newline pair was removed inside the string +quoted with double quotes ('"..."'), but not from the string quoted with +single quotes (''...''). This is the way the default shell ('/bin/sh') +handles backslash/newline pairs. If you specify a different shell in +your makefiles it may treat them differently. + + Sometimes you want to split a long line inside of single quotes, but +you don't want the backslash/newline to appear in the quoted content. +This is often the case when passing scripts to languages such as Perl, +where extraneous backslashes inside the script can change its meaning or +even be a syntax error. One simple way of handling this is to place the +quoted string, or even the entire command, into a 'make' variable then +use the variable in the recipe. In this situation the newline quoting +rules for makefiles will be used, and the backslash/newline will be +removed. If we rewrite our example above using this method: + + HELLO = 'hello \ + world' + + all : ; @echo $(HELLO) + +we will get output like this: + + hello world + + If you like, you can also use target-specific variables (*note +Target-specific Variable Values: Target-specific.) to obtain a tighter +correspondence between the variable and the recipe that uses it. + + +File: make.info, Node: Variables in Recipes, Prev: Splitting Recipe Lines, Up: Recipe Syntax + +5.1.2 Using Variables in Recipes +-------------------------------- + +The other way in which 'make' processes recipes is by expanding any +variable references in them (*note Basics of Variable References: +Reference.). This occurs after make has finished reading all the +makefiles and the target is determined to be out of date; so, the +recipes for targets which are not rebuilt are never expanded. + + Variable and function references in recipes have identical syntax and +semantics to references elsewhere in the makefile. They also have the +same quoting rules: if you want a dollar sign to appear in your recipe, +you must double it ('$$'). For shells like the default shell, that use +dollar signs to introduce variables, it's important to keep clear in +your mind whether the variable you want to reference is a 'make' +variable (use a single dollar sign) or a shell variable (use two dollar +signs). For example: + + LIST = one two three + all: + for i in $(LIST); do \ + echo $$i; \ + done + +results in the following command being passed to the shell: + + for i in one two three; do \ + echo $i; \ + done + +which generates the expected result: + + one + two + three + + +File: make.info, Node: Echoing, Next: Execution, Prev: Recipe Syntax, Up: Recipes + +5.2 Recipe Echoing +================== + +Normally 'make' prints each line of the recipe before it is executed. +We call this "echoing" because it gives the appearance that you are +typing the lines yourself. + + When a line starts with '@', the echoing of that line is suppressed. +The '@' is discarded before the line is passed to the shell. Typically +you would use this for a command whose only effect is to print +something, such as an 'echo' command to indicate progress through the +makefile: + + @echo About to make distribution files + + When 'make' is given the flag '-n' or '--just-print' it only echoes +most recipes, without executing them. *Note Summary of Options: Options +Summary. In this case even the recipe lines starting with '@' are +printed. This flag is useful for finding out which recipes 'make' +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.). + + +File: make.info, Node: Execution, Next: Parallel, Prev: Echoing, Up: Recipes + +5.3 Recipe Execution +==================== + +When it is time to execute recipes to update a target, they are executed +by invoking a new sub-shell for each line of the recipe, unless the +'.ONESHELL' special target is in effect (*note Using One Shell: One +Shell.) (In practice, 'make' may take shortcuts that do not affect the +results.) + + *Please note:* this implies that setting shell variables and invoking +shell commands such as 'cd' that set a context local to each process +will not affect the following lines in the recipe.(1) If you want to +use 'cd' to affect the next statement, put both statements in a single +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 $( ../$@ + +Here we use the shell AND operator ('&&') so that if the 'cd' command +fails, the script will fail without trying to invoke the 'gobble' +command in the wrong directory, which could cause problems (in this case +it would certainly cause '../foo' to be truncated, at least). + +* Menu: + +* One Shell:: One shell for all lines in a recipe. +* Choosing the Shell:: How 'make' chooses the shell used + to run recipes. + + ---------- Footnotes ---------- + + (1) On MS-DOS, the value of current working directory is *global*, so +changing it _will_ affect the following recipe lines on those systems. + + +File: make.info, Node: One Shell, Next: Choosing the Shell, Prev: Execution, Up: Execution + +5.3.1 Using One Shell +--------------------- + +Sometimes you would prefer that all the lines in the recipe be passed to +a single invocation of the shell. There are generally two situations +where this is useful: first, it can improve performance in makefiles +where recipes consist of many command lines, by avoiding extra +processes. Second, you might want newlines to be included in your +recipe command (for example perhaps you are using a very different +interpreter as your 'SHELL'). If the '.ONESHELL' special target appears +anywhere in the makefile then _all_ recipe lines for each target will be +provided to a single invocation of the shell. Newlines between recipe +lines will be preserved. For example: + + .ONESHELL: + foo : bar/lose + cd $(@D) + gobble $(@F) > ../$@ + +would now work as expected even though the commands are on different +recipe lines. + + If '.ONESHELL' is provided, then only the first line of the recipe +will be checked for the special prefix characters ('@', '-', and '+'). +Subsequent lines will include the special characters in the recipe line +when the 'SHELL' is invoked. If you want your recipe to start with one +of these special characters you'll need to arrange for them to not be +the first characters on the first line, perhaps by adding a comment or +similar. For example, this would be a syntax error in Perl because the +first '@' is removed by make: + + .ONESHELL: + SHELL = /usr/bin/perl + .SHELLFLAGS = -e + show : + @f = qw(a b c); + print "@f\n"; + +However, either of these alternatives would work properly: + + .ONESHELL: + SHELL = /usr/bin/perl + .SHELLFLAGS = -e + show : + # Make sure "@" is not the first character on the first line + @f = qw(a b c); + print "@f\n"; + +or + + .ONESHELL: + SHELL = /usr/bin/perl + .SHELLFLAGS = -e + show : + my @f = qw(a b c); + 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 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 +characters are not legal at the beginning of a line in a POSIX shell +script this is not a loss in functionality. For example, this works as +expected: + + .ONESHELL: + foo : bar/lose + @cd $(@D) + @gobble $(@F) > ../$@ + + Even with this special feature, however, makefiles with '.ONESHELL' +will behave differently in ways that could be noticeable. For example, +normally if any line in the recipe fails, that causes the rule to fail +and no more recipe lines are processed. Under '.ONESHELL' a failure of +any but the final recipe line will not be noticed by 'make'. You can +modify '.SHELLFLAGS' to add the '-e' option to the shell which will +cause any failure anywhere in the command line to cause the shell to +fail, but this could itself cause your recipe to behave differently. +Ultimately you may need to harden your recipe lines to allow them to +work with '.ONESHELL'. + + +File: make.info, Node: Choosing the Shell, Prev: One Shell, Up: Execution + +5.3.2 Choosing the Shell +------------------------ + +The program used as the shell is taken from the variable 'SHELL'. If +this variable is not set in your makefile, the program '/bin/sh' is used +as the shell. The argument(s) passed to the shell are taken from the +variable '.SHELLFLAGS'. The default value of '.SHELLFLAGS' is '-c' +normally, or '-ec' in POSIX-conforming mode. + + Unlike most variables, the variable 'SHELL' is never set from the +environment. This is because the 'SHELL' environment variable is used +to specify your personal choice of shell program for interactive use. +It would be very bad for personal choices like this to affect the +functioning of makefiles. *Note Variables from the Environment: +Environment. + + Furthermore, when you do set 'SHELL' in your makefile that value is +_not_ exported in the environment to recipe lines that 'make' invokes. +Instead, the value inherited from the user's environment, if any, is +exported. You can override this behavior by explicitly exporting +'SHELL' (*note Communicating Variables to a Sub-'make': +Variables/Recursion.), forcing it to be passed in the environment to +recipe lines. + + However, on MS-DOS and MS-Windows the value of 'SHELL' in the +environment *is* used, since on those systems most users do not set this +variable, and therefore it is most likely set specifically to be used by +'make'. On MS-DOS, if the setting of 'SHELL' is not suitable for +'make', you can set the variable 'MAKESHELL' to the shell that 'make' +should use; if set it will be used as the shell instead of the value of +'SHELL'. + +Choosing a Shell in DOS and Windows +................................... + +Choosing a shell in MS-DOS and MS-Windows is much more complex than on +other systems. + + On MS-DOS, if 'SHELL' is not set, the value of the variable 'COMSPEC' +(which is always set) is used instead. + + The processing of lines that set the variable 'SHELL' in Makefiles is +different on MS-DOS. The stock shell, 'command.com', is ridiculously +limited in its functionality and many users of 'make' tend to install a +replacement shell. Therefore, on MS-DOS, 'make' examines the value of +'SHELL', and changes its behavior based on whether it points to a +Unix-style or DOS-style shell. This allows reasonable functionality +even if 'SHELL' points to 'command.com'. + + If 'SHELL' points to a Unix-style shell, 'make' on MS-DOS +additionally checks whether that shell can indeed be found; if not, it +ignores the line that sets 'SHELL'. In MS-DOS, GNU 'make' searches for +the shell in the following places: + + 1. In the precise place pointed to by the value of 'SHELL'. For + example, if the makefile specifies 'SHELL = /bin/sh', 'make' will + look in the directory '/bin' on the current drive. + + 2. In the current directory. + + 3. In each of the directories in the 'PATH' variable, in order. + + In every directory it examines, 'make' will first look for the +specific file ('sh' in the example above). If this is not found, it +will also look in that directory for that file with one of the known +extensions which identify executable files. For example '.exe', '.com', +'.bat', '.btm', '.sh', and some others. + + If any of these attempts is successful, the value of 'SHELL' will be +set to the full pathname of the shell as found. However, if none of +these is found, the value of 'SHELL' will not be changed, and thus the +line that sets it will be effectively ignored. This is so 'make' will +only support features specific to a Unix-style shell if such a shell is +actually installed on the system where 'make' runs. + + Note that this extended search for the shell is limited to the cases +where 'SHELL' is set from the Makefile; if it is set in the environment +or command line, you are expected to set it to the full pathname of the +shell, exactly as things are on Unix. + + The effect of the above DOS-specific processing is that a Makefile +that contains 'SHELL = /bin/sh' (as many Unix makefiles do), will work +on MS-DOS unaltered if you have e.g. 'sh.exe' installed in some +directory along your 'PATH'. + + +File: make.info, Node: Parallel, Next: Errors, Prev: Execution, Up: Recipes + +5.4 Parallel Execution +====================== + +GNU 'make' knows how to execute several recipes at once. Normally, +'make' will execute only one recipe at a time, waiting for it to finish +before executing the next. However, the '-j' or '--jobs' option tells +'make' to execute many recipes simultaneously. You can inhibit +parallelism in a particular makefile with the '.NOTPARALLEL' +pseudo-target (*note Special Built-in Target Names: Special Targets.). + + On MS-DOS, the '-j' option has no effect, since that system doesn't +support multi-processing. + + 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). + + Handling recursive 'make' invocations raises issues for parallel +execution. For more information on this, see *note Communicating +Options to a Sub-'make': Options/Recursion. + + If a recipe fails (is killed by a signal or exits with a nonzero +status), and errors are not ignored for that recipe (*note Errors in +Recipes: Errors.), the remaining recipe lines to remake the same target +will not be run. If a recipe fails and the '-k' or '--keep-going' +option was not given (*note Summary of Options: Options Summary.), +'make' aborts execution. If make terminates for any reason (including a +signal) with child processes running, it waits for them to finish before +actually exiting. + + When the system is heavily loaded, you will probably want to run +fewer jobs than when it is lightly loaded. You can use the '-l' option +to tell 'make' to limit the number of jobs to run at once, based on the +load average. The '-l' or '--max-load' option is followed by a +floating-point number. For example, + + -l 2.5 + +will not let 'make' start more than one job if the load average is above +2.5. The '-l' option with no following number removes the load limit, +if one was given with a previous '-l' option. + + More precisely, when 'make' goes to start up a job, and it already +has at least one job running, it checks the current load average; if it +is not lower than the limit given with '-l', 'make' waits until the load +average goes below that limit, or until all the other jobs finish. + + By default, there is no load limit. + +* Menu: + +* Parallel Output:: Handling output during parallel execution +* Parallel Input:: Handling input during parallel execution + + +File: make.info, Node: Parallel Output, Next: Parallel Input, Prev: Parallel, Up: Parallel + +5.4.1 Output During Parallel Execution +-------------------------------------- + +When running several recipes in parallel the output from each recipe +appears as soon as it is generated, with the result that messages from +different recipes may be interspersed, sometimes even appearing on the +same line. This can make reading the output very difficult. + + To avoid this you can use the '--output-sync' ('-O') option. This +option instructs 'make' to save the output from the commands it invokes +and print it all once the commands are completed. Additionally, if +there are multiple recursive 'make' invocations running in parallel, +they will communicate so that only one of them is generating output at a +time. + + If working directory printing is enabled (*note The +'--print-directory' Option: -w Option.), the enter/leave messages are +printed around each output grouping. If you prefer not to see these +messages add the '--no-print-directory' option to 'MAKEFLAGS'. + + There are four levels of granularity when synchronizing output, +specified by giving an argument to the option (e.g., '-Oline' or +'--output-sync=recurse'). + +'none' + This is the default: all output is sent directly as it is generated + and no synchronization is performed. + +'line' + Output from each individual line of the recipe is grouped and + printed as soon as that line is complete. If a recipe consists of + multiple lines, they may be interspersed with lines from other + recipes. + +'target' + Output from the entire recipe for each target is grouped and + printed once the target is complete. This is the default if the + '--output-sync' or '-O' option is given with no argument. + +'recurse' + Output from each recursive invocation of 'make' is grouped and + printed once the recursive invocation is complete. + + Regardless of the mode chosen, the total build time will be the same. +The only difference is in how the output appears. + + The 'target' and 'recurse' modes both collect the output of the +entire recipe of a target and display it uninterrupted when the recipe +completes. The difference between them is in how recipes that contain +recursive invocations of 'make' are treated (*note Recursive Use of +'make': Recursion.). For all recipes which have no recursive lines, the +'target' and 'recurse' modes behave identically. + + If the 'recurse' mode is chosen, recipes that contain recursive +'make' invocations are treated the same as other targets: the output +from the recipe, including the output from the recursive 'make', is +saved and printed after the entire recipe is complete. This ensures +output from all the targets built by a given recursive 'make' instance +are grouped together, which may make the output easier to understand. +However it also leads to long periods of time during the build where no +output is seen, followed by large bursts of output. If you are not +watching the build as it proceeds, but instead viewing a log of the +build after the fact, this may be the best option for you. + + If you are watching the output, the long gaps of quiet during the +build can be frustrating. The 'target' output synchronization mode +detects when 'make' is going to be invoked recursively, using the +standard methods, and it will not synchronize the output of those lines. +The recursive 'make' will perform the synchronization for its targets +and the output from each will be displayed immediately when it +completes. Be aware that output from recursive lines of the recipe are +not synchronized (for example if the recursive line prints a message +before running 'make', that message will not be synchronized). + + The 'line' mode can be useful for front-ends that are watching the +output of 'make' to track when recipes are started and completed. + + Some programs invoked by 'make' may behave differently if they +determine they're writing output to a terminal versus a file (often +described as "interactive" vs. "non-interactive" modes). For example, +many programs that can display colorized output will not do so if they +determine they are not writing to a terminal. If your makefile invokes +a program like this then using the output synchronization options will +cause the program to believe it's running in "non-interactive" mode even +though the output will ultimately go to the terminal. + + +File: make.info, Node: Parallel Input, Prev: Parallel Output, Up: Parallel + +5.4.2 Input During Parallel Execution +------------------------------------- + +Two processes cannot both take input from the same device at the same +time. To make sure that only one recipe tries to take input from the +terminal at once, 'make' will invalidate the standard input streams of +all but one running recipe. If another recipe attempts to read from +standard input it will usually incur a fatal error (a 'Broken pipe' +signal). + + It is unpredictable which recipe will have a valid standard input +stream (which will come from the terminal, or wherever you redirect the +standard input of 'make'). The first recipe run will always get it +first, and the first recipe started after that one finishes will get it +next, and so on. + + We will change how this aspect of 'make' works if we find a better +alternative. In the mean time, you should not rely on any recipe using +standard input at all if you are using the parallel execution feature; +but if you are not using this feature, then standard input works +normally in all recipes. + + +File: make.info, Node: Errors, Next: Interrupts, Prev: Parallel, Up: Recipes + +5.5 Errors in Recipes +===================== + +After each shell invocation returns, 'make' looks at its exit status. +If the shell completed successfully (the exit status is zero), the next +line in the recipe is executed in a new shell; after the last line is +finished, the rule is finished. + + If there is an error (the exit status is nonzero), 'make' gives up on +the current rule, and perhaps on all rules. + + Sometimes the failure of a certain recipe line does not indicate a +problem. For example, you may use the 'mkdir' command to ensure that a +directory exists. If the directory already exists, 'mkdir' will report +an error, but you probably want 'make' to continue regardless. + + To ignore errors in a recipe line, write a '-' at the beginning of +the line's text (after the initial tab). The '-' is discarded before +the line is passed to the shell for execution. + + For example, + + clean: + -rm -f *.o + +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. 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 +prints out a message that tells you the status code the shell exited +with, and says that the error has been ignored. + + When an error happens that 'make' has not been told to ignore, it +implies that the current target cannot be correctly remade, and neither +can any other that depends on it either directly or indirectly. No +further recipes will be executed for these targets, since their +preconditions have not been achieved. + + Normally 'make' gives up immediately in this circumstance, returning +a nonzero status. However, if the '-k' or '--keep-going' flag is +specified, 'make' continues 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. *Note +Summary of Options: Options Summary. + + The usual behavior assumes that your purpose is to get the specified +targets up to date; once 'make' learns that this is impossible, it might +as well report the failure immediately. The '-k' option says that the +real purpose is to test as many of the changes made in the program as +possible, perhaps to find several independent problems so that you can +correct them all before the next attempt to compile. This is why Emacs' +'compile' command passes the '-k' flag by default. + + Usually when a recipe line fails, if it has changed the target file +at all, the file is corrupted and cannot be used--or at least it is not +completely updated. Yet the file's time stamp says that it is now up to +date, so the next time 'make' runs, it will not try to update that file. +The situation is just the same as when the shell is killed by a signal; +*note Interrupts::. So generally the right thing to do is to delete the +target file if the recipe fails after beginning to change the file. +'make' will do this if '.DELETE_ON_ERROR' appears as a target. This is +almost always what you want 'make' to do, but it is not historical +practice; so for compatibility, you must explicitly request it. + + +File: make.info, Node: Interrupts, Next: Recursion, Prev: Errors, Up: Recipes + +5.6 Interrupting or Killing 'make' +================================== + +If 'make' gets a fatal signal while a shell is executing, it may delete +the target file that the recipe was supposed to update. This is done if +the target file's last-modification time has changed since 'make' first +checked it. + + The purpose of deleting the target is to make sure that it is remade +from scratch when 'make' is next run. Why is this? Suppose you type +'Ctrl-c' while a compiler is running, and it has begun to write an +object file 'foo.o'. The 'Ctrl-c' kills the compiler, resulting in an +incomplete file whose last-modification time is newer than the source +file 'foo.c'. But 'make' also receives the 'Ctrl-c' signal and deletes +this incomplete file. If 'make' did not do this, the next invocation of +'make' would think that 'foo.o' did not require updating--resulting in a +strange error message from the linker when it tries to link an object +file half of which is missing. + + You can prevent the deletion of a target file in this way by making +the special target '.PRECIOUS' depend on it. Before remaking a target, +'make' checks to see whether it appears on the prerequisites of +'.PRECIOUS', and thereby decides whether the target should be deleted if +a signal happens. Some reasons why you might do this are that the +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. + + +File: make.info, Node: Recursion, Next: Canned Recipes, Prev: Interrupts, Up: Recipes + +5.7 Recursive Use of 'make' +=========================== + +Recursive use of 'make' means using 'make' as a command in a makefile. +This technique is useful when you want separate makefiles for various +subsystems that compose a larger system. For example, suppose you have +a sub-directory 'subdir' which has its own makefile, and you would like +the containing directory's makefile to run 'make' on the sub-directory. +You can do it by writing this: + + subsystem: + cd subdir && $(MAKE) + +or, equivalently, this (*note Summary of Options: Options Summary.): + + subsystem: + $(MAKE) -C subdir + + You can write recursive 'make' commands just by copying this example, +but there are many things to know about how they work and why, and about +how the sub-'make' relates to the top-level 'make'. You may also find +it useful to declare targets that invoke recursive 'make' commands as +'.PHONY' (for more discussion on when this is useful, see *note Phony +Targets::). + + For your convenience, when GNU 'make' starts (after it has processed +any '-C' options) it sets the variable 'CURDIR' to the pathname of the +current working directory. This value is never touched by 'make' again: +in particular note that if you include files from other directories the +value of 'CURDIR' does not change. The value has the same precedence it +would have if it were set in the makefile (by default, an environment +variable 'CURDIR' will not override this value). Note that setting this +variable has no impact on the operation of 'make' (it does not cause +'make' to change its working directory, for example). + +* Menu: + +* MAKE Variable:: The special effects of using '$(MAKE)'. +* Variables/Recursion:: How to communicate variables to a sub-'make'. +* Options/Recursion:: How to communicate options to a sub-'make'. +* -w Option:: How the '-w' or '--print-directory' option + helps debug use of recursive 'make' commands. + + +File: make.info, Node: MAKE Variable, Next: Variables/Recursion, Prev: Recursion, Up: Recursion + +5.7.1 How the 'MAKE' Variable Works +----------------------------------- + +Recursive 'make' commands should always use the variable 'MAKE', not the +explicit command name 'make', as shown here: + + subsystem: + cd subdir && $(MAKE) + + The value of this variable is the file name with which 'make' was +invoked. If this file name was '/bin/make', then the recipe executed is +'cd subdir && /bin/make'. If you use a special version of 'make' to run +the top-level makefile, the same special version will be executed for +recursive invocations. + + As a special feature, using the variable 'MAKE' in the recipe of a +rule alters the effects of the '-t' ('--touch'), '-n' ('--just-print'), +or '-q' ('--question') option. Using the 'MAKE' variable has the same +effect as using a '+' character at the beginning of the recipe line. +*Note Instead of Executing the Recipes: Instead of Execution. This +special feature is only enabled if the 'MAKE' variable appears directly +in the recipe: it does not apply if the 'MAKE' variable is referenced +through expansion of another variable. In the latter case you must use +the '+' token to get these special effects. + + Consider the command 'make -t' in the above example. (The '-t' +option marks targets as up to date without actually running any recipes; +see *note Instead of Execution::.) Following the usual definition of +'-t', a 'make -t' command in the example would create a file named +'subsystem' and do nothing else. What you really want it to do is run +'cd subdir && make -t'; but that would require executing the recipe, and +'-t' says not to execute recipes. + + The special feature makes this do what you want: whenever a recipe +line of a rule contains the variable 'MAKE', the flags '-t', '-n' and +'-q' do not apply to that line. Recipe lines containing 'MAKE' are +executed normally despite the presence of a flag that causes most +recipes not to be run. The usual 'MAKEFLAGS' mechanism passes the flags +to the sub-'make' (*note Communicating Options to a Sub-'make': +Options/Recursion.), so your request to touch the files, or print the +recipes, is propagated to the subsystem. + + +File: make.info, Node: Variables/Recursion, Next: Options/Recursion, Prev: MAKE Variable, Up: Recursion + +5.7.2 Communicating Variables to a Sub-'make' +--------------------------------------------- + +Variable values of the top-level 'make' can be passed to the sub-'make' +through the environment by explicit request. These variables are +defined in the sub-'make' as defaults, but they do not override +variables defined in the makefile used by the sub-'make' unless you use +the '-e' switch (*note Summary of Options: Options Summary.). + + To pass down, or "export", a variable, 'make' adds the variable and +its value to the environment for running each line of the recipe. The +sub-'make', in turn, uses the environment to initialize its table of +variable values. *Note Variables from the Environment: Environment. + + Except by explicit request, 'make' exports a variable only if it is +either defined in the environment initially or set on the command line, +and if its name consists only of letters, numbers, and underscores. +Some shells cannot cope with environment variable names consisting of +characters other than letters, numbers, and underscores. + + The value of the 'make' variable 'SHELL' is not exported. Instead, +the value of the 'SHELL' variable from the invoking environment is +passed to the sub-'make'. You can force 'make' to export its value for +'SHELL' by using the 'export' directive, described below. *Note +Choosing the Shell::. + + The special variable 'MAKEFLAGS' is always exported (unless you +unexport it). 'MAKEFILES' is exported if you set it to anything. + + 'make' automatically passes down variable values that were defined on +the command line, by putting them in the 'MAKEFLAGS' variable. *Note +Options/Recursion::. + + Variables are _not_ normally passed down if they were created by +default by 'make' (*note Variables Used by Implicit Rules: Implicit +Variables.). The sub-'make' will define these for itself. + + If you want to export specific variables to a sub-'make', use the +'export' directive, like this: + + export VARIABLE ... + +If you want to _prevent_ a variable from being exported, use the +'unexport' directive, like this: + + unexport VARIABLE ... + +In both of these forms, the arguments to 'export' and 'unexport' are +expanded, and so could be variables or functions which expand to a (list +of) variable names to be (un)exported. + + As a convenience, you can define a variable and export it at the same +time by doing: + + export VARIABLE = value + +has the same result as: + + VARIABLE = value + export VARIABLE + +and + + export VARIABLE := value + +has the same result as: + + VARIABLE := value + export VARIABLE + + Likewise, + + export VARIABLE += value + +is just like: + + VARIABLE += value + export VARIABLE + +*Note Appending More Text to Variables: Appending. + + You may notice that the 'export' and 'unexport' directives work in +'make' in the same way they work in the shell, 'sh'. + + If you want all variables to be exported by default, you can use +'export' by itself: + + export + +This tells 'make' that variables which are not explicitly mentioned in +an 'export' or 'unexport' directive should be exported. Any variable +given in an 'unexport' directive will still _not_ be exported. If you +use 'export' by itself to export variables by default, variables whose +names contain characters other than alphanumerics and underscores will +not be exported unless specifically mentioned in an 'export' directive. + + The behavior elicited by an 'export' directive by itself was the +default in older versions of GNU 'make'. If your makefiles depend on +this behavior and you want to be compatible with old versions of 'make', +you can write a rule for the special target '.EXPORT_ALL_VARIABLES' +instead of using the 'export' directive. This will be ignored by old +'make's, while the 'export' directive will cause a syntax error. + + Likewise, you can use 'unexport' by itself to tell 'make' _not_ to +export variables by default. Since this is the default behavior, you +would only need to do this if 'export' had been used by itself earlier +(in an included makefile, perhaps). You *cannot* use 'export' and +'unexport' by themselves to have variables exported for some recipes and +not for others. The last 'export' or 'unexport' directive that appears +by itself determines the behavior for the entire run of 'make'. + + As a special feature, the variable 'MAKELEVEL' is changed when it is +passed down from level to level. This variable's value is a string +which is the depth of the level as a decimal number. The value is '0' +for the top-level 'make'; '1' for a sub-'make', '2' for a +sub-sub-'make', and so on. The incrementation happens when 'make' sets +up the environment for a recipe. + + The main use of 'MAKELEVEL' is to test it in a conditional directive +(*note Conditional Parts of Makefiles: Conditionals.); this way you can +write a makefile that behaves one way if run recursively and another way +if run directly by you. + + You can use the variable 'MAKEFILES' to cause all sub-'make' commands +to use additional makefiles. The value of 'MAKEFILES' is a +whitespace-separated list of file names. This variable, if defined in +the outer-level makefile, is passed down through the environment; then +it serves as a list of extra makefiles for the sub-'make' to read before +the usual or specified ones. *Note The Variable 'MAKEFILES': MAKEFILES +Variable. + + +File: make.info, Node: Options/Recursion, Next: -w Option, Prev: Variables/Recursion, Up: Recursion + +5.7.3 Communicating Options to a Sub-'make' +------------------------------------------- + +Flags such as '-s' and '-k' are passed automatically to the sub-'make' +through the variable 'MAKEFLAGS'. This variable is set up automatically +by 'make' to contain the flag letters that 'make' received. Thus, if +you do 'make -ks' then 'MAKEFLAGS' gets the value 'ks'. + + As a consequence, every sub-'make' gets a value for 'MAKEFLAGS' in +its environment. In response, it takes the flags from that value and +processes them as if they had been given as arguments. *Note Summary of +Options: Options Summary. + + Likewise variables defined on the command line are passed to the +sub-'make' through 'MAKEFLAGS'. Words in the value of 'MAKEFLAGS' that +contain '=', 'make' treats as variable definitions just as if they +appeared on the command line. *Note Overriding Variables: Overriding. + + The options '-C', '-f', '-o', and '-W' are not put into 'MAKEFLAGS'; +these options are not passed down. + + The '-j' option is a special case (*note Parallel Execution: +Parallel.). If you set it to some numeric value 'N' and your operating +system supports it (most any UNIX system will; others typically won't), +the parent 'make' and all the sub-'make's will communicate to ensure +that there are only 'N' jobs running at the same time between them all. +Note that any job that is marked recursive (*note Instead of Executing +Recipes: Instead of Execution.) doesn't count against the total jobs +(otherwise we could get 'N' sub-'make's running and have no slots left +over for any real work!) + + If your operating system doesn't support the above communication, +then no '-j' is added to 'MAKEFLAGS', so that sub-'make's run in +non-parallel mode. If the '-j' option were passed down to sub-'make's +you would get many more jobs running in parallel than you asked for. If +you give '-j' with no numeric argument, meaning to run as many jobs as +possible in parallel, this is passed down, since multiple infinities are +no more than one. + + If you do not want to pass the other flags down, you must change the +value of 'MAKEFLAGS', like this: + + subsystem: + cd subdir && $(MAKE) MAKEFLAGS= + + The command line variable definitions really appear in the variable +'MAKEOVERRIDES', and 'MAKEFLAGS' contains a reference to this variable. +If you do want to pass flags down normally, but don't want to pass down +the command line variable definitions, you can reset 'MAKEOVERRIDES' to +empty, like this: + + MAKEOVERRIDES = + +This is not usually useful to do. However, some systems have a small +fixed limit on the size of the environment, and putting so much +information into the value of 'MAKEFLAGS' can exceed it. If you see the +error message 'Arg list too long', this may be the problem. (For strict +compliance with POSIX.2, changing 'MAKEOVERRIDES' does not affect +'MAKEFLAGS' if the special target '.POSIX' appears in the makefile. You +probably do not care about this.) + + A similar variable 'MFLAGS' exists also, for historical +compatibility. It has the same value as 'MAKEFLAGS' except that it does +not contain the command line variable definitions, and it always begins +with a hyphen unless it is empty ('MAKEFLAGS' begins with a hyphen only +when it begins with an option that has no single-letter version, such as +'--warn-undefined-variables'). 'MFLAGS' was traditionally used +explicitly in the recursive 'make' command, like this: + + subsystem: + cd subdir && $(MAKE) $(MFLAGS) + +but now 'MAKEFLAGS' makes this usage redundant. If you want your +makefiles to be compatible with old 'make' programs, use this technique; +it will work fine with more modern 'make' versions too. + + The 'MAKEFLAGS' variable can also be useful if you want to have +certain options, such as '-k' (*note Summary of Options: Options +Summary.), set each time you run 'make'. You simply put a value for +'MAKEFLAGS' in your environment. You can also set 'MAKEFLAGS' in a +makefile, to specify additional flags that should also be in effect for +that makefile. (Note that you cannot use 'MFLAGS' this way. That +variable is set only for compatibility; 'make' does not interpret a +value you set for it in any way.) + + When 'make' interprets the value of 'MAKEFLAGS' (either from the +environment or from a makefile), it first prepends a hyphen if the value +does not already begin with one. Then it chops the value into words +separated by blanks, and parses these words as if they were options +given on the command line (except that '-C', '-f', '-h', '-o', '-W', and +their long-named versions are ignored; and there is no error for an +invalid option). + + If you do put 'MAKEFLAGS' in your environment, you should be sure not +to include any options that will drastically affect the actions of +'make' and undermine the purpose of makefiles and of 'make' itself. For +instance, the '-t', '-n', and '-q' options, if put in one of these +variables, could have disastrous consequences and would certainly have +at least surprising and probably annoying effects. + + If you'd like to run other implementations of 'make' in addition to +GNU 'make', and hence do not want to add GNU 'make'-specific flags to +the 'MAKEFLAGS' variable, you can add them to the 'GNUMAKEFLAGS' +variable instead. This variable is parsed just before 'MAKEFLAGS', in +the same way as 'MAKEFLAGS'. When 'make' constructs 'MAKEFLAGS' to pass +to a recursive 'make' it will include all flags, even those taken from +'GNUMAKEFLAGS'. As a result, after parsing 'GNUMAKEFLAGS' GNU 'make' +sets this variable to the empty string to avoid duplicating flags during +recursion. + + It's best to use 'GNUMAKEFLAGS' only with flags which won't +materially change the behavior of your makefiles. If your makefiles +require GNU make anyway then simply use 'MAKEFLAGS'. Flags such as +'--no-print-directory' or '--output-sync' may be appropriate for +'GNUMAKEFLAGS'. + + +File: make.info, Node: -w Option, Prev: Options/Recursion, Up: Recursion + +5.7.4 The '--print-directory' Option +------------------------------------ + +If you use several levels of recursive 'make' invocations, the '-w' or +'--print-directory' option can make the output a lot easier to +understand by showing each directory as 'make' starts processing it and +as 'make' finishes processing it. For example, if 'make -w' is run in +the directory '/u/gnu/make', 'make' will print a line of the form: + + make: Entering directory `/u/gnu/make'. + +before doing anything else, and a line of the form: + + make: Leaving directory `/u/gnu/make'. + +when processing is completed. + + Normally, you do not need to specify this option because 'make' does +it for you: '-w' is turned on automatically when you use the '-C' +option, and in sub-'make's. 'make' will not automatically turn on '-w' +if you also use '-s', which says to be silent, or if you use +'--no-print-directory' to explicitly disable it. + + +File: make.info, Node: Canned Recipes, Next: Empty Recipes, Prev: Recursion, Up: Recipes + +5.8 Defining Canned Recipes +=========================== + +When the same sequence of commands is useful in making various targets, +you can define it as a canned sequence with the 'define' directive, and +refer to the canned sequence from the recipes for those targets. The +canned sequence is actually a variable, so the name must not conflict +with other variable names. + + Here is an example of defining a canned recipe: + + define run-yacc = + yacc $(firstword $^) + mv y.tab.c $@ + endef + +Here 'run-yacc' is the name of the variable being defined; 'endef' marks +the end of the definition; the lines in between are the commands. The +'define' directive does not expand variable references and function +calls in the canned sequence; the '$' characters, parentheses, variable +names, and so on, all become part of the value of the variable you are +defining. *Note Defining Multi-Line Variables: Multi-Line, for a +complete explanation of 'define'. + + The first command in this example runs Yacc on the first prerequisite +of whichever rule uses the canned sequence. The output file from Yacc +is always named 'y.tab.c'. The second command moves the output to the +rule's target file name. + + To use the canned sequence, substitute the variable into the recipe +of a rule. You can substitute it like any other variable (*note Basics +of Variable References: Reference.). Because variables defined by +'define' are recursively expanded variables, all the variable references +you wrote inside the 'define' are expanded now. For example: + + foo.c : foo.y + $(run-yacc) + +'foo.y' will be substituted for the variable '$^' when it occurs in +'run-yacc''s value, and 'foo.c' for '$@'. + + This is a realistic example, but this particular one is not needed in +practice because 'make' has an implicit rule to figure out these +commands based on the file names involved (*note Using Implicit Rules: +Implicit Rules.). + + In recipe execution, each line of a canned sequence is treated just +as if the line appeared on its own in the rule, preceded by a tab. In +particular, 'make' invokes a separate sub-shell for each line. You can +use the special prefix characters that affect command lines ('@', '-', +and '+') on each line of a canned sequence. *Note Writing Recipes in +Rules: Recipes. For example, using this canned sequence: + + define frobnicate = + @echo "frobnicating target $@" + frob-step-1 $< -o $@-step-1 + frob-step-2 $@-step-1 -o $@ + endef + +'make' will not echo the first line, the 'echo' command. But it _will_ +echo the following two recipe lines. + + On the other hand, prefix characters on the recipe line that refers +to a canned sequence apply to every line in the sequence. So the rule: + + frob.out: frob.in + @$(frobnicate) + +does not echo _any_ recipe lines. (*Note Recipe Echoing: Echoing, for a +full explanation of '@'.) + + +File: make.info, Node: Empty Recipes, Prev: Canned Recipes, Up: Recipes + +5.9 Using Empty Recipes +======================= + +It is sometimes useful to define recipes which do nothing. This is done +simply by giving a recipe that consists of nothing but whitespace. For +example: + + target: ; + +defines an empty recipe for 'target'. You could also use a line +beginning with a recipe prefix character to define an empty recipe, but +this would be confusing because such a line looks empty. + + You may be wondering why you would want to define a recipe that does +nothing. One reason this is useful is to prevent a target from getting +implicit recipes (from implicit rules or the '.DEFAULT' special target; +*note Implicit Rules:: and *note Defining Last-Resort Default Rules: +Last Resort.). + + Empty recipes can also be used to avoid errors for targets that will +be created as a side-effect of another recipe: if the target does not +exist the empty recipe ensures that 'make' won't complain that it +doesn't know how to build the target, and 'make' will assume the target +is out of date. + + You may be inclined to define empty recipes for targets that are not +actual files, but only exist so that their prerequisites can be remade. +However, this is not the best way to do that, because the prerequisites +may not be remade properly if the target file actually does exist. +*Note Phony Targets: Phony Targets, for a better way to do this. + + +File: make.info, Node: Using Variables, Next: Conditionals, Prev: Recipes, Up: Top + +6 How to Use Variables +********************** + +A "variable" is a name defined in a makefile to represent a string of +text, called the variable's "value". These values are substituted by +explicit request into targets, prerequisites, recipes, and other parts +of the makefile. (In some other versions of 'make', variables are +called "macros".) + + Variables and functions in all parts of a makefile are expanded when +read, except for in recipes, the right-hand sides of variable +definitions using '=', and the bodies of variable definitions using the +'define' directive. + + Variables can represent lists of file names, options to pass to +compilers, programs to run, directories to look in for source files, +directories to write output in, or anything else you can imagine. + + A variable name may be any sequence of characters not containing ':', +'#', '=', or whitespace. However, variable names containing characters +other than letters, numbers, and underscores should be considered +carefully, as in some shells they cannot be passed through the +environment to a sub-'make' (*note Communicating Variables to a +Sub-'make': Variables/Recursion.). Variable names beginning with '.' +and an uppercase letter may be given special meaning in future versions +of 'make'. + + Variable names are case-sensitive. The names 'foo', 'FOO', and 'Foo' +all refer to different variables. + + It is traditional to use upper case letters in variable names, but we +recommend using lower case letters for variable names that serve +internal purposes in the makefile, and reserving upper case for +parameters that control implicit rules or for parameters that the user +should override with command options (*note Overriding Variables: +Overriding.). + + A few variables have names that are a single punctuation character or +just a few characters. These are the "automatic variables", and they +have particular specialized uses. *Note Automatic Variables::. + +* Menu: + +* Reference:: How to use the value of a variable. +* Flavors:: Variables come in two flavors. +* Advanced:: Advanced features for referencing a variable. +* Values:: All the ways variables get their values. +* Setting:: How to set a variable in the makefile. +* Appending:: How to append more text to the old value + of a variable. +* Override Directive:: How to set a variable in the makefile even if + the user has set it with a command argument. +* Multi-Line:: An alternate way to set a variable + to a multi-line string. +* Undefine Directive:: How to undefine a variable so that it appears + as if it was never set. +* Environment:: Variable values can come from the environment. +* Target-specific:: Variable values can be defined on a per-target + basis. +* Pattern-specific:: Target-specific variable values can be applied + to a group of targets that match a pattern. +* Suppressing Inheritance:: Suppress inheritance of variables. +* Special Variables:: Variables with special meaning or behavior. + + +File: make.info, Node: Reference, Next: Flavors, Prev: Using Variables, Up: Using Variables + +6.1 Basics of Variable References +================================= + +To substitute a variable's value, write a dollar sign followed by the +name of the variable in parentheses or braces: either '$(foo)' or +'${foo}' is a valid reference to the variable 'foo'. This special +significance of '$' is why you must write '$$' to have the effect of a +single dollar sign in a file name or recipe. + + Variable references can be used in any context: targets, +prerequisites, recipes, most directives, and new variable values. Here +is an example of a common case, where a variable holds the names of all +the object files in a program: + + objects = program.o foo.o utils.o + program : $(objects) + cc -o program $(objects) + + $(objects) : defs.h + + Variable references work by strict textual substitution. Thus, the +rule + + foo = c + prog.o : prog.$(foo) + $(foo)$(foo) -$(foo) prog.$(foo) + +could be used to compile a C program 'prog.c'. Since spaces before the +variable value are ignored in variable assignments, the value of 'foo' +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 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::). + + +File: make.info, Node: Flavors, Next: Advanced, Prev: Reference, Up: Using Variables + +6.2 The Two Flavors of Variables +================================ + +There are two ways that a variable in GNU 'make' can have a value; we +call them the two "flavors" of variables. The two flavors are +distinguished in how they are defined and in what they do when expanded. + + The first flavor of variable is a "recursively expanded" variable. +Variables of this sort are defined by lines using '=' (*note Setting +Variables: Setting.) or by the 'define' directive (*note Defining +Multi-Line Variables: Multi-Line.). The value you specify is installed +verbatim; if it contains references to other variables, these references +are expanded whenever this variable is substituted (in the course of +expanding some other string). When this happens, it is called +"recursive expansion". + + For example, + + foo = $(bar) + bar = $(ugh) + ugh = Huh? + + all:;echo $(foo) + +will echo 'Huh?': '$(foo)' expands to '$(bar)' which expands to '$(ugh)' +which finally expands to 'Huh?'. + + This flavor of variable is the only sort supported by most other +versions of 'make'. It has its advantages and its disadvantages. An +advantage (most would say) is that: + + CFLAGS = $(include_dirs) -O + include_dirs = -Ifoo -Ibar + +will do what was intended: when 'CFLAGS' is expanded in a recipe, it +will expand to '-Ifoo -Ibar -O'. A major disadvantage is that you +cannot append something on the end of a variable, as in + + CFLAGS = $(CFLAGS) -O + +because it will cause an infinite loop in the variable expansion. +(Actually 'make' detects the infinite loop and reports an error.) + + Another disadvantage is that any functions (*note Functions for +Transforming Text: Functions.) referenced in the definition will be +executed every time the variable is expanded. This makes 'make' run +slower; worse, it causes the 'wildcard' and 'shell' functions to give +unpredictable results because you cannot easily control when they are +called, or even how many times. + + To avoid all the problems and inconveniences of recursively expanded +variables, there is another flavor: simply expanded variables. + + "Simply expanded variables" are defined by lines using ':=' or '::=' +(*note Setting Variables: Setting.). Both forms are equivalent in GNU +'make'; however only the '::=' form is described by the POSIX standard +(support for '::=' was added to the POSIX standard in 2012, so older +versions of 'make' won't accept this form either). + + The value of a simply expanded variable is scanned once and for all, +expanding any references to other variables and functions, when the +variable is defined. The actual value of the simply expanded variable +is the result of expanding the text that you write. It does not contain +any references to other variables; it contains their values _as of the +time this variable was defined_. Therefore, + + x := foo + y := $(x) bar + x := later + +is equivalent to + + y := foo bar + x := later + + When a simply expanded variable is referenced, its value is +substituted verbatim. + + Here is a somewhat more complicated example, illustrating the use of +':=' in conjunction with the 'shell' function. (*Note The 'shell' +Function: Shell Function.) This example also shows use of the variable +'MAKELEVEL', which is changed when it is passed down from level to +level. (*Note Communicating Variables to a Sub-'make': +Variables/Recursion, for information about 'MAKELEVEL'.) + + ifeq (0,${MAKELEVEL}) + whoami := $(shell whoami) + host-type := $(shell arch) + MAKE := ${MAKE} host-type=${host-type} whoami=${whoami} + endif + +An advantage of this use of ':=' is that a typical 'descend into a +directory' recipe then looks like this: + + ${subdirs}: + ${MAKE} -C $@ all + + Simply expanded variables generally make complicated makefile +programming more predictable because they work like variables in most +programming languages. They allow you to redefine a variable using its +own value (or its value processed in some way by one of the expansion +functions) and to use the expansion functions much more efficiently +(*note Functions for Transforming Text: Functions.). + + You can also use them to introduce controlled leading whitespace into +variable values. Leading whitespace characters are discarded from your +input before substitution of variable references and function calls; +this means you can include leading spaces in a variable value by +protecting them with variable references, like this: + + nullstring := + space := $(nullstring) # end of the line + +Here the value of the variable 'space' is precisely one space. The +comment '# end of the line' is included here just for clarity. Since +trailing space characters are _not_ stripped from variable values, just +a space at the end of the line would have the same effect (but be rather +hard to read). If you put whitespace at the end of a variable value, it +is a good idea to put a comment like that at the end of the line to make +your intent clear. Conversely, if you do _not_ want any whitespace +characters at the end of your variable value, you must remember not to +put a random comment on the end of the line after some whitespace, such +as this: + + dir := /foo/bar # directory to put the frobs in + +Here the value of the variable 'dir' is '/foo/bar ' (with four +trailing spaces), which was probably not the intention. (Imagine +something like '$(dir)/file' with this definition!) + + There is another assignment operator for variables, '?='. This is +called a conditional variable assignment operator, because it only has +an effect if the variable is not yet defined. This statement: + + FOO ?= bar + +is exactly equivalent to this (*note The 'origin' Function: Origin +Function.): + + ifeq ($(origin FOO), undefined) + FOO = bar + endif + + Note that a variable set to an empty value is still defined, so '?=' +will not set that variable. + + +File: make.info, Node: Advanced, Next: Values, Prev: Flavors, Up: Using Variables + +6.3 Advanced Features for Reference to Variables +================================================ + +This section describes some advanced features you can use to reference +variables in more flexible ways. + +* Menu: + +* Substitution Refs:: Referencing a variable with + substitutions on the value. +* Computed Names:: Computing the name of the variable to refer to. + + +File: make.info, Node: Substitution Refs, Next: Computed Names, Prev: Advanced, Up: Advanced + +6.3.1 Substitution References +----------------------------- + +A "substitution reference" substitutes the value of a variable with +alterations that you specify. It has the form '$(VAR:A=B)' (or +'${VAR:A=B}') and its meaning is to take the value of the variable VAR, +replace every A at the end of a word with B in that value, and +substitute the resulting string. + + When we say "at the end of a word", we mean that A must appear either +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 l.a c.o + bar := $(foo:.o=.c) + +sets 'bar' to 'a.c b.c l.a c.c'. *Note Setting Variables: Setting. + + 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 +above, except that now A must contain a single '%' character. This case +is equivalent to '$(patsubst A,B,$(VAR))'. *Note Functions for String +Substitution and Analysis: Text Functions, for a description of the +'patsubst' function. + +For example: + + foo := a.o b.o l.a c.o + bar := $(foo:%.o=%.c) + +sets 'bar' to 'a.c b.c l.a c.c'. + + +File: make.info, Node: Computed Names, Prev: Substitution Refs, Up: Advanced + +6.3.2 Computed Variable Names +----------------------------- + +Computed variable names are a complicated concept needed only for +sophisticated makefile programming. For most purposes you need not +consider them, except to know that making a variable with a dollar sign +in its name might have strange results. However, if you are the type +that wants to understand everything, or you are actually interested in +what they do, read on. + + Variables may be referenced inside the name of a variable. This is +called a "computed variable name" or a "nested variable reference". For +example, + + x = y + y = z + a := $($(x)) + +defines 'a' as 'z': the '$(x)' inside '$($(x))' expands to 'y', so +'$($(x))' expands to '$(y)' which in turn expands to 'z'. Here the name +of the variable to reference is not stated explicitly; it is computed by +expansion of '$(x)'. The reference '$(x)' here is nested within the +outer variable reference. + + The previous example shows two levels of nesting, but any number of +levels is possible. For example, here are three levels: + + x = y + y = z + z = u + a := $($($(x))) + +Here the innermost '$(x)' expands to 'y', so '$($(x))' expands to '$(y)' +which in turn expands to 'z'; now we have '$(z)', which becomes 'u'. + + References to recursively-expanded variables within a variable name +are re-expanded in the usual fashion. For example: + + x = $(y) + y = z + z = Hello + a := $($(x)) + +defines 'a' as 'Hello': '$($(x))' becomes '$($(y))' which becomes '$(z)' +which becomes 'Hello'. + + Nested variable references can also contain modified references and +function invocations (*note Functions for Transforming Text: +Functions.), just like any other reference. For example, using the +'subst' function (*note Functions for String Substitution and Analysis: +Text Functions.): + + x = variable1 + variable2 := Hello + y = $(subst 1,2,$(x)) + z = y + a := $($($(z))) + +eventually defines 'a' as 'Hello'. It is doubtful that anyone would +ever want to write a nested reference as convoluted as this one, but it +works: '$($($(z)))' expands to '$($(y))' which becomes '$($(subst +1,2,$(x)))'. This gets the value 'variable1' from 'x' and changes it by +substitution to 'variable2', so that the entire string becomes +'$(variable2)', a simple variable reference whose value is 'Hello'. + + A computed variable name need not consist entirely of a single +variable reference. It can contain several variable references, as well +as some invariant text. For example, + + a_dirs := dira dirb + 1_dirs := dir1 dir2 + + a_files := filea fileb + 1_files := file1 file2 + + ifeq "$(use_a)" "yes" + a1 := a + else + a1 := 1 + endif + + ifeq "$(use_dirs)" "yes" + df := dirs + else + df := files + endif + + dirs := $($(a1)_$(df)) + +will give 'dirs' the same value as 'a_dirs', '1_dirs', 'a_files' or +'1_files' depending on the settings of 'use_a' and 'use_dirs'. + + Computed variable names can also be used in substitution references: + + a_objects := a.o b.o c.o + 1_objects := 1.o 2.o 3.o + + sources := $($(a1)_objects:.o=.c) + +defines 'sources' as either 'a.c b.c c.c' or '1.c 2.c 3.c', depending on +the value of 'a1'. + + The only restriction on this sort of use of nested variable +references is that they cannot specify part of the name of a function to +be called. This is because the test for a recognized function name is +done before the expansion of nested references. For example, + + ifdef do_sort + func := sort + else + func := strip + endif + + bar := a d b g q c + + foo := $($(func) $(bar)) + +attempts to give 'foo' the value of the variable 'sort a d b g q c' or +'strip a d b g q c', rather than giving 'a d b g q c' as the argument to +either the 'sort' or the 'strip' function. This restriction could be +removed in the future if that change is shown to be a good idea. + + You can also use computed variable names in the left-hand side of a +variable assignment, or in a 'define' directive, as in: + + dir = foo + $(dir)_sources := $(wildcard $(dir)/*.c) + define $(dir)_print = + lpr $($(dir)_sources) + endef + +This example defines the variables 'dir', 'foo_sources', and +'foo_print'. + + Note that "nested variable references" are quite different from +"recursively expanded variables" (*note The Two Flavors of Variables: +Flavors.), though both are used together in complex ways when doing +makefile programming. + + +File: make.info, Node: Values, Next: Setting, Prev: Advanced, Up: Using Variables + +6.4 How Variables Get Their Values +================================== + +Variables can get values in several different ways: + + * You can specify an overriding value when you run 'make'. *Note + Overriding Variables: Overriding. + + * You can specify a value in the makefile, either with an assignment + (*note Setting Variables: Setting.) or with a verbatim definition + (*note Defining Multi-Line Variables: Multi-Line.). + + * Variables in the environment become 'make' variables. *Note + Variables from the Environment: Environment. + + * Several "automatic" variables are given new values for each rule. + Each of these has a single conventional use. *Note Automatic + Variables::. + + * Several variables have constant initial values. *Note Variables + Used by Implicit Rules: Implicit Variables. + + +File: make.info, Node: Setting, Next: Appending, Prev: Values, Up: Using Variables + +6.5 Setting Variables +===================== + +To set a variable from the makefile, write a line starting with the +variable name followed by '=', ':=', or '::='. Whatever follows the +'=', ':=', or '::=' on the line becomes the value. For example, + + objects = main.o foo.o bar.o utils.o + +defines a variable named 'objects'. Whitespace around the variable name +and immediately after the '=' is ignored. + + Variables defined with '=' are "recursively expanded" variables. +Variables defined with ':=' or '::=' are "simply expanded" variables; +these definitions can contain variable references which will be expanded +before the definition is made. *Note The Two Flavors of Variables: +Flavors. + + The variable name may contain function and variable references, which +are expanded when the line is read to find the actual variable name to +use. + + There is no limit on the length of the value of a variable except the +amount of memory on the computer. You can split the value of a variable +into multiple physical lines for readability (*note Splitting Long +Lines: Splitting Lines.). + + Most variable names are considered to have the empty string as a +value if you have never set them. Several variables have built-in +initial values that are not empty, but you can set them in the usual +ways (*note Variables Used by Implicit Rules: Implicit Variables.). +Several special variables are set automatically to a new value for each +rule; these are called the "automatic" variables (*note Automatic +Variables::). + + If you'd like a variable to be set to a value only if it's not +already set, then you can use the shorthand operator '?=' instead of +'='. These two settings of the variable 'FOO' are identical (*note The +'origin' Function: Origin Function.): + + FOO ?= bar + +and + + ifeq ($(origin FOO), undefined) + FOO = bar + endif + + The shell assignment operator '!=' can be used to execute a shell +script and set a variable to its output. This operator first evaluates +the right-hand side, then passes that result to the shell for execution. +If the result of the execution ends in a newline, that one newline is +removed; all other newlines are replaced by spaces. The resulting +string is then placed into the named recursively-expanded variable. For +example: + + hash != printf '\043' + file_list != find . -name '*.c' + + If the result of the execution could produce a '$', and you don't +intend what follows that to be interpreted as a make variable or +function reference, then you must replace every '$' with '$$' as part of +the execution. Alternatively, you can set a simply expanded variable to +the result of running a program using the 'shell' function call. *Note +The 'shell' Function: Shell Function. For example: + + hash := $(shell printf '\043') + var := $(shell find . -name "*.c") + + As with the 'shell' function, the exit status of the just-invoked +shell script is stored in the '.SHELLSTATUS' variable. + + +File: make.info, Node: Appending, Next: Override Directive, Prev: Setting, Up: Using Variables + +6.6 Appending More Text to Variables +==================================== + +Often it is useful to add more text to the value of a variable already +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, if it has a value +already). Thus: + + objects = main.o foo.o bar.o utils.o + objects += another.o + +sets 'objects' to 'main.o foo.o bar.o utils.o another.o'. + + Using '+=' is similar to: + + objects = main.o foo.o bar.o utils.o + objects := $(objects) another.o + +but differs in ways that become important when you use more complex +values. + + When the variable in question has not been defined before, '+=' acts +just like normal '=': it defines a recursively-expanded variable. +However, when there _is_ a previous definition, exactly what '+=' does +depends on what flavor of variable you defined originally. *Note The +Two Flavors of Variables: Flavors, for an explanation of the two flavors +of variables. + + When you add to a variable's value with '+=', 'make' acts essentially +as if you had included the extra text in the initial definition of the +variable. If you defined it first with ':=' or '::=', making it a +simply-expanded variable, '+=' adds to that simply-expanded definition, +and expands the new text before appending it to the old value just as +':=' does (see *note Setting Variables: Setting, for a full explanation +of ':=' or '::='). In fact, + + variable := value + variable += more + +is exactly equivalent to: + + variable := value + variable := $(variable) more + + On the other hand, when you use '+=' with a variable that you defined +first to be recursively-expanded using plain '=', 'make' does something +a bit different. Recall that when you define a recursively-expanded +variable, 'make' does not expand the value you set for variable and +function references immediately. Instead it stores the text verbatim, +and saves these variable and function references to be expanded later, +when you refer to the new variable (*note The Two Flavors of Variables: +Flavors.). When you use '+=' on a recursively-expanded variable, it is +this unexpanded text to which 'make' appends the new text you specify. + + variable = value + variable += more + +is roughly equivalent to: + + temp = value + variable = $(temp) more + +except that of course it never defines a variable called 'temp'. The +importance of this comes when the variable's old value contains variable +references. Take this common example: + + CFLAGS = $(includes) -O + ... + CFLAGS += -pg # enable profiling + +The first line defines the 'CFLAGS' variable with a reference to another +variable, 'includes'. ('CFLAGS' is used by the rules for C compilation; +*note Catalogue of Built-In Rules: Catalogue of Rules.) Using '=' for +the definition makes 'CFLAGS' a recursively-expanded variable, meaning +'$(includes) -O' is _not_ expanded when 'make' processes the definition +of 'CFLAGS'. Thus, 'includes' need not be defined yet for its value to +take effect. It only has to be defined before any reference to +'CFLAGS'. If we tried to append to the value of 'CFLAGS' without using +'+=', we might do it like this: + + CFLAGS := $(CFLAGS) -pg # enable profiling + +This is pretty close, but not quite what we want. Using ':=' redefines +'CFLAGS' as a simply-expanded variable; this means 'make' expands the +text '$(CFLAGS) -pg' before setting the variable. If 'includes' is not +yet defined, we get ' -O -pg', and a later definition of 'includes' will +have no effect. Conversely, by using '+=' we set 'CFLAGS' to the +_unexpanded_ value '$(includes) -O -pg'. Thus we preserve the reference +to 'includes', so if that variable gets defined at any later point, a +reference like '$(CFLAGS)' still uses its value. + + +File: make.info, Node: Override Directive, Next: Multi-Line, Prev: Appending, Up: Using Variables + +6.7 The 'override' Directive +============================ + +If a variable has been set with a command argument (*note Overriding +Variables: Overriding.), then ordinary assignments in the makefile are +ignored. If you want to set the variable in the makefile even though it +was set with a command argument, you can use an 'override' directive, +which is a line that looks like this: + + override VARIABLE = VALUE + +or + + override VARIABLE := VALUE + + To append more text to a variable defined on the command line, use: + + override VARIABLE += MORE TEXT + +*Note Appending More Text to Variables: Appending. + + Variable assignments marked with the 'override' flag have a higher +priority than all other assignments, except another 'override'. +Subsequent assignments or appends to this variable which are not marked +'override' will be ignored. + + The 'override' directive was not invented for escalation in the war +between makefiles and command arguments. It was invented so you can +alter and add to values that the user specifies with command arguments. + + For example, suppose you always want the '-g' switch when you run the +C compiler, but you would like to allow the user to specify the other +switches with a command argument just as usual. You could use this +'override' directive: + + override CFLAGS += -g + + You can also use 'override' directives with 'define' directives. +This is done as you might expect: + + override define foo = + bar + endef + +*Note Defining Multi-Line Variables: Multi-Line. + + +File: make.info, Node: Multi-Line, Next: Undefine Directive, Prev: Override Directive, Up: Using Variables + +6.8 Defining Multi-Line Variables +================================= + +Another way to set the value of a variable is to use the 'define' +directive. This directive has an unusual syntax which allows newline +characters to be included in the value, which is convenient for defining +both canned sequences of commands (*note Defining Canned Recipes: Canned +Recipes.), and also sections of makefile syntax to use with 'eval' +(*note Eval Function::). + + The '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 '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 +variable (*note The Two Flavors of Variables: Flavors.). When using a +'+=' operator, the value is appended to the previous value as with any +other append operation: with a single space separating the old and new +values. + + You may nest 'define' directives: 'make' will keep track of nested +directives and report an error if they are not all properly closed with +'endef'. Note that lines beginning with the recipe prefix character are +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 + echo foo + echo $(bar) + endef + + When used in a recipe, the previous example is functionally +equivalent to this: + + two-lines = echo foo; echo $(bar) + +since two commands separated by semicolon behave much like two separate +shell commands. However, note that using two separate lines means +'make' will invoke the shell twice, running an independent sub-shell for +each line. *Note Recipe Execution: Execution. + + If you want variable definitions made with 'define' to take +precedence over command-line variable definitions, you can use the +'override' directive together with 'define': + + override define two-lines = + foo + $(bar) + endef + +*Note The 'override' Directive: Override Directive. + + +File: make.info, Node: Undefine Directive, Next: Environment, Prev: Multi-Line, Up: Using Variables + +6.9 Undefining Variables +======================== + +If you want to clear a variable, setting its value to empty is usually +sufficient. Expanding such a variable will yield the same result (empty +string) regardless of whether it was set or not. However, if you are +using the 'flavor' (*note Flavor Function::) and 'origin' (*note Origin +Function::) functions, there is a difference between a variable that was +never set and a variable with an empty value. In such situations you +may want to use the 'undefine' directive to make a variable appear as if +it was never set. For example: + + foo := foo + bar = bar + + undefine foo + undefine bar + + $(info $(origin foo)) + $(info $(flavor bar)) + + This example will print "undefined" for both variables. + + If you want to undefine a command-line variable definition, you can +use the 'override' directive together with 'undefine', similar to how +this is done for variable definitions: + + override undefine CFLAGS + + +File: make.info, Node: Environment, Next: Target-specific, Prev: Undefine Directive, Up: Using Variables + +6.10 Variables from the Environment +=================================== + +Variables in 'make' can come from the environment in which 'make' is +run. Every environment variable that 'make' sees when it starts up is +transformed into a 'make' variable with the same name and value. +However, an explicit assignment in the makefile, or with a command +argument, overrides the environment. (If the '-e' flag is specified, +then values from the environment override assignments in the makefile. +*Note Summary of Options: Options Summary. But this is not recommended +practice.) + + Thus, by setting the variable 'CFLAGS' in your environment, you can +cause all C compilations in most makefiles to use the compiler switches +you prefer. This is safe for variables with standard or conventional +meanings because you know that no makefile will use them for other +things. (Note this is not totally reliable; some makefiles set 'CFLAGS' +explicitly and therefore are not affected by the value in the +environment.) + + When 'make' runs a recipe, variables defined in the makefile are +placed into the environment of each shell. This allows you to pass +values to sub-'make' invocations (*note Recursive Use of 'make': +Recursion.). By default, only variables that came from the environment +or the command line are passed to recursive invocations. You can use +the 'export' directive to pass other variables. *Note Communicating +Variables to a Sub-'make': Variables/Recursion, for full details. + + Other use of variables from the environment is not recommended. It +is not wise for makefiles to depend for their functioning on environment +variables set up outside their control, since this would cause different +users to get different results from the same makefile. This is against +the whole purpose of most makefiles. + + Such problems would be especially likely with the variable 'SHELL', +which is normally present in the environment to specify the user's +choice of interactive shell. It would be very undesirable for this +choice to affect 'make'; so, 'make' handles the 'SHELL' environment +variable in a special way; see *note Choosing the Shell::. + + +File: make.info, Node: Target-specific, Next: Pattern-specific, Prev: Environment, Up: Using Variables + +6.11 Target-specific Variable Values +==================================== + +Variable values in 'make' are usually global; that is, they are the same +regardless of where they are evaluated (unless they're reset, of +course). One exception to that is automatic variables (*note Automatic +Variables::). + + The other exception is "target-specific variable values". This +feature allows you to define different values for the same variable, +based on the target that 'make' is currently building. As with +automatic variables, these values are only available within the context +of a target's recipe (and in other target-specific assignments). + + Set a target-specific variable value like this: + + TARGET ... : VARIABLE-ASSIGNMENT + + Target-specific variable assignments can be prefixed with any or all +of the special keywords 'export', 'override', or 'private'; these apply +their normal behavior to this instance of the variable only. + + Multiple TARGET values create a target-specific variable value for +each member of the target list individually. + + The VARIABLE-ASSIGNMENT can be any valid form of assignment; +recursive ('='), simple (':=' or '::='), appending ('+='), or +conditional ('?='). All variables that appear within the +VARIABLE-ASSIGNMENT are evaluated within the context of the target: +thus, any previously-defined target-specific variable values will be in +effect. Note that this variable is actually distinct from any "global" +value: the two variables do not have to have the same flavor (recursive +vs. simple). + + Target-specific variables have the same priority as any other +makefile variable. Variables provided on the command line (and in the +environment if the '-e' option is in force) will take precedence. +Specifying the 'override' directive will allow the target-specific +variable value to be preferred. + + There is one more special feature of target-specific variables: when +you define a target-specific variable that variable value is also in +effect for all prerequisites of this target, and all their +prerequisites, etc. (unless those prerequisites override that variable +with their own target-specific variable value). So, for example, a +statement like this: + + prog : CFLAGS = -g + prog : prog.o foo.o bar.o + +will set 'CFLAGS' to '-g' in the recipe for 'prog', but it will also set +'CFLAGS' to '-g' in the recipes that create 'prog.o', 'foo.o', and +'bar.o', and any recipes which create their prerequisites. + + Be aware that a given prerequisite will only be built once per +invocation of make, at most. If the same file is a prerequisite of +multiple targets, and each of those targets has a different value for +the same target-specific variable, then the first target to be built +will cause that prerequisite to be built and the prerequisite will +inherit the target-specific value from the first target. It will ignore +the target-specific values from any other targets. + + +File: make.info, Node: Pattern-specific, Next: Suppressing Inheritance, Prev: Target-specific, Up: Using Variables + +6.12 Pattern-specific Variable Values +===================================== + +In addition to target-specific variable values (*note Target-specific +Variable Values: Target-specific.), GNU 'make' supports pattern-specific +variable values. In this form, the variable is defined for any target +that matches the pattern specified. + + Set a pattern-specific variable value like this: + + PATTERN ... : VARIABLE-ASSIGNMENT + where PATTERN is a %-pattern. As with target-specific variable +values, multiple PATTERN values create a pattern-specific variable value +for each pattern individually. The VARIABLE-ASSIGNMENT can be any valid +form of assignment. Any command line variable setting will take +precedence, unless 'override' is specified. + + For example: + + %.o : CFLAGS = -O + +will assign 'CFLAGS' the value of '-O' for all targets matching the +pattern '%.o'. + + If a target matches more than one pattern, the matching +pattern-specific variables with longer stems are interpreted first. +This results in more specific variables taking precedence over the more +generic ones, for example: + + %.o: %.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ + + lib/%.o: CFLAGS := -fPIC -g + %.o: CFLAGS := -g + + all: foo.o lib/bar.o + + In this example the first definition of the 'CFLAGS' variable will be +used to update 'lib/bar.o' even though the second one also applies to +this target. Pattern-specific variables which result in the same stem +length are considered in the order in which they were defined in the +makefile. + + Pattern-specific variables are searched after any target-specific +variables defined explicitly for that target, and before target-specific +variables defined for the parent target. + + +File: make.info, Node: Suppressing Inheritance, Next: Special Variables, Prev: Pattern-specific, Up: Using Variables + +6.13 Suppressing Inheritance +============================ + +As described in previous sections, 'make' variables are inherited by +prerequisites. This capability allows you to modify the behavior of a +prerequisite based on which targets caused it to be rebuilt. For +example, you might set a target-specific variable on a 'debug' target, +then running 'make debug' will cause that variable to be inherited by +all prerequisites of 'debug', while just running 'make all' (for +example) would not have that assignment. + + Sometimes, however, you may not want a variable to be inherited. For +these situations, 'make' provides the 'private' modifier. Although this +modifier can be used with any variable assignment, it makes the most +sense with target- and pattern-specific variables. Any variable marked +'private' will be visible to its local target but will not be inherited +by prerequisites of that target. A global variable marked 'private' +will be visible in the global scope but will not be inherited by any +target, and hence will not be visible in any recipe. + + As an example, consider this makefile: + EXTRA_CFLAGS = + + prog: private EXTRA_CFLAGS = -L/usr/local/lib + prog: a.o b.o + + Due to the 'private' modifier, 'a.o' and 'b.o' will not inherit the +'EXTRA_CFLAGS' variable assignment from the 'prog' target. + + +File: make.info, Node: Special Variables, Prev: Suppressing Inheritance, Up: Using Variables + +6.14 Other Special Variables +============================ + +GNU 'make' supports some variables that have special properties. + +'MAKEFILE_LIST' + Contains the name of each makefile that is parsed by 'make', in the + order in which it was parsed. The name is appended just before + 'make' begins to parse the makefile. Thus, if the first thing a + makefile does is examine the last word in this variable, it will be + the name of the current makefile. Once the current makefile has + used 'include', however, the last word will be the just-included + makefile. + + If a makefile named 'Makefile' has this content: + + name1 := $(lastword $(MAKEFILE_LIST)) + + include inc.mk + + name2 := $(lastword $(MAKEFILE_LIST)) + + all: + @echo name1 = $(name1) + @echo name2 = $(name2) + + then you would expect to see this output: + + name1 = Makefile + name2 = inc.mk + +'.DEFAULT_GOAL' + Sets the default goal to be used if no targets were specified on + the command line (*note Arguments to Specify the Goals: Goals.). + The '.DEFAULT_GOAL' variable allows you to discover the current + default goal, restart the default goal selection algorithm by + clearing its value, or to explicitly set the default goal. The + following example illustrates these cases: + + # Query the default goal. + ifeq ($(.DEFAULT_GOAL),) + $(warning no default goal is set) + endif + + .PHONY: foo + foo: ; @echo $@ + + $(warning default goal is $(.DEFAULT_GOAL)) + + # Reset the default goal. + .DEFAULT_GOAL := + + .PHONY: bar + bar: ; @echo $@ + + $(warning default goal is $(.DEFAULT_GOAL)) + + # Set our own. + .DEFAULT_GOAL := foo + + This makefile prints: + + no default goal is set + default goal is foo + default goal is bar + foo + + Note that assigning more than one target name to '.DEFAULT_GOAL' is + invalid and will result in an error. + +'MAKE_RESTARTS' + This variable is set only if this instance of 'make' has restarted + (*note How Makefiles Are Remade: Remaking Makefiles.): it will + contain the number of times this instance has restarted. Note this + is not the same as recursion (counted by the 'MAKELEVEL' variable). + You should not set, modify, or export this variable. + +'MAKE_TERMOUT' +'MAKE_TERMERR' + When 'make' starts it will check whether stdout and stderr will + show their output on a terminal. If so, it will set 'MAKE_TERMOUT' + and 'MAKE_TERMERR', respectively, to the name of the terminal + device (or 'true' if this cannot be determined). If set these + variables will be marked for export. These variables will not be + changed by 'make' and they will not be modified if already set. + + These values can be used (particularly in combination with output + synchronization (*note Output During Parallel Execution: Parallel + Output.) to determine whether 'make' itself is writing to a + terminal; they can be tested to decide whether to force recipe + commands to generate colorized output for example. + + If you invoke a sub-'make' and redirect its stdout or stderr it is + your responsibility to reset or unexport these variables as well, + if your makefiles rely on them. + +'.RECIPEPREFIX' + The first character of the value of this variable is used as the + character make assumes is introducing a recipe line. If the + variable is empty (as it is by default) that character is the + standard tab character. For example, this is a valid makefile: + + .RECIPEPREFIX = > + all: + > @echo Hello, world + + The value of '.RECIPEPREFIX' can be changed multiple times; once + set it stays in effect for all rules parsed until it is modified. + +'.VARIABLES' + Expands to a list of the _names_ of all global variables defined so + far. This includes variables which have empty values, as well as + built-in variables (*note Variables Used by Implicit Rules: + Implicit Variables.), but does not include any variables which are + only defined in a target-specific context. Note that any value you + assign to this variable will be ignored; it will always return its + special value. + +'.FEATURES' + Expands to a list of special features supported by this version of + 'make'. Possible values include, but are not limited to: + + 'archives' + Supports 'ar' (archive) files using special file name syntax. + *Note Using 'make' to Update Archive Files: Archives. + + 'check-symlink' + Supports the '-L' ('--check-symlink-times') flag. *Note + Summary of Options: Options Summary. + + 'else-if' + Supports "else if" non-nested conditionals. *Note Syntax of + Conditionals: Conditional Syntax. + + 'jobserver' + Supports "job server" enhanced parallel builds. *Note + Parallel Execution: Parallel. + + 'oneshell' + Supports the '.ONESHELL' special target. *Note Using One + Shell: One Shell. + + 'order-only' + Supports order-only prerequisites. *Note Types of + Prerequisites: Prerequisite Types. + + 'second-expansion' + Supports secondary expansion of prerequisite lists. + + 'shortest-stem' + Uses the "shortest stem" method of choosing which pattern, of + multiple applicable options, will be used. *Note How Patterns + Match: Pattern Match. + + 'target-specific' + Supports target-specific and pattern-specific variable + assignments. *Note Target-specific Variable Values: + Target-specific. + + 'undefine' + Supports the 'undefine' directive. *Note Undefine + Directive::. + + 'guile' + Has GNU Guile available as an embedded extension language. + *Note GNU Guile Integration: Guile Integration. + + 'load' + Supports dynamically loadable objects for creating custom + extensions. *Note Loading Dynamic Objects: Loading Objects. + +'.INCLUDE_DIRS' + 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. + + +File: make.info, Node: Conditionals, Next: Functions, Prev: Using Variables, Up: Top + +7 Conditional Parts of Makefiles +******************************** + +A "conditional" directive causes part of a makefile to be obeyed or +ignored depending on the values of variables. Conditionals can compare +the value of one variable to another, or the value of a variable to a +constant string. Conditionals control what 'make' actually "sees" in +the makefile, so they _cannot_ be used to control recipes at the time of +execution. + +* Menu: + +* Conditional Example:: Example of a conditional +* Conditional Syntax:: The syntax of conditionals. +* Testing Flags:: Conditionals that test flags. + + +File: make.info, Node: Conditional Example, Next: Conditional Syntax, Prev: Conditionals, Up: Conditionals + +7.1 Example of a Conditional +============================ + +The following example of a conditional tells 'make' to use one set of +libraries if the 'CC' variable is 'gcc', and a different set of +libraries otherwise. It works by controlling which of two recipe lines +will be used for the rule. The result is that 'CC=gcc' as an argument +to 'make' changes not only which compiler is used but also which +libraries are linked. + + libs_for_gcc = -lgnu + normal_libs = + + foo: $(objects) + ifeq ($(CC),gcc) + $(CC) -o foo $(objects) $(libs_for_gcc) + else + $(CC) -o foo $(objects) $(normal_libs) + endif + + This conditional uses three directives: one 'ifeq', one 'else' and +one 'endif'. + + The 'ifeq' directive begins the conditional, and specifies the +condition. It contains two arguments, separated by a comma and +surrounded by parentheses. Variable substitution is performed on both +arguments and then they are compared. The lines of the makefile +following the 'ifeq' are obeyed if the two arguments match; otherwise +they are ignored. + + The 'else' directive causes the following lines to be obeyed if the +previous conditional failed. In the example above, this means that the +second alternative linking command is used whenever the first +alternative is not used. It is optional to have an 'else' in a +conditional. + + The 'endif' directive ends the conditional. Every conditional must +end with an 'endif'. Unconditional makefile text follows. + + As this example illustrates, conditionals work at the textual level: +the lines of the conditional are treated as part of the makefile, or +ignored, according to the condition. This is why the larger syntactic +units of the makefile, such as rules, may cross the beginning or the end +of the conditional. + + When the variable 'CC' has the value 'gcc', the above example has +this effect: + + foo: $(objects) + $(CC) -o foo $(objects) $(libs_for_gcc) + +When the variable 'CC' has any other value, the effect is this: + + foo: $(objects) + $(CC) -o foo $(objects) $(normal_libs) + + Equivalent results can be obtained in another way by conditionalizing +a variable assignment and then using the variable unconditionally: + + libs_for_gcc = -lgnu + normal_libs = + + ifeq ($(CC),gcc) + libs=$(libs_for_gcc) + else + libs=$(normal_libs) + endif + + foo: $(objects) + $(CC) -o foo $(objects) $(libs) + + +File: make.info, Node: Conditional Syntax, Next: Testing Flags, Prev: Conditional Example, Up: Conditionals + +7.2 Syntax of Conditionals +========================== + +The syntax of a simple conditional with no 'else' is as follows: + + CONDITIONAL-DIRECTIVE + TEXT-IF-TRUE + endif + +The TEXT-IF-TRUE may be any lines of text, to be considered as part of +the makefile if the condition is true. If the condition is false, no +text is used instead. + + The syntax of a complex conditional is as follows: + + CONDITIONAL-DIRECTIVE + TEXT-IF-TRUE + else + TEXT-IF-FALSE + endif + + or: + + CONDITIONAL-DIRECTIVE-ONE + TEXT-IF-ONE-IS-TRUE + else CONDITIONAL-DIRECTIVE-TWO + TEXT-IF-TWO-IS-TRUE + else + TEXT-IF-ONE-AND-TWO-ARE-FALSE + endif + +There can be as many "'else' CONDITIONAL-DIRECTIVE" clauses as +necessary. Once a given condition is true, TEXT-IF-TRUE is used and no +other clause is used; if no condition is true then TEXT-IF-FALSE is +used. The TEXT-IF-TRUE and TEXT-IF-FALSE can be any number of lines of +text. + + The syntax of the CONDITIONAL-DIRECTIVE is the same whether the +conditional is simple or complex; after an 'else' or not. There are +four different directives that test different conditions. Here is a +table of them: + +'ifeq (ARG1, ARG2)' +'ifeq 'ARG1' 'ARG2'' +'ifeq "ARG1" "ARG2"' +'ifeq "ARG1" 'ARG2'' +'ifeq 'ARG1' "ARG2"' + Expand all variable references in ARG1 and ARG2 and compare them. + If they are identical, the TEXT-IF-TRUE is effective; otherwise, + the TEXT-IF-FALSE, if any, is effective. + + Often you want to test if a variable has a non-empty value. When + the value results from complex expansions of variables and + functions, expansions you would consider empty may actually contain + whitespace characters and thus are not seen as empty. However, you + can use the 'strip' function (*note Text Functions::) to avoid + interpreting whitespace as a non-empty value. For example: + + ifeq ($(strip $(foo)),) + TEXT-IF-EMPTY + endif + + will evaluate TEXT-IF-EMPTY even if the expansion of '$(foo)' + contains whitespace characters. + +'ifneq (ARG1, ARG2)' +'ifneq 'ARG1' 'ARG2'' +'ifneq "ARG1" "ARG2"' +'ifneq "ARG1" 'ARG2'' +'ifneq 'ARG1' "ARG2"' + Expand all variable references in ARG1 and ARG2 and compare them. + If they are different, the TEXT-IF-TRUE is effective; otherwise, + the TEXT-IF-FALSE, if any, is effective. + +'ifdef VARIABLE-NAME' + The 'ifdef' form takes the _name_ of a variable as its argument, + not a reference to a variable. If the value of that variable has a + non-empty value, the TEXT-IF-TRUE is effective; otherwise, the + TEXT-IF-FALSE, if any, is effective. Variables that have never + been defined have an empty value. The text VARIABLE-NAME is + expanded, so it could be a variable or function that expands to the + name of a variable. For example: + + bar = true + foo = bar + ifdef $(foo) + frobozz = yes + endif + + The variable reference '$(foo)' is expanded, yielding 'bar', which + is considered to be the name of a variable. The variable 'bar' is + not expanded, but its value is examined to determine if it is + non-empty. + + Note that 'ifdef' only tests whether a variable has a value. It + does not expand the variable to see if that value is nonempty. + Consequently, tests using 'ifdef' return true for all definitions + except those like 'foo ='. To test for an empty value, use + 'ifeq ($(foo),)'. For example, + + bar = + foo = $(bar) + ifdef foo + frobozz = yes + else + frobozz = no + endif + + sets 'frobozz' to 'yes', while: + + foo = + ifdef foo + frobozz = yes + else + frobozz = no + endif + + sets 'frobozz' to 'no'. + +'ifndef VARIABLE-NAME' + If the variable VARIABLE-NAME has an empty value, the TEXT-IF-TRUE + is effective; otherwise, the TEXT-IF-FALSE, if any, is effective. + The rules for expansion and testing of VARIABLE-NAME are identical + to the 'ifdef' directive. + + Extra spaces are allowed and ignored at the beginning of the +conditional directive line, but a tab is not allowed. (If the line +begins with a tab, it will be considered part of a recipe for a rule.) +Aside from this, extra spaces or tabs may be inserted with no effect +anywhere except within the directive name or within an argument. A +comment starting with '#' may appear at the end of the line. + + The other two directives that play a part in a conditional are 'else' +and 'endif'. Each of these directives is written as one word, with no +arguments. Extra spaces are allowed and ignored at the beginning of the +line, and spaces or tabs at the end. A comment starting with '#' may +appear at the end of the line. + + Conditionals affect which lines of the makefile 'make' uses. If the +condition is true, 'make' reads the lines of the TEXT-IF-TRUE as part of +the makefile; if the condition is false, 'make' ignores those lines +completely. It follows that syntactic units of the makefile, such as +rules, may safely be split across the beginning or the end of the +conditional. + + 'make' evaluates conditionals when it reads a makefile. +Consequently, you cannot use automatic variables in the tests of +conditionals because they are not defined until recipes are run (*note +Automatic Variables::). + + To prevent intolerable confusion, it is not permitted to start a +conditional in one makefile and end it in another. However, you may +write an 'include' directive within a conditional, provided you do not +attempt to terminate the conditional inside the included file. + + +File: make.info, Node: Testing Flags, Prev: Conditional Syntax, Up: Conditionals + +7.3 Conditionals that Test Flags +================================ + +You can write a conditional that tests 'make' command flags such as '-t' +by using the variable 'MAKEFLAGS' together with the 'findstring' +function (*note Functions for String Substitution and Analysis: Text +Functions.). This is useful when 'touch' is not enough to make a file +appear up to date. + + The 'findstring' function determines whether one string appears as a +substring of another. If you want to test for the '-t' flag, use 't' as +the first string and the value of 'MAKEFLAGS' as the other. + + For example, here is how to arrange to use 'ranlib -t' to finish +marking an archive file up to date: + + archive.a: ... + ifneq (,$(findstring t,$(MAKEFLAGS))) + +touch archive.a + +ranlib -t archive.a + else + ranlib archive.a + endif + +The '+' prefix marks those recipe lines as "recursive" so that they will +be executed despite use of the '-t' flag. *Note Recursive Use of +'make': Recursion. + + +File: make.info, Node: Functions, Next: Running, Prev: Conditionals, Up: Top + +8 Functions for Transforming Text +********************************* + +"Functions" allow you to do text processing in the makefile to compute +the files to operate on or the commands to use in recipes. You use a +function in a "function call", where you give the name of the function +and some text (the "arguments") for the function to operate on. The +result of the function's processing is substituted into the makefile at +the point of the call, just as a variable might be substituted. + +* Menu: + +* Syntax of Functions:: How to write a function call. +* Text Functions:: General-purpose text manipulation functions. +* File Name Functions:: Functions for manipulating file names. +* Conditional Functions:: Functions that implement conditions. +* Foreach Function:: Repeat some text with controlled variation. +* File Function:: Write text to a file. +* Call Function:: Expand a user-defined function. +* Value Function:: Return the un-expanded value of a variable. +* Eval Function:: Evaluate the arguments as makefile syntax. +* Origin Function:: Find where a variable got its value. +* Flavor Function:: Find out the flavor of a variable. +* Make Control Functions:: Functions that control how make runs. +* Shell Function:: Substitute the output of a shell command. +* Guile Function:: Use GNU Guile embedded scripting language. + + +File: make.info, Node: Syntax of Functions, Next: Text Functions, Prev: Functions, Up: Functions + +8.1 Function Call Syntax +======================== + +A function call resembles a variable reference. It can appear anywhere +a variable reference can appear, and it is expanded using the same rules +as variable references. A function call looks like this: + + $(FUNCTION ARGUMENTS) + +or like this: + + ${FUNCTION ARGUMENTS} + + Here FUNCTION is a function name; one of a short list of names that +are part of 'make'. You can also essentially create your own functions +by using the 'call' built-in function. + + The ARGUMENTS are the arguments of the function. They are separated +from the function name by one or more spaces or tabs, and if there is +more than one argument, then they are separated by commas. Such +whitespace and commas are not part of an argument's value. The +delimiters which you use to surround the function call, whether +parentheses or braces, can appear in an argument only in matching pairs; +the other kind of delimiters may appear singly. If the arguments +themselves contain other function calls or variable references, it is +wisest to use the same kind of delimiters for all the references; write +'$(subst a,b,$(x))', not '$(subst a,b,${x})'. This is because it is +clearer, and because only one type of delimiter is matched to find the +end of the reference. + + The text written for each argument is processed by substitution of +variables and function calls to produce the argument value, which is the +text on which the function acts. The substitution is done in the order +in which the arguments appear. + + Commas and unmatched parentheses or braces cannot appear in the text +of an argument as written; leading spaces cannot appear in the text of +the first argument as written. These characters can be put into the +argument value by variable substitution. First define variables 'comma' +and 'space' whose values are isolated comma and space characters, then +substitute these variables where such characters are wanted, like this: + + comma:= , + empty:= + space:= $(empty) $(empty) + foo:= a b c + bar:= $(subst $(space),$(comma),$(foo)) + # bar is now 'a,b,c'. + +Here the 'subst' function replaces each space with a comma, through the +value of 'foo', and substitutes the result. + + +File: make.info, Node: Text Functions, Next: File Name Functions, Prev: Syntax of Functions, Up: Functions + +8.2 Functions for String Substitution and Analysis +================================================== + +Here are some functions that operate on strings: + +'$(subst FROM,TO,TEXT)' + Performs a textual replacement on the text TEXT: each occurrence of + FROM is replaced by TO. The result is substituted for the function + call. For example, + + $(subst ee,EE,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 + replaces them with REPLACEMENT. Here PATTERN may contain a '%' + which acts as a wildcard, matching any number of any characters + within a word. If REPLACEMENT also contains a '%', the '%' is + replaced by the text that matched the '%' in PATTERN. Only the + first '%' in the PATTERN and REPLACEMENT is treated this way; any + subsequent '%' is unchanged. + + '%' characters in 'patsubst' function invocations can be quoted + with preceding backslashes ('\'). Backslashes that would otherwise + quote '%' characters can be quoted with more backslashes. + Backslashes that quote '%' characters or other backslashes are + removed from the pattern before it is compared file names or has a + stem substituted into it. Backslashes that are not in danger of + quoting '%' characters go unmolested. For example, the pattern + 'the\%weird\\%pattern\\' has 'the%weird\' preceding the operative + '%' character, and 'pattern\\' following it. The final two + backslashes are left alone because they cannot affect any '%' + character. + + Whitespace between words is folded into single space characters; + leading and trailing whitespace is discarded. + + For example, + + $(patsubst %.c,%.o,x.c.c bar.c) + + produces the value 'x.c.o bar.o'. + + Substitution references (*note Substitution References: + Substitution Refs.) are a simpler way to get the effect of the + 'patsubst' function: + + $(VAR:PATTERN=REPLACEMENT) + + is equivalent to + + $(patsubst PATTERN,REPLACEMENT,$(VAR)) + + The second shorthand simplifies one of the most common uses of + 'patsubst': replacing the suffix at the end of file names. + + $(VAR:SUFFIX=REPLACEMENT) + + is equivalent to + + $(patsubst %SUFFIX,%REPLACEMENT,$(VAR)) + + For example, you might have a list of object files: + + objects = foo.o bar.o baz.o + + To get the list of corresponding source files, you could simply + write: + + $(objects:.o=.c) + + instead of using the general form: + + $(patsubst %.o,%.c,$(objects)) + +'$(strip STRING)' + Removes leading and trailing whitespace from STRING and replaces + each internal sequence of one or more whitespace characters with a + single space. Thus, '$(strip a b c )' results in 'a b c'. + + The function 'strip' can be very useful when used in conjunction + with conditionals. When comparing something with the empty string + '' using 'ifeq' or 'ifneq', you usually want a string of just + whitespace to match the empty string (*note Conditionals::). + + Thus, the following may fail to have the desired results: + + .PHONY: all + ifneq "$(needs_made)" "" + all: $(needs_made) + else + all:;@echo 'Nothing to make!' + endif + + Replacing the variable reference '$(needs_made)' with the function + call '$(strip $(needs_made))' in the 'ifneq' directive would make + it more robust. + +'$(findstring FIND,IN)' + Searches IN for an occurrence of FIND. If it occurs, the value is + FIND; otherwise, the value is empty. You can use this function in + a conditional to test for the presence of a specific substring in a + given string. Thus, the two examples, + + $(findstring a,a b c) + $(findstring a,b c) + + produce the values 'a' and '' (the empty string), respectively. + *Note Testing Flags::, for a practical application of 'findstring'. + +'$(filter PATTERN...,TEXT)' + Returns all whitespace-separated words in TEXT that _do_ match any + of the PATTERN words, removing any words that _do not_ match. The + patterns are written using '%', just like the patterns used in the + 'patsubst' function above. + + The 'filter' function can be used to separate out different types + of strings (such as file names) in a variable. For example: + + sources := foo.c bar.c baz.s ugh.h + foo: $(sources) + cc $(filter %.c %.s,$(sources)) -o foo + + says that 'foo' depends of 'foo.c', 'bar.c', 'baz.s' and 'ugh.h' + but only 'foo.c', 'bar.c' and 'baz.s' should be specified in the + command to the compiler. + +'$(filter-out PATTERN...,TEXT)' + Returns all whitespace-separated words in TEXT that _do not_ match + any of the PATTERN words, removing the words that _do_ match one or + more. This is the exact opposite of the 'filter' function. + + For example, given: + + objects=main1.o foo.o main2.o bar.o + mains=main1.o main2.o + + the following generates a list which contains all the object files + not in 'mains': + + $(filter-out $(mains),$(objects)) + +'$(sort LIST)' + Sorts the words of LIST in lexical order, removing duplicate words. + The output is a list of words separated by single spaces. Thus, + + $(sort foo bar lose) + + returns the value 'bar foo lose'. + + Incidentally, since 'sort' removes duplicate words, you can use it + for this purpose even if you don't care about the sort order. + +'$(word N,TEXT)' + Returns the Nth word of TEXT. The legitimate values of N start + from 1. If N is bigger than the number of words in TEXT, the value + is empty. For example, + + $(word 2, foo bar baz) + + returns 'bar'. + +'$(wordlist S,E,TEXT)' + Returns the list of words in TEXT starting with word S and ending + with word E (inclusive). The legitimate values of S start from 1; + E may start from 0. If S is bigger than the number of words in + TEXT, the value is empty. If E is bigger than the number of words + in TEXT, words up to the end of TEXT are returned. If S is greater + than E, nothing is returned. For example, + + $(wordlist 2, 3, foo bar baz) + + returns 'bar baz'. + +'$(words TEXT)' + Returns the number of words in TEXT. Thus, the last word of TEXT + is '$(word $(words TEXT),TEXT)'. + +'$(firstword NAMES...)' + The argument NAMES is regarded as a series of names, separated by + whitespace. The value is the first name in the series. The rest + of the names are ignored. + + For example, + + $(firstword foo bar) + + produces the result 'foo'. Although '$(firstword TEXT)' is the + same as '$(word 1,TEXT)', the 'firstword' function is retained for + its simplicity. + +'$(lastword NAMES...)' + The argument NAMES is regarded as a series of names, separated by + whitespace. The value is the last name in the series. + + For example, + + $(lastword foo bar) + + produces the result 'bar'. Although '$(lastword TEXT)' is the same + as '$(word $(words TEXT),TEXT)', the 'lastword' function was added + for its simplicity and better performance. + + Here is a realistic example of the use of 'subst' and 'patsubst'. +Suppose that a makefile uses the 'VPATH' variable to specify a list of +directories that 'make' should search for prerequisite files (*note +'VPATH' Search Path for All Prerequisites: General Search.). This +example shows how to tell the C compiler to search for header files in +the same list of directories. + + The value of 'VPATH' is a list of directories separated by colons, +such as 'src:../headers'. First, the 'subst' function is used to change +the colons to spaces: + + $(subst :, ,$(VPATH)) + +This produces 'src ../headers'. Then 'patsubst' is used to turn each +directory name into a '-I' flag. These can be added to the value of the +variable 'CFLAGS', which is passed automatically to the C compiler, like +this: + + override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH))) + +The effect is to append the text '-Isrc -I../headers' to the previously +given value of 'CFLAGS'. The 'override' directive is used so that the +new value is assigned even if the previous value of 'CFLAGS' was +specified with a command argument (*note The 'override' Directive: +Override Directive.). + + +File: make.info, Node: File Name Functions, Next: Conditional Functions, Prev: Text Functions, Up: Functions + +8.3 Functions for File Names +============================ + +Several of the built-in expansion functions relate specifically to +taking apart file names or lists of file names. + + Each of the following functions performs a specific transformation on +a file name. The argument of the function is regarded as a series of +file names, separated by whitespace. (Leading and trailing whitespace +is ignored.) Each file name in the series is transformed in the same +way and the results are concatenated with single spaces between them. + +'$(dir NAMES...)' + Extracts the directory-part of each file name in NAMES. The + directory-part of the file name is everything up through (and + including) the last slash in it. If the file name contains no + slash, the directory part is the string './'. For example, + + $(dir src/foo.c hacks) + + produces the result 'src/ ./'. + +'$(notdir NAMES...)' + Extracts all but the directory-part of each file name in NAMES. If + the file name contains no slash, it is left unchanged. Otherwise, + everything through the last slash is removed from it. + + A file name that ends with a slash becomes an empty string. This + is unfortunate, because it means that the result does not always + have the same number of whitespace-separated file names as the + argument had; but we do not see any other valid alternative. + + For example, + + $(notdir src/foo.c hacks) + + produces the result 'foo.c hacks'. + +'$(suffix NAMES...)' + Extracts the suffix of each file name in NAMES. If the file name + contains a period, the suffix is everything starting with the last + period. Otherwise, the suffix is the empty string. This + frequently means that the result will be empty when NAMES is not, + and if NAMES contains multiple file names, the result may contain + fewer file names. + + For example, + + $(suffix src/foo.c src-1.0/bar.c hacks) + + produces the result '.c .c'. + +'$(basename NAMES...)' + Extracts all but the suffix of each file name in NAMES. If the + file name contains a period, the basename is everything starting up + to (and not including) the last period. Periods in the directory + part are ignored. If there is no period, the basename is the + entire file name. For example, + + $(basename src/foo.c src-1.0/bar hacks) + + produces the result 'src/foo src-1.0/bar hacks'. + +'$(addsuffix SUFFIX,NAMES...)' + The argument NAMES is regarded as a series of names, separated by + whitespace; SUFFIX is used as a unit. The value of SUFFIX is + appended to the end of each individual name and the resulting + larger names are concatenated with single spaces between them. For + example, + + $(addsuffix .c,foo bar) + + produces the result 'foo.c bar.c'. + +'$(addprefix PREFIX,NAMES...)' + The argument NAMES is regarded as a series of names, separated by + whitespace; PREFIX is used as a unit. The value of PREFIX is + prepended to the front of each individual name and the resulting + larger names are concatenated with single spaces between them. For + example, + + $(addprefix src/,foo bar) + + produces the result 'src/foo src/bar'. + +'$(join LIST1,LIST2)' + Concatenates the two arguments word by word: the two first words + (one from each argument) concatenated form the first word of the + result, the two second words form the second word of the result, + and so on. So the Nth word of the result comes from the Nth word + of each argument. If one argument has more words that the other, + the extra words are copied unchanged into the result. + + For example, '$(join a b,.c .o)' produces 'a.c b.o'. + + Whitespace between the words in the lists is not preserved; it is + replaced with a single space. + + This function can merge the results of the 'dir' and 'notdir' + functions, to produce the original list of files which was given to + those two functions. + +'$(wildcard PATTERN)' + The argument PATTERN is a file name pattern, typically containing + wildcard characters (as in shell file name patterns). The result + of 'wildcard' is a space-separated list of the names of existing + files that match the pattern. *Note Using Wildcard Characters in + File Names: Wildcards. + +'$(realpath NAMES...)' + For each file name in NAMES return the canonical absolute name. A + canonical name does not contain any '.' or '..' components, nor any + repeated path separators ('/') or symlinks. In case of a failure + the empty string is returned. Consult the 'realpath(3)' + documentation for a list of possible failure causes. + +'$(abspath NAMES...)' + For each file name in NAMES return an absolute name that does not + contain any '.' or '..' components, nor any repeated path + separators ('/'). Note that, in contrast to 'realpath' function, + 'abspath' does not resolve symlinks and does not require the file + names to refer to an existing file or directory. Use the + 'wildcard' function to test for existence. + + +File: make.info, Node: Conditional Functions, Next: Foreach Function, Prev: File Name Functions, Up: Functions + +8.4 Functions for Conditionals +============================== + +There are three functions that provide conditional expansion. A key +aspect of these functions is that not all of the arguments are expanded +initially. Only those arguments which need to be expanded, will be +expanded. + +'$(if CONDITION,THEN-PART[,ELSE-PART])' + 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.)). + + The first argument, CONDITION, first has all preceding and trailing + whitespace stripped, then is expanded. If it expands to any + non-empty string, then the condition is considered to be true. If + it expands to an empty string, the condition is considered to be + false. + + If the condition is true then the second argument, THEN-PART, is + evaluated and this is used as the result of the evaluation of the + entire 'if' function. + + If the condition is false then the third argument, ELSE-PART, is + evaluated and this is the result of the 'if' function. If there is + no third argument, the 'if' function evaluates to nothing (the + empty string). + + Note that only one of the THEN-PART or the ELSE-PART will be + evaluated, never both. Thus, either can contain side-effects (such + as 'shell' function calls, etc.) + +'$(or CONDITION1[,CONDITION2[,CONDITION3...]])' + The 'or' function provides a "short-circuiting" OR operation. Each + argument is expanded, in order. If an argument expands to a + non-empty string the processing stops and the result of the + expansion is that string. If, after all arguments are expanded, + all of them are false (empty), then the result of the expansion is + the empty string. + +'$(and CONDITION1[,CONDITION2[,CONDITION3...]])' + The 'and' function provides a "short-circuiting" AND operation. + Each argument is expanded, in order. If an argument expands to an + empty string the processing stops and the result of the expansion + is the empty string. If all arguments expand to a non-empty string + then the result of the expansion is the expansion of the last + argument. + + +File: make.info, Node: Foreach Function, Next: File Function, Prev: Conditional Functions, Up: Functions + +8.5 The 'foreach' Function +========================== + +The 'foreach' function is very different from other functions. It +causes one piece of text to be used repeatedly, each time with a +different substitution performed on it. It resembles the 'for' command +in the shell 'sh' and the 'foreach' command in the C-shell 'csh'. + + The syntax of the 'foreach' function is: + + $(foreach VAR,LIST,TEXT) + +The first two arguments, VAR and LIST, are expanded before anything else +is done; note that the last argument, TEXT, is *not* expanded at the +same time. Then for each word of the expanded value of LIST, the +variable named by the expanded value of VAR is set to that word, and +TEXT is expanded. Presumably TEXT contains references to that variable, +so its expansion will be different each time. + + The result is that TEXT is expanded as many times as there are +whitespace-separated words in LIST. The multiple expansions of TEXT are +concatenated, with spaces between them, to make the result of 'foreach'. + + This simple example sets the variable 'files' to the list of all +files in the directories in the list 'dirs': + + dirs := a b c d + files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)) + + Here TEXT is '$(wildcard $(dir)/*)'. The first repetition finds the +value 'a' for 'dir', so it produces the same result as '$(wildcard +a/*)'; the second repetition produces the result of '$(wildcard b/*)'; +and the third, that of '$(wildcard c/*)'. + + This example has the same result (except for setting 'dirs') as the +following example: + + files := $(wildcard a/* b/* c/* d/*) + + When TEXT is complicated, you can improve readability by giving it a +name, with an additional variable: + + find_files = $(wildcard $(dir)/*) + dirs := a b c d + files := $(foreach dir,$(dirs),$(find_files)) + +Here we use the variable 'find_files' this way. We use plain '=' to +define a recursively-expanding variable, so that its value contains an +actual function call to be re-expanded under the control of 'foreach'; a +simply-expanded variable would not do, since 'wildcard' would be called +only once at the time of defining 'find_files'. + + The 'foreach' function has no permanent effect on the variable VAR; +its value and flavor after the 'foreach' function call are the same as +they were beforehand. The other values which are taken from LIST are in +effect only temporarily, during the execution of 'foreach'. The +variable VAR is a simply-expanded variable during the execution of +'foreach'. If VAR was undefined before the 'foreach' function call, it +is undefined after the call. *Note The Two Flavors of Variables: +Flavors. + + You must take care when using complex variable expressions that +result in variable names because many strange things are valid variable +names, but are probably not what you intended. For example, + + files := $(foreach Esta-escrito-en-espanol!,b c ch,$(find_files)) + +might be useful if the value of 'find_files' references the variable +whose name is 'Esta-escrito-en-espanol!' (es un nombre bastante largo, +no?), but it is more likely to be a mistake. + + +File: make.info, Node: File Function, Next: Call Function, Prev: Foreach Function, Up: Functions + +8.6 The 'file' Function +======================= + +The 'file' function allows the makefile to write to or read from a file. +Two modes of writing are supported: overwrite, where the text is written +to the beginning of the file and any existing content is lost, and +append, where the text is written to the end of the file, preserving the +existing content. In both cases the file is created if it does not +exist. It is a fatal error if the file cannot be opened for writing, or +if the write operation fails. The 'file' function expands to the empty +string when writing to a file. + + When reading from a file, the 'file' function expands to the verbatim +contents of the file, except that the final newline (if there is one) +will be stripped. Attempting to read from a non-existent file expands +to the empty string. + + The syntax of the 'file' function is: + + $(file OP FILENAME[,TEXT]) + + When the 'file' function is evaluated all its arguments are expanded +first, then the file indicated by FILENAME will be opened in the mode +described by OP. + + The operator OP can be '>' to indicate the file will be overwritten +with new content, '>>' to indicate the current contents of the file will +be appended to, or '<' to indicate the contents of the file will be read +in. The FILENAME specifies the file to be written to or read from. +There may optionally be whitespace between the operator and the file +name. + + When reading files, it is an error to provide a TEXT value. + + When writing files, TEXT will be written to the file. If TEXT does +not already end in a newline a final newline will be written (even if +TEXT is the empty string). If the TEXT argument is not given at all, +nothing will be written. + + For example, the 'file' function can be useful if your build system +has a limited command line size and your recipe runs a command that can +accept arguments from a file as well. Many commands use the convention +that an argument prefixed with an '@' specifies a file containing more +arguments. Then you might write your recipe in this way: + + program: $(OBJECTS) + $(file >$@.in,$^) + $(CMD) $(CMDFLAGS) @$@.in + @rm $@.in + + If the command required each argument to be on a separate line of the +input file, you might write your recipe like this: + + program: $(OBJECTS) + $(file >$@.in) $(foreach O,$^,$(file >>$@.in,$O)) + $(CMD) $(CMDFLAGS) @$@.in + @rm $@.in + + +File: make.info, Node: Call Function, Next: Value Function, Prev: File Function, Up: Functions + +8.7 The 'call' Function +======================= + +The 'call' function is unique in that it can be used to create new +parameterized functions. You can write a complex expression as the +value of a variable, then use 'call' to expand it with different values. + + The syntax of the 'call' function is: + + $(call VARIABLE,PARAM,PARAM,...) + + When 'make' expands this function, it assigns each PARAM to temporary +variables '$(1)', '$(2)', etc. The variable '$(0)' will contain +VARIABLE. There is no maximum number of parameter arguments. There is +no minimum, either, but it doesn't make sense to use 'call' with no +parameters. + + Then VARIABLE is expanded as a 'make' variable in the context of +these temporary assignments. Thus, any reference to '$(1)' in the value +of VARIABLE will resolve to the first PARAM in the invocation of 'call'. + + Note that VARIABLE is the _name_ of a variable, not a _reference_ to +that variable. Therefore you would not normally use a '$' or +parentheses when writing it. (You can, however, use a variable +reference in the name if you want the name not to be a constant.) + + If VARIABLE is the name of a built-in function, the built-in function +is always invoked (even if a 'make' variable by that name also exists). + + The 'call' function expands the PARAM arguments before assigning them +to temporary variables. This means that VARIABLE values containing +references to built-in functions that have special expansion rules, like +'foreach' or 'if', may not work as you expect. + + Some examples may make this clearer. + + This macro simply reverses its arguments: + + reverse = $(2) $(1) + + foo = $(call reverse,a,b) + +Here FOO will contain 'b a'. + + This one is slightly more interesting: it defines a macro to search +for the first instance of a program in 'PATH': + + pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH))))) + + LS := $(call pathsearch,ls) + +Now the variable LS contains '/bin/ls' or similar. + + The 'call' function can be nested. Each recursive invocation gets +its own local values for '$(1)', etc. that mask the values of +higher-level 'call'. For example, here is an implementation of a "map" +function: + + map = $(foreach a,$(2),$(call $(1),$(a))) + + Now you can MAP a function that normally takes only one argument, +such as 'origin', to multiple values in one step: + + o = $(call map,origin,o map MAKE) + + and end up with O containing something like 'file file default'. + + A final caution: be careful when adding whitespace to the arguments +to 'call'. As with other functions, any whitespace contained in the +second and subsequent arguments is kept; this can cause strange effects. +It's generally safest to remove all extraneous whitespace when providing +parameters to 'call'. + + +File: make.info, Node: Value Function, Next: Eval Function, Prev: Call Function, Up: Functions + +8.8 The 'value' Function +======================== + +The 'value' function provides a way for you to use the value of a +variable _without_ having it expanded. Please note that this does not +undo expansions which have already occurred; for example if you create a +simply expanded variable its value is expanded during the definition; in +that case the 'value' function will return the same result as using the +variable directly. + + The syntax of the 'value' function is: + + $(value VARIABLE) + + Note that VARIABLE is the _name_ of a variable, not a _reference_ to +that variable. Therefore you would not normally use a '$' or +parentheses when writing it. (You can, however, use a variable +reference in the name if you want the name not to be a constant.) + + The result of this function is a string containing the value of +VARIABLE, without any expansion occurring. For example, in this +makefile: + + FOO = $PATH + + all: + @echo $(FOO) + @echo $(value FOO) + +The first output line would be 'ATH', since the "$P" would be expanded +as a 'make' variable, while the second output line would be the current +value of your '$PATH' environment variable, since the 'value' function +avoided the expansion. + + The 'value' function is most often used in conjunction with the +'eval' function (*note Eval Function::). + + +File: make.info, Node: Eval Function, Next: Origin Function, Prev: Value Function, Up: Functions + +8.9 The 'eval' Function +======================= + +The 'eval' function is very special: it allows you to define new +makefile constructs that are not constant; which are the result of +evaluating other variables and functions. The argument to the 'eval' +function is expanded, then the results of that expansion are parsed as +makefile syntax. The expanded results can define new 'make' variables, +targets, implicit or explicit rules, etc. + + The result of the 'eval' function is always the empty string; thus, +it can be placed virtually anywhere in a makefile without causing syntax +errors. + + It's important to realize that the 'eval' argument is expanded +_twice_; first by the 'eval' function, then the results of that +expansion are expanded again when they are parsed as makefile syntax. +This means you may need to provide extra levels of escaping for "$" +characters when using 'eval'. The 'value' function (*note Value +Function::) can sometimes be useful in these situations, to circumvent +unwanted expansions. + + Here is an example of how 'eval' can be used; this example combines a +number of concepts and other functions. Although it might seem overly +complex to use 'eval' in this example, rather than just writing out the +rules, consider two things: first, the template definition (in +'PROGRAM_template') could need to be much more complex than it is here; +and second, you might put the complex, "generic" part of this example +into another makefile, then include it in all the individual makefiles. +Now your individual makefiles are quite straightforward. + + PROGRAMS = server client + + server_OBJS = server.o server_priv.o server_access.o + server_LIBS = priv protocol + + client_OBJS = client.o client_api.o client_mem.o + client_LIBS = protocol + + # Everything after this is generic + + .PHONY: all + all: $(PROGRAMS) + + define PROGRAM_template = + $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) + ALL_OBJS += $$($(1)_OBJS) + endef + + $(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog)))) + + $(PROGRAMS): + $(LINK.o) $^ $(LDLIBS) -o $@ + + clean: + rm -f $(ALL_OBJS) $(PROGRAMS) + + +File: make.info, Node: Origin Function, Next: Flavor Function, Prev: Eval Function, Up: Functions + +8.10 The 'origin' Function +========================== + +The 'origin' function is unlike most other functions in that it does not +operate on the values of variables; it tells you something _about_ a +variable. Specifically, it tells you where it came from. + + The syntax of the 'origin' function is: + + $(origin VARIABLE) + + Note that VARIABLE is the _name_ of a variable to inquire about, not +a _reference_ to that variable. Therefore you would not normally use a +'$' or parentheses when writing it. (You can, however, use a variable +reference in the name if you want the name not to be a constant.) + + The result of this function is a string telling you how the variable +VARIABLE was defined: + +'undefined' + + if VARIABLE was never defined. + +'default' + + if VARIABLE has a default definition, as is usual with 'CC' and so + on. *Note Variables Used by Implicit Rules: Implicit Variables. + Note that if you have redefined a default variable, the 'origin' + function will return the origin of the later definition. + +'environment' + + if VARIABLE was inherited from the environment provided to 'make'. + +'environment override' + + if VARIABLE was inherited from the environment provided to 'make', + and is overriding a setting for VARIABLE in the makefile as a + result of the '-e' option (*note Summary of Options: Options + Summary.). + +'file' + + if VARIABLE was defined in a makefile. + +'command line' + + if VARIABLE was defined on the command line. + +'override' + + if VARIABLE was defined with an 'override' directive in a makefile + (*note The 'override' Directive: Override Directive.). + +'automatic' + + if VARIABLE is an automatic variable defined for the execution of + the recipe for each rule (*note Automatic Variables::). + + This information is primarily useful (other than for your curiosity) +to determine if you want to believe the value of a variable. For +example, suppose you have a makefile 'foo' that includes another +makefile 'bar'. You want a variable 'bletch' to be defined in 'bar' if +you run the command 'make -f bar', even if the environment contains a +definition of 'bletch'. However, if 'foo' defined 'bletch' before +including 'bar', you do not want to override that definition. This +could be done by using an 'override' directive in 'foo', giving that +definition precedence over the later definition in 'bar'; unfortunately, +the 'override' directive would also override any command line +definitions. So, 'bar' could include: + + ifdef bletch + ifeq "$(origin bletch)" "environment" + bletch = barf, gag, etc. + endif + endif + +If 'bletch' has been defined from the environment, this will redefine +it. + + If you want to override a previous definition of 'bletch' if it came +from the environment, even under '-e', you could instead write: + + ifneq "$(findstring environment,$(origin bletch))" "" + bletch = barf, gag, etc. + endif + + Here the redefinition takes place if '$(origin bletch)' returns +either 'environment' or 'environment override'. *Note Functions for +String Substitution and Analysis: Text Functions. + + +File: make.info, Node: Flavor Function, Next: Make Control Functions, Prev: Origin Function, Up: Functions + +8.11 The 'flavor' Function +========================== + +The 'flavor' function, like the 'origin' function, does not operate on +the values of variables but rather it tells you something _about_ a +variable. Specifically, it tells you the flavor of a variable (*note +The Two Flavors of Variables: Flavors.). + + The syntax of the 'flavor' function is: + + $(flavor VARIABLE) + + Note that VARIABLE is the _name_ of a variable to inquire about, not +a _reference_ to that variable. Therefore you would not normally use a +'$' or parentheses when writing it. (You can, however, use a variable +reference in the name if you want the name not to be a constant.) + + The result of this function is a string that identifies the flavor of +the variable VARIABLE: + +'undefined' + + if VARIABLE was never defined. + +'recursive' + + if VARIABLE is a recursively expanded variable. + +'simple' + + if VARIABLE is a simply expanded variable. + + +File: make.info, Node: Make Control Functions, Next: Shell Function, Prev: Flavor Function, Up: Functions + +8.12 Functions That Control Make +================================ + +These functions control the way make runs. Generally, they are used to +provide information to the user of the makefile or to cause make to stop +if some sort of environmental error is detected. + +'$(error TEXT...)' + Generates a fatal error where the message is TEXT. Note that the + error is generated whenever this function is evaluated. So, if you + put it inside a recipe or on the right side of a recursive variable + assignment, it won't be evaluated until later. The TEXT will be + expanded before the error is generated. + + For example, + + ifdef ERROR1 + $(error error is $(ERROR1)) + endif + + will generate a fatal error during the read of the makefile if the + 'make' variable 'ERROR1' is defined. Or, + + ERR = $(error found an error!) + + .PHONY: err + err: ; $(ERR) + + will generate a fatal error while 'make' is running, if the 'err' + target is invoked. + +'$(warning TEXT...)' + This function works similarly to the 'error' function, above, + except that 'make' doesn't exit. Instead, TEXT is expanded and the + resulting message is displayed, but processing of the makefile + continues. + + The result of the expansion of this function is the empty string. + +'$(info TEXT...)' + This function does nothing more than print its (expanded) + argument(s) to standard output. No makefile name or line number is + added. The result of the expansion of this function is the empty + string. + + +File: make.info, Node: Shell Function, Next: Guile Function, Prev: Make Control Functions, Up: Functions + +8.13 The 'shell' Function +========================= + +The 'shell' function is unlike any other function other than the +'wildcard' function (*note The Function 'wildcard': Wildcard Function.) +in that it communicates with the world outside of 'make'. + + The 'shell' function performs the same function that backquotes ('`') +perform in most shells: it does "command expansion". This means that it +takes as an argument a shell command and evaluates to the output of the +command. The only processing 'make' does on the result is to convert +each newline (or carriage-return / newline pair) to a single space. If +there is a trailing (carriage-return and) newline it will simply be +removed. + + The commands run by calls to the 'shell' function are run when the +function calls are expanded (*note How 'make' Reads a Makefile: Reading +Makefiles.). Because this function involves spawning a new shell, you +should carefully consider the performance implications of using the +'shell' function within recursively expanded variables vs. simply +expanded variables (*note The Two Flavors of Variables: Flavors.). + + After the 'shell' function or '!=' assignment operator is used, its +exit status is placed in the '.SHELLSTATUS' variable. + + Here are some examples of the use of the 'shell' function: + + contents := $(shell cat foo) + +sets 'contents' to the contents of the file 'foo', with a space (rather +than a newline) separating each line. + + files := $(shell echo *.c) + +sets 'files' to the expansion of '*.c'. Unless 'make' is using a very +strange shell, this has the same result as '$(wildcard *.c)' (as long as +at least one '.c' file exists). + + +File: make.info, Node: Guile Function, Prev: Shell Function, Up: Functions + +8.14 The 'guile' Function +========================= + +If GNU 'make' is built with support for GNU Guile as an embedded +extension language then the 'guile' function will be available. The +'guile' function takes one argument which is first expanded by 'make' in +the normal fashion, then passed to the GNU Guile evaluator. The result +of the evaluator is converted into a string and used as the expansion of +the 'guile' function in the makefile. See *note GNU Guile Integration: +Guile Integration. for details on writing extensions to 'make' in Guile. + + You can determine whether GNU Guile support is available by checking +the '.FEATURES' variable for the word GUILE. + + +File: make.info, Node: Running, Next: Implicit Rules, Prev: Functions, Up: Top + +9 How to Run 'make' +******************* + +A makefile that says how to recompile a program can be used in more than +one way. The simplest use is to recompile every file that is out of +date. Usually, makefiles are written so that if you run 'make' with no +arguments, it does just that. + + But you might want to update only some of the files; you might want +to use a different compiler or different compiler options; you might +want just to find out which files are out of date without changing them. + + By giving arguments when you run 'make', you can do any of these +things and many others. + + The exit status of 'make' is always one of three values: +'0' + The exit status is zero if 'make' is successful. +'2' + The exit status is two if 'make' encounters any errors. It will + print messages describing the particular errors. +'1' + The exit status is one if you use the '-q' flag and 'make' + determines that some target is not already up to date. *Note + Instead of Executing Recipes: Instead of Execution. + +* Menu: + +* Makefile Arguments:: How to specify which makefile to use. +* Goals:: How to use goal arguments to specify which + parts of the makefile to use. +* Instead of Execution:: How to use mode flags to specify what + kind of thing to do with the recipes + in the makefile other than simply + execute them. +* Avoiding Compilation:: How to avoid recompiling certain files. +* Overriding:: How to override a variable to specify + an alternate compiler and other things. +* Testing:: How to proceed past some errors, to + test compilation. +* Options Summary:: Summary of Options + + +File: make.info, Node: Makefile Arguments, Next: Goals, Prev: Running, Up: Running + +9.1 Arguments to Specify the Makefile +===================================== + +The way to specify the name of the makefile is with the '-f' or '--file' +option ('--makefile' also works). For example, '-f altmake' says to use +the file 'altmake' as the makefile. + + If you use the '-f' flag several times and follow each '-f' with an +argument, all the specified files are used jointly as makefiles. + + If you do not use the '-f' or '--file' flag, the default is to try +'GNUmakefile', 'makefile', and 'Makefile', in that order, and use the +first of these three which exists or can be made (*note Writing +Makefiles: Makefiles.). + + +File: make.info, Node: Goals, Next: Instead of Execution, Prev: Makefile Arguments, Up: Running + +9.2 Arguments to Specify the Goals +================================== + +The "goals" are the targets that 'make' should strive ultimately to +update. Other targets are updated as well if they appear as +prerequisites of goals, or prerequisites of prerequisites of goals, etc. + + By default, the goal is the first target in the makefile (not +counting targets that start with a period). Therefore, makefiles are +usually written so that the first target is for compiling the entire +program or programs they describe. If the first rule in the makefile +has several targets, only the first target in the rule becomes the +default goal, not the whole list. You can manage the selection of the +default goal from within your makefile using the '.DEFAULT_GOAL' +variable (*note Other Special Variables: Special Variables.). + + You can also specify a different goal or goals with command line +arguments to 'make'. Use the name of the goal as an argument. If you +specify several goals, 'make' processes each of them in turn, in the +order you name them. + + Any target in the makefile may be specified as a goal (unless it +starts with '-' or contains an '=', in which case it will be parsed as a +switch or variable definition, respectively). Even targets not in the +makefile may be specified, if 'make' can find implicit rules that say +how to make them. + + 'Make' will set the special variable 'MAKECMDGOALS' to the list of +goals you specified on the command line. If no goals were given on the +command line, this variable is empty. Note that this variable should be +used only in special circumstances. + + An example of appropriate use is to avoid including '.d' files during +'clean' rules (*note Automatic Prerequisites::), so 'make' won't create +them only to immediately remove them again: + + sources = foo.c bar.c + + ifneq ($(MAKECMDGOALS),clean) + include $(sources:.c=.d) + endif + + One use of specifying a goal is if you want to compile only a part of +the program, or only one of several programs. Specify as a goal each +file that you wish to remake. For example, consider a directory +containing several programs, with a makefile that starts like this: + + .PHONY: all + all: size nm ld ar as + + If you are working on the program 'size', you might want to say +'make size' so that only the files of that program are recompiled. + + Another use of specifying a goal is to make files that are not +normally made. For example, there may be a file of debugging output, or +a version of the program that is compiled specially for testing, which +has a rule in the makefile but is not a prerequisite of the default +goal. + + Another use of specifying a goal is to run the recipe associated with +a phony target (*note Phony Targets::) or empty target (*note Empty +Target Files to Record Events: Empty Targets.). Many makefiles contain +a phony target named 'clean' which deletes everything except source +files. Naturally, this is done only if you request it explicitly with +'make clean'. Following is a list of typical phony and empty target +names. *Note Standard Targets::, for a detailed list of all the +standard target names which GNU software packages use. + +'all' + Make all the top-level targets the makefile knows about. + +'clean' + Delete all files that are normally created by running 'make'. + +'mostlyclean' + Like 'clean', but may refrain from deleting a few files that people + normally don't want to recompile. For example, the 'mostlyclean' + target for GCC does not delete 'libgcc.a', because recompiling it + is rarely necessary and takes a lot of time. + +'distclean' +'realclean' +'clobber' + Any of these targets might be defined to delete _more_ files than + 'clean' does. For example, this would delete configuration files + or links that you would normally create as preparation for + compilation, even if the makefile itself cannot create these files. + +'install' + Copy the executable file into a directory that users typically + search for commands; copy any auxiliary files that the executable + uses into the directories where it will look for them. + +'print' + Print listings of the source files that have changed. + +'tar' + Create a tar file of the source files. + +'shar' + Create a shell archive (shar file) of the source files. + +'dist' + Create a distribution file of the source files. This might be a + tar file, or a shar file, or a compressed version of one of the + above, or even more than one of the above. + +'TAGS' + Update a tags table for this program. + +'check' +'test' + Perform self tests on the program this makefile builds. + + +File: make.info, Node: Instead of Execution, Next: Avoiding Compilation, Prev: Goals, Up: Running + +9.3 Instead of Executing Recipes +================================ + +The makefile tells 'make' how to tell whether a target is up to date, +and how to update each target. But updating the targets is not always +what you want. Certain options specify other activities for 'make'. + +'-n' +'--just-print' +'--dry-run' +'--recon' + + "No-op". Causes 'make' to print the recipes that are needed to + make the targets up to date, but not actually execute them. Note + that some recipes are still executed, even with this flag (*note + How the 'MAKE' Variable Works: MAKE Variable.). Also any recipes + needed to update included makefiles are still executed (*note How + Makefiles Are Remade: Remaking Makefiles.). + +'-t' +'--touch' + + "Touch". Marks targets as up to date without actually changing + them. In other words, 'make' pretends to update the targets but + does not really change their contents; instead only their modified + times are updated. + +'-q' +'--question' + + "Question". Silently check whether the targets are up to date, but + do not execute recipes; the exit code shows whether any updates are + needed. + +'-W FILE' +'--what-if=FILE' +'--assume-new=FILE' +'--new-file=FILE' + + "What if". Each '-W' flag is followed by a file name. The given + files' modification times are recorded by 'make' as being the + present time, although the actual modification times remain the + same. You can use the '-W' flag in conjunction with the '-n' flag + to see what would happen if you were to modify specific files. + + With the '-n' flag, 'make' prints the recipe that it would normally +execute but usually does not execute it. + + With the '-t' flag, 'make' ignores the recipes in the rules and uses +(in effect) the command 'touch' for each target that needs to be remade. +The 'touch' command is also printed, unless '-s' or '.SILENT' is used. +For speed, 'make' does not actually invoke the program 'touch'. It does +the work directly. + + With the '-q' flag, 'make' prints nothing and executes no recipes, +but the exit status code it returns is zero if and only if the targets +to be considered are already up to date. If the exit status is one, +then some updating needs to be done. If 'make' encounters an error, the +exit status is two, so you can distinguish an error from a target that +is not up to date. + + It is an error to use more than one of these three flags in the same +invocation of 'make'. + + The '-n', '-t', and '-q' options do not affect recipe lines that +begin with '+' characters or contain the strings '$(MAKE)' or '${MAKE}'. +Note that only the line containing the '+' character or the strings +'$(MAKE)' or '${MAKE}' is run regardless of these options. Other lines +in the same rule are not run unless they too begin with '+' or contain +'$(MAKE)' or '${MAKE}' (*Note How the 'MAKE' Variable Works: MAKE +Variable.) + + The '-t' flag prevents phony targets (*note Phony Targets::) from +being updated, unless there are recipe lines beginning with '+' or +containing '$(MAKE)' or '${MAKE}'. + + The '-W' flag provides two features: + + * If you also use the '-n' or '-q' flag, you can see what 'make' + would do if you were to modify some files. + + * Without the '-n' or '-q' flag, when 'make' is actually executing + recipes, the '-W' flag can direct 'make' to act as if some files + had been modified, without actually running the recipes for those + files. + + Note that the options '-p' and '-v' allow you to obtain other +information about 'make' or about the makefiles in use (*note Summary of +Options: Options Summary.). + + +File: make.info, Node: Avoiding Compilation, Next: Overriding, Prev: Instead of Execution, Up: Running + +9.4 Avoiding Recompilation of Some Files +======================================== + +Sometimes you may have changed a source file but you do not want to +recompile all the files that depend on it. For example, suppose you add +a macro or a declaration to a header file that many other files depend +on. Being conservative, 'make' assumes that any change in the header +file requires recompilation of all dependent files, but you know that +they do not need to be recompiled and you would rather not waste the +time waiting for them to compile. + + If you anticipate the problem before changing the header file, you +can use the '-t' flag. This flag tells 'make' not to run the recipes in +the rules, but rather to mark the target up to date by changing its +last-modification date. You would follow this procedure: + + 1. Use the command 'make' to recompile the source files that really + need recompilation, ensuring that the object files are up-to-date + before you begin. + + 2. Make the changes in the header files. + + 3. Use the command 'make -t' to mark all the object files as up to + date. The next time you run 'make', the changes in the header + files will not cause any recompilation. + + If you have already changed the header file at a time when some files +do need recompilation, it is too late to do this. Instead, you can use +the '-o FILE' flag, which marks a specified file as "old" (*note Summary +of Options: Options Summary.). This means that the file itself will not +be remade, and nothing else will be remade on its account. Follow this +procedure: + + 1. Recompile the source files that need compilation for reasons + independent of the particular header file, with 'make -o + HEADERFILE'. If several header files are involved, use a separate + '-o' option for each header file. + + 2. Touch all the object files with 'make -t'. + + +File: make.info, Node: Overriding, Next: Testing, Prev: Avoiding Compilation, Up: Running + +9.5 Overriding Variables +======================== + +An argument that contains '=' specifies the value of a variable: 'V=X' +sets the value of the variable V to X. If you specify a value in this +way, all ordinary assignments of the same variable in the makefile are +ignored; we say they have been "overridden" by the command line +argument. + + The most common way to use this facility is to pass extra flags to +compilers. For example, in a properly written makefile, the variable +'CFLAGS' is included in each recipe that runs the C compiler, so a file +'foo.c' would be compiled something like this: + + cc -c $(CFLAGS) foo.c + + Thus, whatever value you set for 'CFLAGS' affects each compilation +that occurs. The makefile probably specifies the usual value for +'CFLAGS', like this: + + CFLAGS=-g + + Each time you run 'make', you can override this value if you wish. +For example, if you say 'make CFLAGS='-g -O'', each C compilation will +be done with 'cc -c -g -O'. (This also illustrates how you can use +quoting in the shell to enclose spaces and other special characters in +the value of a variable when you override it.) + + The variable 'CFLAGS' is only one of many standard variables that +exist just so that you can change them this way. *Note Variables Used +by Implicit Rules: Implicit Variables, for a complete list. + + You can also program the makefile to look at additional variables of +your own, giving the user the ability to control other aspects of how +the makefile works by changing the variables. + + When you override a variable with a command line argument, you can +define either a recursively-expanded variable or a simply-expanded +variable. The examples shown above make a recursively-expanded +variable; to make a simply-expanded variable, write ':=' or '::=' +instead of '='. But, unless you want to include a variable reference or +function call in the _value_ that you specify, it makes no difference +which kind of variable you create. + + There is one way that the makefile can change a variable that you +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.). + diff --git a/third_party/make/doc/make.info-2 b/third_party/make/doc/make.info-2 new file mode 100644 index 00000000000..8af29d7f8b7 --- /dev/null +++ b/third_party/make/doc/make.info-2 @@ -0,0 +1,6463 @@ +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.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, 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, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being "A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + "GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: "You have the freedom to copy and + modify this GNU manual. Buying copies from the FSF supports it in + developing GNU and promoting software freedom." +INFO-DIR-SECTION Software development +START-INFO-DIR-ENTRY +* Make: (make). Remake files automatically. +END-INFO-DIR-ENTRY + + +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. + + +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. + + +File: make.info, Node: Implicit Rules, Next: Archives, Prev: Running, Up: Top + +10 Using Implicit Rules +*********************** + +Certain standard ways of remaking target files are used very often. For +example, one customary way to make an object file is from a C source +file using the C compiler, 'cc'. + + "Implicit rules" tell 'make' how to use customary techniques so that +you do not have to specify them in detail when you want to use them. +For example, there is an implicit rule for C compilation. File names +determine which implicit rules are run. For example, C compilation +typically takes a '.c' file and makes a '.o' file. So 'make' applies +the implicit rule for C compilation when it sees this combination of +file name endings. + + A chain of implicit rules can apply in sequence; for example, 'make' +will remake a '.o' file from a '.y' file by way of a '.c' file. + + The built-in implicit rules use several variables in their recipes so +that, by changing the values of the variables, you can change the way +the implicit rule works. For example, the variable 'CFLAGS' controls +the flags given to the C compiler by the implicit rule for C +compilation. + + You can define your own implicit rules by writing "pattern rules". + + "Suffix rules" are a more limited way to define implicit rules. +Pattern rules are more general and clearer, but suffix rules are +retained for compatibility. + +* Menu: + +* Using Implicit:: How to use an existing implicit rule + to get the recipes for updating a file. +* Catalogue of Rules:: A list of built-in rules. +* Implicit Variables:: How to change what predefined rules do. +* Chained Rules:: How to use a chain of implicit rules. +* Pattern Rules:: How to define new implicit rules. +* Last Resort:: How to define a recipe for rules which + cannot find any. +* Suffix Rules:: The old-fashioned style of implicit rule. +* Implicit Rule Search:: The precise algorithm for applying + implicit rules. + + +File: make.info, Node: Using Implicit, Next: Catalogue of Rules, Prev: Implicit Rules, Up: Implicit Rules + +10.1 Using Implicit Rules +========================= + +To allow 'make' to find a customary method for updating a target file, +all you have to do is refrain from specifying recipes yourself. Either +write a rule with no recipe, or don't write a rule at all. Then 'make' +will figure out which implicit rule to use based on which kind of source +file exists or can be made. + + For example, suppose the makefile looks like this: + + foo : foo.o bar.o + cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS) + +Because you mention 'foo.o' but do not give a rule for it, 'make' will +automatically look for an implicit rule that tells how to update it. +This happens whether or not the file 'foo.o' currently exists. + + If an implicit rule is found, it can supply both a recipe and one or +more prerequisites (the source files). You would want to write a rule +for 'foo.o' with no recipe if you need to specify additional +prerequisites, such as header files, that the implicit rule cannot +supply. + + Each implicit rule has a target pattern and prerequisite patterns. +There may be many implicit rules with the same target pattern. For +example, numerous rules make '.o' files: one, from a '.c' file with the +C compiler; another, from a '.p' file with the Pascal compiler; and so +on. The rule that actually applies is the one whose prerequisites exist +or can be made. So, if you have a file 'foo.c', 'make' will run the C +compiler; otherwise, if you have a file 'foo.p', 'make' will run the +Pascal compiler; and so on. + + Of course, when you write the makefile, you know which implicit rule +you want 'make' to use, and you know it will choose that one because you +know which possible prerequisite files are supposed to exist. *Note +Catalogue of Built-In Rules: Catalogue of Rules, for a catalogue of all +the predefined implicit rules. + + Above, we said an implicit rule applies if the required prerequisites +"exist or can be made". A file "can be made" if it is mentioned +explicitly in the makefile as a target or a prerequisite, or if an +implicit rule can be recursively found for how to make it. When an +implicit prerequisite is the result of another implicit rule, we say +that "chaining" is occurring. *Note Chains of Implicit Rules: Chained +Rules. + + In general, 'make' searches for an implicit rule for each target, and +for each double-colon rule, that has no recipe. A file that is +mentioned only as a prerequisite is considered a target whose rule +specifies nothing, so implicit rule search happens for it. *Note +Implicit Rule Search Algorithm: Implicit Rule Search, for the details of +how the search is done. + + Note that explicit prerequisites do not influence implicit rule +search. For example, consider this explicit rule: + + foo.o: foo.p + +The prerequisite on 'foo.p' does not necessarily mean that 'make' will +remake 'foo.o' according to the implicit rule to make an object file, a +'.o' file, from a Pascal source file, a '.p' file. For example, if +'foo.c' also exists, the implicit rule to make an object file from a C +source file is used instead, because it appears before the Pascal rule +in the list of predefined implicit rules (*note Catalogue of Built-In +Rules: Catalogue of Rules.). + + If you do not want an implicit rule to be used for a target that has +no recipe, you can give that target an empty recipe by writing a +semicolon (*note Defining Empty Recipes: Empty Recipes.). + + +File: make.info, Node: Catalogue of Rules, Next: Implicit Variables, Prev: Using Implicit, Up: Implicit Rules + +10.2 Catalogue of Built-In Rules +================================ + +Here is a catalogue of predefined implicit rules which are always +available unless the makefile explicitly overrides or cancels them. +*Note Canceling Implicit Rules: Canceling Rules, for information on +canceling or overriding an implicit rule. The '-r' or +'--no-builtin-rules' option cancels all predefined rules. + + This manual only documents the default rules available on POSIX-based +operating systems. Other operating systems, such as VMS, Windows, OS/2, +etc. may have different sets of default rules. To see the full list of +default rules and variables available in your version of GNU 'make', run +'make -p' in a directory with no makefile. + + Not all of these rules will always be defined, even when the '-r' +option is not given. Many of the predefined implicit rules are +implemented in 'make' as suffix rules, so which ones will be defined +depends on the "suffix list" (the list of prerequisites of the special +target '.SUFFIXES'). The default suffix list is: '.out', '.a', '.ln', +'.o', '.c', '.cc', '.C', '.cpp', '.p', '.f', '.F', '.m', '.r', '.y', +'.l', '.ym', '.lm', '.s', '.S', '.mod', '.sym', '.def', '.h', '.info', +'.dvi', '.tex', '.texinfo', '.texi', '.txinfo', '.w', '.ch' '.web', +'.sh', '.elc', '.el'. All of the implicit rules described below whose +prerequisites have one of these suffixes are actually suffix rules. If +you modify the suffix list, the only predefined suffix rules in effect +will be those named by one or two of the suffixes that are on the list +you specify; rules whose suffixes fail to be on the list are disabled. +*Note Old-Fashioned Suffix Rules: Suffix Rules, for full details on +suffix rules. + +Compiling C programs + 'N.o' is made automatically from 'N.c' with a recipe of the form + '$(CC) $(CPPFLAGS) $(CFLAGS) -c'. + +Compiling C++ programs + 'N.o' is made automatically from 'N.cc', 'N.cpp', or 'N.C' with a + recipe of the form '$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c'. We + encourage you to use the suffix '.cc' for C++ source files instead + of '.C'. + +Compiling Pascal programs + 'N.o' is made automatically from 'N.p' with the recipe '$(PC) + $(PFLAGS) -c'. + +Compiling Fortran and Ratfor programs + 'N.o' is made automatically from 'N.r', 'N.F' or 'N.f' by running + the Fortran compiler. The precise recipe used is as follows: + + '.f' + '$(FC) $(FFLAGS) -c'. + '.F' + '$(FC) $(FFLAGS) $(CPPFLAGS) -c'. + '.r' + '$(FC) $(FFLAGS) $(RFLAGS) -c'. + +Preprocessing Fortran and Ratfor programs + 'N.f' is made automatically from 'N.r' or 'N.F'. This rule runs + just the preprocessor to convert a Ratfor or preprocessable Fortran + program into a strict Fortran program. The precise recipe used is + as follows: + + '.F' + '$(FC) $(CPPFLAGS) $(FFLAGS) -F'. + '.r' + '$(FC) $(FFLAGS) $(RFLAGS) -F'. + +Compiling Modula-2 programs + 'N.sym' is made from 'N.def' with a recipe of the form '$(M2C) + $(M2FLAGS) $(DEFFLAGS)'. 'N.o' is made from 'N.mod'; the form is: + '$(M2C) $(M2FLAGS) $(MODFLAGS)'. + +Assembling and preprocessing assembler programs + 'N.o' is made automatically from 'N.s' by running the assembler, + 'as'. The precise recipe is '$(AS) $(ASFLAGS)'. + + 'N.s' is made automatically from 'N.S' by running the C + preprocessor, 'cpp'. The precise recipe is '$(CPP) $(CPPFLAGS)'. + +Linking a single object file + 'N' is made automatically from 'N.o' by running the linker (usually + called 'ld') via the C compiler. The precise recipe used is + '$(CC) $(LDFLAGS) N.o $(LOADLIBES) $(LDLIBS)'. + + This rule does the right thing for a simple program with only one + source file. It will also do the right thing if there are multiple + object files (presumably coming from various other source files), + one of which has a name matching that of the executable file. + Thus, + + x: y.o z.o + + when 'x.c', 'y.c' and 'z.c' all exist will execute: + + cc -c x.c -o x.o + cc -c y.c -o y.o + cc -c z.c -o z.o + cc x.o y.o z.o -o x + rm -f x.o + rm -f y.o + rm -f z.o + + In more complicated cases, such as when there is no object file + whose name derives from the executable file name, you must write an + explicit recipe for linking. + + Each kind of file automatically made into '.o' object files will be + automatically linked by using the compiler ('$(CC)', '$(FC)' or + '$(PC)'; the C compiler '$(CC)' is used to assemble '.s' files) + without the '-c' option. This could be done by using the '.o' + object files as intermediates, but it is faster to do the compiling + and linking in one step, so that's how it's done. + +Yacc for C programs + 'N.c' is made automatically from 'N.y' by running Yacc with the + recipe '$(YACC) $(YFLAGS)'. + +Lex for C programs + 'N.c' is made automatically from 'N.l' by running Lex. The actual + recipe is '$(LEX) $(LFLAGS)'. + +Lex for Ratfor programs + 'N.r' is made automatically from 'N.l' by running Lex. The actual + recipe is '$(LEX) $(LFLAGS)'. + + The convention of using the same suffix '.l' for all Lex files + regardless of whether they produce C code or Ratfor code makes it + impossible for 'make' to determine automatically which of the two + languages you are using in any particular case. If 'make' is + called upon to remake an object file from a '.l' file, it must + guess which compiler to use. It will guess the C compiler, because + that is more common. If you are using Ratfor, make sure 'make' + knows this by mentioning 'N.r' in the makefile. Or, if you are + using Ratfor exclusively, with no C files, remove '.c' from the + list of implicit rule suffixes with: + + .SUFFIXES: + .SUFFIXES: .o .r .f .l ... + +Making Lint Libraries from C, Yacc, or Lex programs + 'N.ln' is made from 'N.c' by running 'lint'. The precise recipe is + '$(LINT) $(LINTFLAGS) $(CPPFLAGS) -i'. The same recipe is used on + the C code produced from 'N.y' or 'N.l'. + +TeX and Web + 'N.dvi' is made from 'N.tex' with the recipe '$(TEX)'. 'N.tex' is + made from 'N.web' with '$(WEAVE)', or from 'N.w' (and from 'N.ch' + if it exists or can be made) with '$(CWEAVE)'. 'N.p' is made from + 'N.web' with '$(TANGLE)' and 'N.c' is made from 'N.w' (and from + 'N.ch' if it exists or can be made) with '$(CTANGLE)'. + +Texinfo and Info + 'N.dvi' is made from 'N.texinfo', 'N.texi', or 'N.txinfo', with the + recipe '$(TEXI2DVI) $(TEXI2DVI_FLAGS)'. 'N.info' is made from + 'N.texinfo', 'N.texi', or 'N.txinfo', with the recipe + '$(MAKEINFO) $(MAKEINFO_FLAGS)'. + +RCS + Any file 'N' is extracted if necessary from an RCS file named + either 'N,v' or 'RCS/N,v'. The precise recipe used is + '$(CO) $(COFLAGS)'. 'N' will not be extracted from RCS if it + already exists, even if the RCS file is newer. The rules for RCS + are terminal (*note Match-Anything Pattern Rules: Match-Anything + Rules.), so RCS files cannot be generated from another source; they + must actually exist. + +SCCS + Any file 'N' is extracted if necessary from an SCCS file named + either 's.N' or 'SCCS/s.N'. The precise recipe used is + '$(GET) $(GFLAGS)'. The rules for SCCS are terminal (*note + Match-Anything Pattern Rules: Match-Anything Rules.), so SCCS files + cannot be generated from another source; they must actually exist. + + For the benefit of SCCS, a file 'N' is copied from 'N.sh' and made + executable (by everyone). This is for shell scripts that are + checked into SCCS. Since RCS preserves the execution permission of + a file, you do not need to use this feature with RCS. + + We recommend that you avoid using of SCCS. RCS is widely held to be + superior, and is also free. By choosing free software in place of + comparable (or inferior) proprietary software, you support the free + software movement. + + Usually, you want to change only the variables listed in the table +above, which are documented in the following section. + + However, the recipes in built-in implicit rules actually use +variables such as 'COMPILE.c', 'LINK.p', and 'PREPROCESS.S', whose +values contain the recipes listed above. + + 'make' follows the convention that the rule to compile a '.X' source +file uses the variable 'COMPILE.X'. Similarly, the rule to produce an +executable from a '.X' file uses 'LINK.X'; and the rule to preprocess a +'.X' file uses 'PREPROCESS.X'. + + Every rule that produces an object file uses the variable +'OUTPUT_OPTION'. 'make' defines this variable either to contain '-o +$@', or to be empty, depending on a compile-time option. You need the +'-o' option to ensure that the output goes into the right file when the +source file is in a different directory, as when using 'VPATH' (*note +Directory Search::). However, compilers on some systems do not accept a +'-o' switch for object files. If you use such a system, and use +'VPATH', some compilations will put their output in the wrong place. A +possible workaround for this problem is to give 'OUTPUT_OPTION' the +value '; mv $*.o $@'. + + +File: make.info, Node: Implicit Variables, Next: Chained Rules, Prev: Catalogue of Rules, Up: Implicit Rules + +10.3 Variables Used by Implicit Rules +===================================== + +The recipes in built-in implicit rules make liberal use of certain +predefined variables. You can alter the values of these variables in +the makefile, with arguments to 'make', or in the environment to alter +how the implicit rules work without redefining the rules themselves. +You can cancel all variables used by implicit rules with the '-R' or +'--no-builtin-variables' option. + + For example, the recipe used to compile a C source file actually says +'$(CC) -c $(CFLAGS) $(CPPFLAGS)'. The default values of the variables +used are 'cc' and nothing, resulting in the command 'cc -c'. By +redefining 'CC' to 'ncc', you could cause 'ncc' to be used for all C +compilations performed by the implicit rule. By redefining 'CFLAGS' to +be '-g', you could pass the '-g' option to each compilation. _All_ +implicit rules that do C compilation use '$(CC)' to get the program name +for the compiler and _all_ include '$(CFLAGS)' among the arguments given +to the compiler. + + The variables used in implicit rules fall into two classes: those +that are names of programs (like 'CC') and those that contain arguments +for the programs (like 'CFLAGS'). (The "name of a program" may also +contain some command arguments, but it must start with an actual +executable program name.) If a variable value contains more than one +argument, separate them with spaces. + + The following tables describe of some of the more commonly-used +predefined variables. This list is not exhaustive, and the default +values shown here may not be what 'make' selects for your environment. +To see the complete list of predefined variables for your instance of +GNU 'make' you can run 'make -p' in a directory with no makefiles. + + Here is a table of some of the more common variables used as names of +programs in built-in rules: + +'AR' + Archive-maintaining program; default 'ar'. + +'AS' + Program for compiling assembly files; default 'as'. + +'CC' + Program for compiling C programs; default 'cc'. + +'CXX' + Program for compiling C++ programs; default 'g++'. + +'CPP' + Program for running the C preprocessor, with results to standard + output; default '$(CC) -E'. + +'FC' + Program for compiling or preprocessing Fortran and Ratfor programs; + default 'f77'. + +'M2C' + Program to use to compile Modula-2 source code; default 'm2c'. + +'PC' + Program for compiling Pascal programs; default 'pc'. + +'CO' + Program for extracting a file from RCS; default 'co'. + +'GET' + Program for extracting a file from SCCS; default 'get'. + +'LEX' + Program to use to turn Lex grammars into source code; default + 'lex'. + +'YACC' + Program to use to turn Yacc grammars into source code; default + 'yacc'. + +'LINT' + Program to use to run lint on source code; default 'lint'. + +'MAKEINFO' + Program to convert a Texinfo source file into an Info file; default + 'makeinfo'. + +'TEX' + Program to make TeX DVI files from TeX source; default 'tex'. + +'TEXI2DVI' + Program to make TeX DVI files from Texinfo source; default + 'texi2dvi'. + +'WEAVE' + Program to translate Web into TeX; default 'weave'. + +'CWEAVE' + Program to translate C Web into TeX; default 'cweave'. + +'TANGLE' + Program to translate Web into Pascal; default 'tangle'. + +'CTANGLE' + Program to translate C Web into C; default 'ctangle'. + +'RM' + Command to remove a file; default 'rm -f'. + + Here is a table of variables whose values are additional arguments +for the programs above. The default values for all of these is the +empty string, unless otherwise noted. + +'ARFLAGS' + Flags to give the archive-maintaining program; default 'rv'. + +'ASFLAGS' + Extra flags to give to the assembler (when explicitly invoked on a + '.s' or '.S' file). + +'CFLAGS' + Extra flags to give to the C compiler. + +'CXXFLAGS' + Extra flags to give to the C++ compiler. + +'COFLAGS' + Extra flags to give to the RCS 'co' program. + +'CPPFLAGS' + Extra flags to give to the C preprocessor and programs that use it + (the C and Fortran compilers). + +'FFLAGS' + Extra flags to give to the Fortran compiler. + +'GFLAGS' + Extra flags to give to the SCCS 'get' program. + +'LDFLAGS' + Extra flags to give to compilers when they are supposed to invoke + the linker, 'ld', such as '-L'. Libraries ('-lfoo') should be + added to the 'LDLIBS' variable instead. + +'LDLIBS' + Library flags or names given to compilers when they are supposed to + invoke the linker, 'ld'. 'LOADLIBES' is a deprecated (but still + supported) alternative to 'LDLIBS'. Non-library linker flags, such + as '-L', should go in the 'LDFLAGS' variable. + +'LFLAGS' + Extra flags to give to Lex. + +'YFLAGS' + Extra flags to give to Yacc. + +'PFLAGS' + Extra flags to give to the Pascal compiler. + +'RFLAGS' + Extra flags to give to the Fortran compiler for Ratfor programs. + +'LINTFLAGS' + Extra flags to give to lint. + + +File: make.info, Node: Chained Rules, Next: Pattern Rules, Prev: Implicit Variables, Up: Implicit Rules + +10.4 Chains of Implicit Rules +============================= + +Sometimes a file can be made by a sequence of implicit rules. For +example, a file 'N.o' could be made from 'N.y' by running first Yacc and +then 'cc'. Such a sequence is called a "chain". + + If the file 'N.c' exists, or is mentioned in the makefile, no special +searching is required: 'make' finds that the object file can be made by +C compilation from 'N.c'; later on, when considering how to make 'N.c', +the rule for running Yacc is used. Ultimately both 'N.c' and 'N.o' are +updated. + + However, even if 'N.c' does not exist and is not mentioned, 'make' +knows how to envision it as the missing link between 'N.o' and 'N.y'! +In this case, 'N.c' is called an "intermediate file". Once 'make' has +decided to use the intermediate file, it is entered in the data base as +if it had been mentioned in the makefile, along with the implicit rule +that says how to create it. + + Intermediate files are remade using their rules just like all other +files. But intermediate files are treated differently in two ways. + + The first difference is what happens if the intermediate file does +not exist. If an ordinary file B does not exist, and 'make' considers a +target that depends on B, it invariably creates B and then updates the +target from B. But if B is an intermediate file, then 'make' can leave +well enough alone. It won't bother updating B, or the ultimate target, +unless some prerequisite of B is newer than that target or there is some +other reason to update that target. + + The second difference is that if 'make' _does_ create B in order to +update something else, it deletes B later on after it is no longer +needed. Therefore, an intermediate file which did not exist before +'make' also does not exist after 'make'. 'make' reports the deletion to +you by printing a 'rm -f' command showing which file it is deleting. + + Ordinarily, a file cannot be intermediate if it is mentioned in the +makefile as a target or prerequisite. However, you can explicitly mark +a file as intermediate by listing it as a prerequisite of the special +target '.INTERMEDIATE'. This takes effect even if the file is mentioned +explicitly in some other way. + + You can prevent automatic deletion of an intermediate file by marking +it as a "secondary" file. To do this, list it as a prerequisite of the +special target '.SECONDARY'. When a file is secondary, 'make' will not +create the file merely because it does not already exist, but 'make' +does not automatically delete the file. Marking a file as secondary +also marks it as intermediate. + + You can list the target pattern of an implicit rule (such as '%.o') +as a prerequisite of the special target '.PRECIOUS' to preserve +intermediate files made by implicit rules whose target patterns match +that file's name; see *note Interrupts::. + + A chain can involve more than two implicit rules. For example, it is +possible to make a file 'foo' from 'RCS/foo.y,v' by running RCS, Yacc +and 'cc'. Then both 'foo.y' and 'foo.c' are intermediate files that are +deleted at the end. + + No single implicit rule can appear more than once in a chain. This +means that 'make' will not even consider such a ridiculous thing as +making 'foo' from 'foo.o.o' by running the linker twice. This +constraint has the added benefit of preventing any infinite loop in the +search for an implicit rule chain. + + There are some special implicit rules to optimize certain cases that +would otherwise be handled by rule chains. For example, making 'foo' +from 'foo.c' could be handled by compiling and linking with separate +chained rules, using 'foo.o' as an intermediate file. But what actually +happens is that a special rule for this case does the compilation and +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::). + + +File: make.info, Node: Pattern Rules, Next: Last Resort, Prev: Chained Rules, Up: Implicit Rules + +10.5 Defining and Redefining Pattern Rules +========================================== + +You define an implicit rule by writing a "pattern rule". A pattern rule +looks like an ordinary rule, except that its target contains the +character '%' (exactly one of them). The target is considered a pattern +for matching file names; the '%' can match any nonempty substring, while +other characters match only themselves. The prerequisites likewise use +'%' to show how their names relate to the target name. + + Thus, a pattern rule '%.o : %.c' says how to make any file 'STEM.o' +from another file 'STEM.c'. + + Note that expansion using '%' in pattern rules occurs *after* any +variable or function expansions, which take place when the makefile is +read. *Note How to Use Variables: Using Variables, and *note Functions +for Transforming Text: Functions. + +* Menu: + +* Pattern Intro:: An introduction to pattern rules. +* Pattern Examples:: Examples of pattern rules. +* Automatic Variables:: How to use automatic variables in the + recipe of implicit rules. +* Pattern Match:: How patterns match. +* Match-Anything Rules:: Precautions you should take prior to + defining rules that can match any + target file whatever. +* Canceling Rules:: How to override or cancel built-in rules. + + +File: make.info, Node: Pattern Intro, Next: Pattern Examples, Prev: Pattern Rules, Up: Pattern Rules + +10.5.1 Introduction to Pattern Rules +------------------------------------ + +A pattern rule contains the character '%' (exactly one of them) in the +target; otherwise, it looks exactly like an ordinary rule. The target +is a pattern for matching file names; the '%' matches any nonempty +substring, while other characters match only themselves. + + For example, '%.c' as a pattern matches any file name that ends in +'.c'. 's.%.c' as a pattern matches any file name that starts with 's.', +ends in '.c' and is at least five characters long. (There must be at +least one character to match the '%'.) The substring that the '%' +matches is called the "stem". + + '%' in a prerequisite of a pattern rule stands for the same stem that +was matched by the '%' in the target. In order for the pattern rule to +apply, its target pattern must match the file name under consideration +and all of its prerequisites (after pattern substitution) must name +files that exist or can be made. These files become prerequisites of +the target. + + Thus, a rule of the form + + %.o : %.c ; RECIPE... + +specifies how to make a file 'N.o', with another file 'N.c' as its +prerequisite, provided that 'N.c' exists or can be made. + + There may also be prerequisites that do not use '%'; such a +prerequisite attaches to every file made by this pattern rule. These +unvarying prerequisites are useful occasionally. + + A pattern rule need not have any prerequisites that contain '%', or +in fact any prerequisites at all. Such a rule is effectively a general +wildcard. It provides a way to make any file that matches the target +pattern. *Note Last Resort::. + + More than one pattern rule may match a target. In this case 'make' +will choose the "best fit" rule. *Note How Patterns Match: Pattern +Match. + + 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. + + +File: make.info, Node: Pattern Examples, Next: Automatic Variables, Prev: Pattern Intro, Up: Pattern Rules + +10.5.2 Pattern Rule Examples +---------------------------- + +Here are some examples of pattern rules actually predefined in 'make'. +First, the rule that compiles '.c' files into '.o' files: + + %.o : %.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ + +defines a rule that can make any file 'X.o' from 'X.c'. The recipe uses +the automatic variables '$@' and '$<' to substitute the names of the +target file and the source file in each case where the rule applies +(*note Automatic Variables::). + + Here is a second built-in rule: + + % :: RCS/%,v + $(CO) $(COFLAGS) $< + +defines a rule that can make any file 'X' whatsoever from a +corresponding file 'X,v' in the sub-directory 'RCS'. Since the target +is '%', this rule will apply to any file whatever, provided the +appropriate prerequisite file exists. The double colon makes the rule +"terminal", which means that its prerequisite may not be an intermediate +file (*note Match-Anything Pattern Rules: Match-Anything Rules.). + + This pattern rule has two targets: + + %.tab.c %.tab.h: %.y + bison -d $< + +This tells 'make' that the recipe 'bison -d X.y' will make both +'X.tab.c' and 'X.tab.h'. If the file 'foo' depends on the files +'parse.tab.o' and 'scan.o' and the file 'scan.o' depends on the file +'parse.tab.h', when 'parse.y' is changed, the recipe 'bison -d parse.y' +will be executed only once, and the prerequisites of both 'parse.tab.o' +and 'scan.o' will be satisfied. (Presumably the file 'parse.tab.o' will +be recompiled from 'parse.tab.c' and the file 'scan.o' from 'scan.c', +while 'foo' is linked from 'parse.tab.o', 'scan.o', and its other +prerequisites, and it will execute happily ever after.) + + +File: make.info, Node: Automatic Variables, Next: Pattern Match, Prev: Pattern Examples, Up: Pattern Rules + +10.5.3 Automatic Variables +-------------------------- + +Suppose you are writing a pattern rule to compile a '.c' file into a +'.o' file: how do you write the 'cc' command so that it operates on the +right source file name? You cannot write the name in the recipe, +because the name is different each time the implicit rule is applied. + + What you do is use a special feature of 'make', the "automatic +variables". These variables have values computed afresh for each rule +that is executed, based on the target and prerequisites of the rule. In +this example, you would use '$@' for the object file name and '$<' for +the source file name. + + It's very important that you recognize the limited scope in which +automatic variable values are available: they only have values within +the recipe. In particular, you cannot use them anywhere within the +target list of a rule; they have no value there and will expand to the +empty string. Also, they cannot be accessed directly within the +prerequisite list of a rule. A common mistake is attempting to use '$@' +within the prerequisites list; this will not work. However, there is a +special feature of GNU 'make', secondary expansion (*note Secondary +Expansion::), which will allow automatic variable values to be used in +prerequisite lists. + + Here is a table of automatic variables: + +'$@' + The file name of the target of the rule. If the target is an + archive member, then '$@' is the name of the archive file. In a + pattern rule that has multiple targets (*note Introduction to + Pattern Rules: Pattern Intro.), '$@' is the name of whichever + target caused the rule's recipe to be run. + +'$%' + The target member name, when the target is an archive member. + *Note Archives::. For example, if the target is 'foo.a(bar.o)' + then '$%' is 'bar.o' and '$@' is 'foo.a'. '$%' is empty when the + target is not an archive member. + +'$<' + The name of the first prerequisite. If the target got its recipe + from an implicit rule, this will be the first prerequisite added by + the implicit rule (*note Implicit Rules::). + +'$?' + The names of all the prerequisites that are newer than the target, + 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 + prerequisites which are archive members, only the named member is + used (*note Archives::). A target has only one prerequisite on + each other file it depends on, no matter how many times each file + is listed as a prerequisite. So if you list a prerequisite more + than once for a target, the value of '$^' contains just one copy of + the name. This list does *not* contain any of the order-only + prerequisites; for those see the '$|' variable, below. + +'$+' + This is like '$^', but prerequisites listed more than once are + duplicated in the order they were listed in the makefile. This is + primarily useful for use in linking commands where it is meaningful + to repeat library file names in a particular order. + +'$|' + The names of all the order-only prerequisites, with spaces between + them. + +'$*' + The stem with which an implicit rule matches (*note How Patterns + Match: Pattern Match.). If the target is 'dir/a.foo.b' and the + target pattern is 'a.%.b' then the stem is 'dir/foo'. The stem is + useful for constructing names of related files. + + In a static pattern rule, the stem is part of the file name that + matched the '%' in the target pattern. + + In an explicit rule, there is no stem; so '$*' cannot be determined + in that way. Instead, if the target name ends with a recognized + suffix (*note Old-Fashioned Suffix Rules: Suffix Rules.), '$*' is + set to the target name minus the suffix. For example, if the + target name is 'foo.c', then '$*' is set to 'foo', since '.c' is a + suffix. GNU 'make' does this bizarre thing only for compatibility + with other implementations of 'make'. You should generally avoid + using '$*' except in implicit rules or static pattern rules. + + If the target name in an explicit rule does not end with a + recognized suffix, '$*' is set to the empty string for that rule. + + '$?' is useful even in explicit rules when you wish to operate on +only the prerequisites that have changed. For example, suppose that an +archive named 'lib' is supposed to contain copies of several object +files. This rule copies just the changed object files into the archive: + + lib: foo.o bar.o lose.o win.o + ar r lib $? + + 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 '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 + trailing slash removed. If the value of '$@' is 'dir/foo.o' then + '$(@D)' is 'dir'. This value is '.' if '$@' does not contain a + slash. + +'$(@F)' + The file-within-directory part of the file name of the target. If + the value of '$@' is 'dir/foo.o' then '$(@F)' is 'foo.o'. '$(@F)' + is equivalent to '$(notdir $@)'. + +'$(*D)' +'$(*F)' + The directory part and the file-within-directory part of the stem; + 'dir' and 'foo' in this example. + +'$(%D)' +'$(%F)' + The directory part and the file-within-directory part of the target + archive member name. This makes sense only for archive member + targets of the form 'ARCHIVE(MEMBER)' and is useful only when + MEMBER may contain a directory name. (*Note Archive Members as + Targets: Archive Members.) + +'$( + #include + #include + #include + #include + #include + + #include + + int plugin_is_GPL_compatible; + + char * + gen_tmpfile(const char *nm, int argc, char **argv) + { + int fd; + + /* Compute the size of the filename and allocate space for it. */ + int len = strlen (argv[0]) + 6 + 1; + char *buf = gmk_alloc (len); + + strcpy (buf, argv[0]); + strcat (buf, "XXXXXX"); + + fd = mkstemp(buf); + if (fd >= 0) + { + /* Don't leak the file descriptor. */ + close (fd); + return buf; + } + + /* Failure. */ + fprintf (stderr, "mkstemp(%s) failed: %s\n", buf, strerror (errno)); + gmk_free (buf); + return NULL; + } + + int + mk_temp_gmk_setup () + { + /* Register the function with make name "mk-temp". */ + gmk_add_function ("mk-temp", gen_tmpfile, 1, 1, 1); + return 1; + } + + Next, we will write a makefile that can build this shared object, +load it, and use it: + + all: + @echo Temporary file: $(mk-temp tmpfile.) + + load mk_temp.so + + mk_temp.so: mk_temp.c + $(CC) -shared -fPIC -o $ $< + + On MS-Windows, due to peculiarities of how shared objects are +produced, the compiler needs to scan the "import library" produced when +building 'make', typically called 'libgnumake-VERSION.dll.a', where +VERSION is the version of the load object API. So the recipe to produce +a shared object will look on Windows like this (assuming the API version +is 1): + + mk_temp.dll: mk_temp.c + $(CC) -shared -o $ $< -lgnumake-1 + + Now when you run 'make' you'll see something like: + + $ make + cc -shared -fPIC -o mk_temp.so mk_temp.c + Temporary filename: tmpfile.A7JEwd + + +File: make.info, Node: Integrating make, Next: Features, Prev: Extending make, Up: Top + +13 Integrating GNU 'make' +************************* + +GNU 'make' is often one component in a larger system of tools, including +integrated development environments, compiler toolchains, and others. +The role of 'make' is to start commands and determine whether they +succeeded or not: no special integration is needed to accomplish that. +However, sometimes it is convenient to bind 'make' more tightly with +other parts of the system, both higher-level (tools that invoke 'make') +and lower-level (tools that 'make' invokes). + +* Menu: + +* Job Slots:: Share job slots with GNU 'make'. +* Terminal Output:: Control output to terminals. + + +File: make.info, Node: Job Slots, Next: Terminal Output, Prev: Integrating make, Up: Integrating make + +13.1 Sharing Job Slots with GNU 'make' +====================================== + +GNU 'make' has the ability to run multiple recipes in parallel (*note +Parallel Execution: Parallel.) and to cap the total number of parallel +jobs even across recursive invocations of 'make' (*note Communicating +Options to a Sub-'make': Options/Recursion.). Tools that 'make' invokes +which are also able to run multiple operations in parallel, either using +multiple threads or multiple processes, can be enhanced to participate +in GNU 'make''s job management facility to ensure that the total number +of active threads/processes running on the system does not exceed the +maximum number of slots provided to GNU 'make'. + + GNU 'make' uses a method called the "jobserver" to control the number +of active jobs across recursive invocations. The actual implementation +of the jobserver varies across different operating systems, but some +fundamental aspects are always true. + + First, only command lines that 'make' understands to be recursive +invocations of 'make' (*note How the 'MAKE' Variable Works: MAKE +Variable.) will have access to the jobserver. When writing makefiles +you must be sure to mark the command as recursive (most commonly by +prefixing the command line with the '+' indicator (*note Recursive Use +of 'make': Recursion.). + + Second, 'make' will provide information necessary for accessing the +jobserver through the environment to its children, in the 'MAKEFLAGS' +environment variable. Tools which want to participate in the jobserver +protocol will need to parse this environment variable, as described in +subsequent sections. + + Third, every command 'make' starts has one implicit job slot reserved +for it before it starts. Any tool which wants to participate in the +jobserver protocol should assume it can always run one job without +having to contact the jobserver at all. + + Finally, it's critical that tools that participate in the jobserver +protocol return the exact number of slots they obtained from the +jobserver back to the jobserver before they exit, even under error +conditions. Remember that the implicit job slot should *not* be +returned to the jobserver! Returning too few slots means that those +slots will be lost for the rest of the build process; returning too many +slots means that extra slots will be available. The top-level 'make' +command will print an error message at the end of the build if it +detects an incorrect number of slots available in the jobserver. + + As an example, suppose you are implementing a linker which provides +for multithreaded operation. You would like to enhance the linker so +that if it is invoked by GNU 'make' it can participate in the jobserver +protocol to control how many threads are used during link. First you +will need to modify the linker to determine if the 'MAKEFLAGS' +environment variable is set. Next you will need to parse the value of +that variable to determine if the jobserver is available, and how to +access it. If it is available then you can access it to obtain job +slots controlling how much parallelism your tool can use. Once done +your tool must return those job slots back to the jobserver. + +* Menu: + +* POSIX Jobserver:: Using the jobserver on POSIX systems. +* Windows Jobserver:: Using the jobserver on Windows systems. + + +File: make.info, Node: POSIX Jobserver, Next: Windows Jobserver, Prev: Job Slots, Up: Job Slots + +13.1.1 POSIX Jobserver Interaction +---------------------------------- + +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. 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 +non-negative integers representing file descriptors: 'R' is the read +file descriptor and 'W' is the write file descriptor. + + It's important that when you release the job slot, you write back the +same character you read from the pipe for that slot. Don't assume that +all tokens are the same character; different characters may have +different meanings to GNU 'make'. The order is not important, since +'make' has no idea in what order jobs will complete anyway. + + There are various error conditions you must consider to ensure your +implementation is robust: + + * Usually you will have a command-line argument controlling the + parallel operation of your tool. Consider whether your tool should + detect situations where both the jobserver and the command-line + argument are specified, and how it should react. + + * If your tool determines that the '--jobserver-auth' option is + available in 'MAKEFLAGS' but that the file descriptors specified + are closed, this means that the calling 'make' process did not + think that your tool was a recursive 'make' invocation (e.g., the + command line was not prefixed with a '+' character). You should + notify your users of this situation. + + * Your tool should also examine the first word of the 'MAKEFLAGS' + variable and look for the character 'n'. If this character is + present then 'make' was invoked with the '-n' option and your tool + should stop without performing any operations. + + * Your tool should be sure to write back the tokens it read, even + under error conditions. This includes not only errors in your tool + but also outside influences such as interrupts ('SIGINT'), etc. + You may want to install signal handlers to manage this write-back. + + +File: make.info, Node: Windows Jobserver, Prev: POSIX Jobserver, Up: Job Slots + +13.1.2 Windows Jobserver Interaction +------------------------------------ + +On Windows systems the jobserver is implemented as a named semaphore. +The semaphore will be set with an initial count equal to the number of +available slots; to obtain a slot you must wait on the semaphore (with +or without a timeout). To release a slot, release the semaphore. + + To access the semaphore you must parse the 'MAKEFLAGS' variable and +look for the argument string '--jobserver-auth=NAME' where 'NAME' is the +name of the named semaphore. Use this name with 'OpenSemaphore' to +create a handle to the semaphore. + + There are various error conditions you must consider to ensure your +implementation is robust: + + * Usually you will have a command-line argument controlling the + parallel operation of your tool. Consider whether your tool should + detect situations where both the jobserver and the command-line + argument are specified, and how it should react. + + * Your tool should be sure to release the semaphore for the tokens it + read, even under error conditions. This includes not only errors + in your tool but also outside influences such as interrupts + ('SIGINT'), etc. You may want to install signal handlers to manage + this write-back. + + +File: make.info, Node: Terminal Output, Prev: Job Slots, Up: Integrating make + +13.2 Synchronized Terminal Output +================================= + +Normally GNU 'make' will invoke all commands with access to the same +standard and error outputs that 'make' itself was started with. A +number of tools will detect whether the output is a terminal or +not-a-terminal, and use this information to change the output style. +For example if the output goes to a terminal the tool may add control +characters that set color, or even change the location of the cursor. +If the output is not going to a terminal then these special control +characters are not emitted so that they don't corrupt log files, etc. + + The '--output-sync' (*note Output During Parallel Output: Parallel +Output.) option will defeat the terminal detection. When output +synchronization is enabled GNU 'make' arranges for all command output to +be written to a file, so that its output can be written as a block +without interference from other commands. This means that all tools +invoked by 'make' will believe that their output is not going to be +displayed on a terminal, even when it will be (because 'make' will +display it there after the command is completed). + + In order to facilitate tools which would like to determine whether or +not their output will be displayed on a terminal, GNU 'make' will set +the 'MAKE_TERMOUT' and 'MAKE_TERMERR' environment variables before +invoking any commands. Tools which would like to determine whether +standard or error output (respectively) will be displayed on a terminal +can check these environment variables to determine if they exist and +contain a non-empty value. If so the tool can assume that the output +will (eventually) be displayed on a terminal. If the variables are not +set or have an empty value, then the tool should fall back to its normal +methods of detecting whether output is going to a terminal or not. + + The content of the variables can be parsed to determine the type of +terminal which will be used to display the output. + + Similarly, environments which invoke 'make' and would like to capture +the output and eventually display it on a terminal (or some display +which can interpret terminal control characters) can set these variables +before invoking 'make'. GNU 'make' will not modify these environment +variables if they already exist when it starts. + + +File: make.info, Node: Features, Next: Missing, Prev: Integrating make, Up: Top + +14 Features of GNU 'make' +************************* + +Here is a summary of the features of GNU 'make', for comparison with and +credit to other versions of 'make'. We consider the features of 'make' +in 4.2 BSD systems as a baseline. If you are concerned with writing +portable makefiles, you should not use the features of 'make' listed +here, nor the ones in *note Missing::. + + Many features come from the version of 'make' in System V. + + * The 'VPATH' variable and its special meaning. *Note Searching + Directories for Prerequisites: Directory Search. This feature + exists in System V 'make', but is undocumented. It is documented + in 4.3 BSD 'make' (which says it mimics System V's 'VPATH' + feature). + + * Included makefiles. *Note Including Other Makefiles: Include. + Allowing multiple files to be included with a single directive is a + GNU extension. + + * Variables are read from and communicated via the environment. + *Note Variables from the Environment: Environment. + + * Options passed through the variable 'MAKEFLAGS' to recursive + invocations of 'make'. *Note Communicating Options to a + Sub-'make': Options/Recursion. + + * The automatic variable '$%' is set to the member name in an archive + reference. *Note Automatic Variables::. + + * The automatic variables '$@', '$*', '$<', '$%', and '$?' have + corresponding forms like '$(@F)' and '$(@D)'. We have generalized + this to '$^' as an obvious extension. *Note Automatic Variables::. + + * Substitution variable references. *Note Basics of Variable + References: Reference. + + * The command line options '-b' and '-m', accepted and ignored. In + System V 'make', these options actually do something. + + * Execution of recursive commands to run 'make' via the variable + 'MAKE' even if '-n', '-q' or '-t' is specified. *Note Recursive + Use of 'make': Recursion. + + * Support for suffix '.a' in suffix rules. *Note Archive Suffix + Rules::. This feature is obsolete in GNU 'make', because the + general feature of rule chaining (*note Chains of Implicit Rules: + Chained Rules.) allows one pattern rule for installing members in + an archive (*note Archive Update::) to be sufficient. + + * The arrangement of lines and backslash/newline combinations in + recipes is retained when the recipes are printed, so they appear as + they do in the makefile, except for the stripping of initial + whitespace. + + The following features were inspired by various other versions of +'make'. In some cases it is unclear exactly which versions inspired +which others. + + * Pattern rules using '%'. This has been implemented in several + versions of 'make'. We're not sure who invented it first, but it's + been spread around a bit. *Note Defining and Redefining Pattern + Rules: Pattern Rules. + + * Rule chaining and implicit intermediate files. This was + implemented by Stu Feldman in his version of 'make' for AT&T Eighth + Edition Research Unix, and later by Andrew Hume of AT&T Bell Labs + in his 'mk' program (where he terms it "transitive closure"). We + do not really know if we got this from either of them or thought it + up ourselves at the same time. *Note Chains of Implicit Rules: + Chained Rules. + + * The automatic variable '$^' containing a list of all prerequisites + of the current target. We did not invent this, but we have no idea + who did. *Note Automatic Variables::. The automatic variable '$+' + is a simple extension of '$^'. + + * The "what if" flag ('-W' in GNU 'make') was (as far as we know) + invented by Andrew Hume in 'mk'. *Note Instead of Executing + Recipes: Instead of Execution. + + * The concept of doing several things at once (parallelism) exists in + many incarnations of 'make' and similar programs, though not in the + System V or BSD implementations. *Note Recipe Execution: + Execution. + + * A number of different build tools that support parallelism also + support collecting output and displaying as a single block. *Note + Output During Parallel Execution: Parallel Output. + + * Modified variable references using pattern substitution come from + SunOS 4. *Note Basics of Variable References: Reference. This + functionality was provided in GNU 'make' by the 'patsubst' function + before the alternate syntax was implemented for compatibility with + SunOS 4. It is not altogether clear who inspired whom, since GNU + 'make' had 'patsubst' before SunOS 4 was released. + + * The special significance of '+' characters preceding recipe lines + (*note Instead of Executing Recipes: Instead of Execution.) is + mandated by 'IEEE Standard 1003.2-1992' (POSIX.2). + + * The '+=' syntax to append to the value of a variable comes from + SunOS 4 'make'. *Note Appending More Text to Variables: Appending. + + * The syntax 'ARCHIVE(MEM1 MEM2...)' to list multiple members in a + single archive file comes from SunOS 4 'make'. *Note Archive + Members::. + + * The '-include' directive to include makefiles with no error for a + nonexistent file comes from SunOS 4 'make'. (But note that SunOS 4 + 'make' does not allow multiple makefiles to be specified in one + '-include' directive.) The same feature appears with the name + 'sinclude' in SGI 'make' and perhaps others. + + * The '!=' shell assignment operator exists in many BSD of 'make' and + is purposefully implemented here to behave identically to those + implementations. + + * Various build management tools are implemented using scripting + languages such as Perl or Python and thus provide a natural + embedded scripting language, similar to GNU 'make''s integration of + GNU Guile. + + The remaining features are inventions new in GNU 'make': + + * Use the '-v' or '--version' option to print version and copyright + information. + + * Use the '-h' or '--help' option to summarize the options to 'make'. + + * Simply-expanded variables. *Note The Two Flavors of Variables: + Flavors. + + * Pass command line variable assignments automatically through the + variable 'MAKE' to recursive 'make' invocations. *Note Recursive + Use of 'make': Recursion. + + * Use the '-C' or '--directory' command option to change directory. + *Note Summary of Options: Options Summary. + + * Make verbatim variable definitions with 'define'. *Note Defining + Multi-Line Variables: Multi-Line. + + * Declare phony targets with the special target '.PHONY'. + + Andrew Hume of AT&T Bell Labs implemented a similar feature with a + different syntax in his 'mk' program. This seems to be a case of + parallel discovery. *Note Phony Targets: Phony Targets. + + * Manipulate text by calling functions. *Note Functions for + Transforming Text: Functions. + + * Use the '-o' or '--old-file' option to pretend a file's + modification-time is old. *Note Avoiding Recompilation of Some + Files: Avoiding Compilation. + + * Conditional execution. + + This feature has been implemented numerous times in various + versions of 'make'; it seems a natural extension derived from the + features of the C preprocessor and similar macro languages and is + not a revolutionary concept. *Note Conditional Parts of Makefiles: + Conditionals. + + * Specify a search path for included makefiles. *Note Including + Other Makefiles: Include. + + * Specify extra makefiles to read with an environment variable. + *Note The Variable 'MAKEFILES': MAKEFILES Variable. + + * Strip leading sequences of './' from file names, so that './FILE' + and 'FILE' are considered to be the same file. + + * Use a special search method for library prerequisites written in + the form '-lNAME'. *Note Directory Search for Link Libraries: + Libraries/Search. + + * Allow suffixes for suffix rules (*note Old-Fashioned Suffix Rules: + Suffix Rules.) to contain any characters. In other versions of + 'make', they must begin with '.' and not contain any '/' + characters. + + * Keep track of the current level of 'make' recursion using the + variable 'MAKELEVEL'. *Note Recursive Use of 'make': Recursion. + + * Provide any goals given on the command line in the variable + 'MAKECMDGOALS'. *Note Arguments to Specify the Goals: Goals. + + * Specify static pattern rules. *Note Static Pattern Rules: Static + Pattern. + + * Provide selective 'vpath' search. *Note Searching Directories for + Prerequisites: Directory Search. + + * Provide computed variable references. *Note Basics of Variable + References: Reference. + + * Update makefiles. *Note How Makefiles Are Remade: Remaking + Makefiles. System V 'make' has a very, very limited form of this + functionality in that it will check out SCCS files for makefiles. + + * Various new built-in implicit rules. *Note Catalogue of Built-In + Rules: Catalogue of Rules. + + * Load dynamic objects which can modify the behavior of 'make'. + *Note Loading Dynamic Objects: Loading Objects. + + +File: make.info, Node: Missing, Next: Makefile Conventions, Prev: Features, Up: Top + +15 Incompatibilities and Missing Features +***************************************** + +The 'make' programs in various other systems support a few features that +are not implemented in GNU 'make'. The POSIX.2 standard ('IEEE Standard +1003.2-1992') which specifies 'make' does not require any of these +features. + + * A target of the form 'FILE((ENTRY))' stands for a member of archive + file FILE. The member is chosen, not by name, but by being an + object file which defines the linker symbol ENTRY. + + This feature was not put into GNU 'make' because of the + non-modularity of putting knowledge into 'make' of the internal + format of archive file symbol tables. *Note Updating Archive + Symbol Directories: Archive Symbols. + + * Suffixes (used in suffix rules) that end with the character '~' + have a special meaning to System V 'make'; they refer to the SCCS + file that corresponds to the file one would get without the '~'. + For example, the suffix rule '.c~.o' would make the file 'N.o' from + the SCCS file 's.N.c'. For complete coverage, a whole series of + such suffix rules is required. *Note Old-Fashioned Suffix Rules: + Suffix Rules. + + In GNU 'make', this entire series of cases is handled by two + pattern rules for extraction from SCCS, in combination with the + general feature of rule chaining. *Note Chains of Implicit Rules: + Chained Rules. + + * In System V and 4.3 BSD 'make', files found by 'VPATH' search + (*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 unnecessary. + + * In some Unix 'make's, the automatic variable '$*' appearing in the + prerequisites of a rule has the amazingly strange "feature" of + expanding to the full name of the _target of that rule_. We cannot + imagine what went on in the minds of Unix 'make' developers to do + this; it is utterly inconsistent with the normal definition of + '$*'. + + * In some Unix 'make's, implicit rule search (*note Using Implicit + Rules: Implicit Rules.) is apparently done for _all_ targets, not + just those without recipes. This means you can do: + + foo.o: + cc -c foo.c + + and Unix 'make' will intuit that 'foo.o' depends on 'foo.c'. + + We feel that such usage is broken. The prerequisite properties of + 'make' are well-defined (for GNU 'make', at least), and doing such + a thing simply does not fit the model. + + * GNU 'make' does not include any built-in implicit rules for + compiling or preprocessing EFL programs. If we hear of anyone who + is using EFL, we will gladly add them. + + * It appears that in SVR4 'make', a suffix rule can be specified with + no recipe, and it is treated as if it had an empty recipe (*note + Empty Recipes::). For example: + + .c.a: + + will override the built-in '.c.a' suffix rule. + + We feel that it is cleaner for a rule without a recipe to always + simply add to the prerequisite list for the target. The above + example can be easily rewritten to get the desired behavior in GNU + 'make': + + .c.a: ; + + * Some versions of 'make' invoke the shell with the '-e' flag, except + under '-k' (*note Testing the Compilation of a Program: Testing.). + The '-e' flag tells the shell to exit as soon as any program it + runs returns a nonzero status. We feel it is cleaner to write each + line of the recipe to stand on its own and not require this special + treatment. + + +File: make.info, Node: Makefile Conventions, Next: Quick Reference, Prev: Missing, Up: Top + +16 Makefile Conventions +*********************** + +This node describes conventions for writing the Makefiles for GNU +programs. Using Automake will help you write a Makefile that follows +these conventions. For more information on portable Makefiles, see +POSIX and *note Portable Make Programming: (autoconf)Portable Make. + +* Menu: + +* Makefile Basics:: General conventions for Makefiles. +* Utilities in Makefiles:: Utilities to be used in Makefiles. +* Command Variables:: Variables for specifying commands. +* DESTDIR:: Supporting staged installs. +* Directory Variables:: Variables for installation directories. +* Standard Targets:: Standard targets for users. +* Install Command Categories:: Three categories of commands in the 'install' + rule: normal, pre-install and post-install. + + +File: make.info, Node: Makefile Basics, Next: Utilities in Makefiles, Up: Makefile Conventions + +16.1 General Conventions for Makefiles +====================================== + +Every Makefile should contain this line: + + SHELL = /bin/sh + +to avoid trouble on systems where the 'SHELL' variable might be +inherited from the environment. (This is never a problem with GNU +'make'.) + + Different 'make' programs have incompatible suffix lists and implicit +rules, and this sometimes creates confusion or misbehavior. So it is a +good idea to set the suffix list explicitly using only the suffixes you +need in the particular Makefile, like this: + + .SUFFIXES: + .SUFFIXES: .c .o + +The first line clears out the suffix list, the second introduces all +suffixes which may be subject to implicit rules in this Makefile. + + Don't assume that '.' is in the path for command execution. When you +need to run programs that are a part of your package during the make, +please make sure that it uses './' if the program is built as part of +the make or '$(srcdir)/' if the file is an unchanging part of the source +code. Without one of these prefixes, the current search path is used. + + The distinction between './' (the "build directory") and '$(srcdir)/' +(the "source directory") is important because users can build in a +separate directory using the '--srcdir' option to 'configure'. A rule +of the form: + + foo.1 : foo.man sedscript + sed -f sedscript foo.man > foo.1 + +will fail when the build directory is not the source directory, because +'foo.man' and 'sedscript' are in the source directory. + + When using GNU 'make', relying on 'VPATH' to find the source file +will work in the case where there is a single dependency file, since the +'make' automatic variable '$<' will represent the source file wherever +it is. (Many versions of 'make' set '$<' only in implicit rules.) A +Makefile target like + + foo.o : bar.c + $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o + +should instead be written as + + foo.o : bar.c + $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@ + +in order to allow 'VPATH' to work correctly. When the target has +multiple dependencies, using an explicit '$(srcdir)' is the easiest way +to make the rule work well. For example, the target above for 'foo.1' +is best written as: + + foo.1 : foo.man sedscript + sed -f $(srcdir)/sedscript $(srcdir)/foo.man > $@ + + GNU distributions usually contain some files which are not source +files--for example, Info files, and the output from Autoconf, Automake, +Bison or Flex. Since these files normally appear in the source +directory, they should always appear in the source directory, not in the +build directory. So Makefile rules to update them should put the +updated files in the source directory. + + However, if a file does not appear in the distribution, then the +Makefile should not put it in the source directory, because building a +program in ordinary circumstances should not modify the source directory +in any way. + + Try to make the build and installation targets, at least (and all +their subtargets) work correctly with a parallel 'make'. + + +File: make.info, Node: Utilities in Makefiles, Next: Command Variables, Prev: Makefile Basics, Up: Makefile Conventions + +16.2 Utilities in Makefiles +=========================== + +Write the Makefile commands (and any shell scripts, such as 'configure') +to run under 'sh' (both the traditional Bourne shell and the POSIX +shell), not 'csh'. Don't use any special features of 'ksh' or 'bash', +or POSIX features not widely supported in traditional Bourne 'sh'. + + The 'configure' script and the Makefile rules for building and +installation should not use any utilities directly except these: + + awk cat cmp cp diff echo egrep expr false grep install-info ln ls + mkdir mv printf pwd rm rmdir sed sleep sort tar test touch tr true + + Compression programs such as 'gzip' can be used in the 'dist' rule. + + Generally, stick to the widely-supported (usually POSIX-specified) +options and features of these programs. For example, don't use 'mkdir +-p', convenient as it may be, because a few systems don't support it at +all and with others, it is not safe for parallel execution. For a list +of known incompatibilities, see *note Portable Shell Programming: +(autoconf)Portable Shell. + + It is a good idea to avoid creating symbolic links in makefiles, +since a few file systems don't support them. + + The Makefile rules for building and installation can also use +compilers and related programs, but should do so via 'make' variables so +that the user can substitute alternatives. Here are some of the +programs we mean: + + ar bison cc flex install ld ldconfig lex + make makeinfo ranlib texi2dvi yacc + + Use the following 'make' variables to run those programs: + + $(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LDCONFIG) $(LEX) + $(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC) + + When you use 'ranlib' or 'ldconfig', you should make sure nothing bad +happens if the system does not have the program in question. Arrange to +ignore an error from that command, and print a message before the +command to tell the user that failure of this command does not mean a +problem. (The Autoconf 'AC_PROG_RANLIB' macro can help with this.) + + If you use symbolic links, you should implement a fallback for +systems that don't have symbolic links. + + Additional utilities that can be used via Make variables are: + + chgrp chmod chown mknod + + It is ok to use other utilities in Makefile portions (or scripts) +intended only for particular systems where you know those utilities +exist. + + +File: make.info, Node: Command Variables, Next: DESTDIR, Prev: Utilities in Makefiles, Up: Makefile Conventions + +16.3 Variables for Specifying Commands +====================================== + +Makefiles should provide variables for overriding certain commands, +options, and so on. + + In particular, you should run most utility programs via variables. +Thus, if you use Bison, have a variable named 'BISON' whose default +value is set with 'BISON = bison', and refer to it with '$(BISON)' +whenever you need to use Bison. + + File management utilities such as 'ln', 'rm', 'mv', and so on, need +not be referred to through variables in this way, since users don't need +to replace them with other programs. + + Each program-name variable should come with an options variable that +is used to supply options to the program. Append 'FLAGS' to the +program-name variable name to get the options variable name--for +example, 'BISONFLAGS'. (The names 'CFLAGS' for the C compiler, 'YFLAGS' +for yacc, and 'LFLAGS' for lex, are exceptions to this rule, but we keep +them because they are standard.) Use 'CPPFLAGS' in any compilation +command that runs the preprocessor, and use 'LDFLAGS' in any compilation +command that does linking as well as in any direct use of 'ld'. + + If there are C compiler options that _must_ be used for proper +compilation of certain files, do not include them in 'CFLAGS'. Users +expect to be able to specify 'CFLAGS' freely themselves. Instead, +arrange to pass the necessary options to the C compiler independently of +'CFLAGS', by writing them explicitly in the compilation commands or by +defining an implicit rule, like this: + + CFLAGS = -g + ALL_CFLAGS = -I. $(CFLAGS) + .c.o: + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< + + Do include the '-g' option in 'CFLAGS', because that is not +_required_ for proper compilation. You can consider it a default that +is only recommended. If the package is set up so that it is compiled +with GCC by default, then you might as well include '-O' in the default +value of 'CFLAGS' as well. + + Put 'CFLAGS' last in the compilation command, after other variables +containing compiler options, so the user can use 'CFLAGS' to override +the others. + + 'CFLAGS' should be used in every invocation of the C compiler, both +those which do compilation and those which do linking. + + Every Makefile should define the variable 'INSTALL', which is the +basic command for installing a file into the system. + + Every Makefile should also define the variables 'INSTALL_PROGRAM' and +'INSTALL_DATA'. (The default for 'INSTALL_PROGRAM' should be +'$(INSTALL)'; the default for 'INSTALL_DATA' should be '${INSTALL} -m +644'.) Then it should use those variables as the commands for actual +installation, for executables and non-executables respectively. Minimal +use of these variables is as follows: + + $(INSTALL_PROGRAM) foo $(bindir)/foo + $(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a + + However, it is preferable to support a 'DESTDIR' prefix on the target +files, as explained in the next section. + + It is acceptable, but not required, to install multiple files in one +command, with the final argument being a directory, as in: + + $(INSTALL_PROGRAM) foo bar baz $(bindir) + + +File: make.info, Node: DESTDIR, Next: Directory Variables, Prev: Command Variables, Up: Makefile Conventions + +16.4 'DESTDIR': Support for Staged Installs +=========================================== + +'DESTDIR' is a variable prepended to each installed target file, like +this: + + $(INSTALL_PROGRAM) foo $(DESTDIR)$(bindir)/foo + $(INSTALL_DATA) libfoo.a $(DESTDIR)$(libdir)/libfoo.a + + The 'DESTDIR' variable is specified by the user on the 'make' command +line as an absolute file name. For example: + + make DESTDIR=/tmp/stage install + +'DESTDIR' should be supported only in the 'install*' and 'uninstall*' +targets, as those are the only targets where it is useful. + + If your installation step would normally install '/usr/local/bin/foo' +and '/usr/local/lib/libfoo.a', then an installation invoked as in the +example above would install '/tmp/stage/usr/local/bin/foo' and +'/tmp/stage/usr/local/lib/libfoo.a' instead. + + Prepending the variable 'DESTDIR' to each target in this way provides +for "staged installs", where the installed files are not placed directly +into their expected location but are instead copied into a temporary +location ('DESTDIR'). However, installed files maintain their relative +directory structure and any embedded file names will not be modified. + + You should not set the value of 'DESTDIR' in your 'Makefile' at all; +then the files are installed into their expected locations by default. +Also, specifying 'DESTDIR' should not change the operation of the +software in any way, so its value should not be included in any file +contents. + + 'DESTDIR' support is commonly used in package creation. It is also +helpful to users who want to understand what a given package will +install where, and to allow users who don't normally have permissions to +install into protected areas to build and install before gaining those +permissions. Finally, it can be useful with tools such as 'stow', where +code is installed in one place but made to appear to be installed +somewhere else using symbolic links or special mount operations. So, we +strongly recommend GNU packages support 'DESTDIR', though it is not an +absolute requirement. + + +File: make.info, Node: Directory Variables, Next: Standard Targets, Prev: DESTDIR, Up: Makefile Conventions + +16.5 Variables for Installation Directories +=========================================== + +Installation directories should always be named by variables, so it is +easy to install in a nonstandard place. The standard names for these +variables and the values they should have in GNU packages are described +below. They are based on a standard file system layout; variants of it +are used in GNU/Linux and other modern operating systems. + + Installers are expected to override these values when calling 'make' +(e.g., 'make prefix=/usr install') or 'configure' (e.g., 'configure +--prefix=/usr'). GNU packages should not try to guess which value +should be appropriate for these variables on the system they are being +installed onto: use the default settings specified here so that all GNU +packages behave identically, allowing the installer to achieve any +desired layout. + + All installation directories, and their parent directories, should be +created (if necessary) before they are installed into. + + These first two variables set the root for the installation. All the +other installation directories should be subdirectories of one of these +two, and nothing should be directly installed into these two +directories. + +'prefix' + A prefix used in constructing the default values of the variables + listed below. The default value of 'prefix' should be + '/usr/local'. When building the complete GNU system, the prefix + will be empty and '/usr' will be a symbolic link to '/'. (If you + are using Autoconf, write it as '@prefix@'.) + + Running 'make install' with a different value of 'prefix' from the + one used to build the program should _not_ recompile the program. + +'exec_prefix' + A prefix used in constructing the default values of some of the + variables listed below. The default value of 'exec_prefix' should + be '$(prefix)'. (If you are using Autoconf, write it as + '@exec_prefix@'.) + + Generally, '$(exec_prefix)' is used for directories that contain + machine-specific files (such as executables and subroutine + libraries), while '$(prefix)' is used directly for other + directories. + + Running 'make install' with a different value of 'exec_prefix' from + the one used to build the program should _not_ recompile the + program. + + Executable programs are installed in one of the following +directories. + +'bindir' + The directory for installing executable programs that users can + run. This should normally be '/usr/local/bin', but write it as + '$(exec_prefix)/bin'. (If you are using Autoconf, write it as + '@bindir@'.) + +'sbindir' + The directory for installing executable programs that can be run + from the shell, but are only generally useful to system + administrators. This should normally be '/usr/local/sbin', but + write it as '$(exec_prefix)/sbin'. (If you are using Autoconf, + write it as '@sbindir@'.) + +'libexecdir' + The directory for installing executable programs to be run by other + programs rather than by users. This directory should normally be + '/usr/local/libexec', but write it as '$(exec_prefix)/libexec'. + (If you are using Autoconf, write it as '@libexecdir@'.) + + The definition of 'libexecdir' is the same for all packages, so you + should install your data in a subdirectory thereof. Most packages + install their data under '$(libexecdir)/PACKAGE-NAME/', possibly + within additional subdirectories thereof, such as + '$(libexecdir)/PACKAGE-NAME/MACHINE/VERSION'. + + Data files used by the program during its execution are divided into +categories in two ways. + + * Some files are normally modified by programs; others are never + normally modified (though users may edit some of these). + + * Some files are architecture-independent and can be shared by all + machines at a site; some are architecture-dependent and can be + shared only by machines of the same kind and operating system; + others may never be shared between two machines. + + This makes for six different possibilities. However, we want to +discourage the use of architecture-dependent files, aside from object +files and libraries. It is much cleaner to make other data files +architecture-independent, and it is generally not hard. + + Here are the variables Makefiles should use to specify directories to +put these various kinds of files in: + +'datarootdir' + The root of the directory tree for read-only + architecture-independent data files. This should normally be + '/usr/local/share', but write it as '$(prefix)/share'. (If you are + using Autoconf, write it as '@datarootdir@'.) 'datadir''s default + value is based on this variable; so are 'infodir', 'mandir', and + others. + +'datadir' + The directory for installing idiosyncratic read-only + architecture-independent data files for this program. This is + usually the same place as 'datarootdir', but we use the two + separate variables so that you can move these program-specific + files without altering the location for Info files, man pages, etc. + + This should normally be '/usr/local/share', but write it as + '$(datarootdir)'. (If you are using Autoconf, write it as + '@datadir@'.) + + The definition of 'datadir' is the same for all packages, so you + should install your data in a subdirectory thereof. Most packages + install their data under '$(datadir)/PACKAGE-NAME/'. + +'sysconfdir' + The directory for installing read-only data files that pertain to a + single machine-that is to say, files for configuring a host. + Mailer and network configuration files, '/etc/passwd', and so forth + belong here. All the files in this directory should be ordinary + ASCII text files. This directory should normally be + '/usr/local/etc', but write it as '$(prefix)/etc'. (If you are + using Autoconf, write it as '@sysconfdir@'.) + + Do not install executables here in this directory (they probably + belong in '$(libexecdir)' or '$(sbindir)'). Also do not install + files that are modified in the normal course of their use (programs + whose purpose is to change the configuration of the system + excluded). Those probably belong in '$(localstatedir)'. + +'sharedstatedir' + The directory for installing architecture-independent data files + which the programs modify while they run. This should normally be + '/usr/local/com', but write it as '$(prefix)/com'. (If you are + using Autoconf, write it as '@sharedstatedir@'.) + +'localstatedir' + The directory for installing data files which the programs modify + while they run, and that pertain to one specific machine. Users + should never need to modify files in this directory to configure + the package's operation; put such configuration information in + separate files that go in '$(datadir)' or '$(sysconfdir)'. + '$(localstatedir)' should normally be '/usr/local/var', but write + it as '$(prefix)/var'. (If you are using Autoconf, write it as + '@localstatedir@'.) + +'runstatedir' + The directory for installing data files which the programs modify + while they run, that pertain to one specific machine, and which + need not persist longer than the execution of the program--which is + generally long-lived, for example, until the next reboot. PID + files for system daemons are a typical use. In addition, this + directory should not be cleaned except perhaps at reboot, while the + general '/tmp' ('TMPDIR') may be cleaned arbitrarily. This should + normally be '/var/run', but write it as '$(localstatedir)/run'. + Having it as a separate variable allows the use of '/run' if + desired, for example. (If you are using Autoconf 2.70 or later, + write it as '@runstatedir@'.) + + These variables specify the directory for installing certain specific +types of files, if your program has them. Every GNU package should have +Info files, so every program needs 'infodir', but not all need 'libdir' +or 'lispdir'. + +'includedir' + The directory for installing header files to be included by user + programs with the C '#include' preprocessor directive. This should + normally be '/usr/local/include', but write it as + '$(prefix)/include'. (If you are using Autoconf, write it as + '@includedir@'.) + + Most compilers other than GCC do not look for header files in + directory '/usr/local/include'. So installing the header files + this way is only useful with GCC. Sometimes this is not a problem + because some libraries are only really intended to work with GCC. + But some libraries are intended to work with other compilers. They + should install their header files in two places, one specified by + 'includedir' and one specified by 'oldincludedir'. + +'oldincludedir' + The directory for installing '#include' header files for use with + compilers other than GCC. This should normally be '/usr/include'. + (If you are using Autoconf, you can write it as '@oldincludedir@'.) + + The Makefile commands should check whether the value of + 'oldincludedir' is empty. If it is, they should not try to use it; + they should cancel the second installation of the header files. + + A package should not replace an existing header in this directory + unless the header came from the same package. Thus, if your Foo + package provides a header file 'foo.h', then it should install the + header file in the 'oldincludedir' directory if either (1) there is + no 'foo.h' there or (2) the 'foo.h' that exists came from the Foo + package. + + To tell whether 'foo.h' came from the Foo package, put a magic + string in the file--part of a comment--and 'grep' for that string. + +'docdir' + The directory for installing documentation files (other than Info) + for this package. By default, it should be + '/usr/local/share/doc/YOURPKG', but it should be written as + '$(datarootdir)/doc/YOURPKG'. (If you are using Autoconf, write it + as '@docdir@'.) The YOURPKG subdirectory, which may include a + version number, prevents collisions among files with common names, + such as 'README'. + +'infodir' + The directory for installing the Info files for this package. By + default, it should be '/usr/local/share/info', but it should be + written as '$(datarootdir)/info'. (If you are using Autoconf, + write it as '@infodir@'.) 'infodir' is separate from 'docdir' for + compatibility with existing practice. + +'htmldir' +'dvidir' +'pdfdir' +'psdir' + Directories for installing documentation files in the particular + format. They should all be set to '$(docdir)' by default. (If you + are using Autoconf, write them as '@htmldir@', '@dvidir@', etc.) + Packages which supply several translations of their documentation + should install them in '$(htmldir)/'LL, '$(pdfdir)/'LL, etc. where + LL is a locale abbreviation such as 'en' or 'pt_BR'. + +'libdir' + The directory for object files and libraries of object code. Do + not install executables here, they probably ought to go in + '$(libexecdir)' instead. The value of 'libdir' should normally be + '/usr/local/lib', but write it as '$(exec_prefix)/lib'. (If you + are using Autoconf, write it as '@libdir@'.) + +'lispdir' + The directory for installing any Emacs Lisp files in this package. + By default, it should be '/usr/local/share/emacs/site-lisp', but it + should be written as '$(datarootdir)/emacs/site-lisp'. + + If you are using Autoconf, write the default as '@lispdir@'. In + order to make '@lispdir@' work, you need the following lines in + your 'configure.ac' file: + + lispdir='${datarootdir}/emacs/site-lisp' + AC_SUBST(lispdir) + +'localedir' + The directory for installing locale-specific message catalogs for + this package. By default, it should be '/usr/local/share/locale', + but it should be written as '$(datarootdir)/locale'. (If you are + using Autoconf, write it as '@localedir@'.) This directory usually + has a subdirectory per locale. + + Unix-style man pages are installed in one of the following: + +'mandir' + The top-level directory for installing the man pages (if any) for + this package. It will normally be '/usr/local/share/man', but you + should write it as '$(datarootdir)/man'. (If you are using + Autoconf, write it as '@mandir@'.) + +'man1dir' + The directory for installing section 1 man pages. Write it as + '$(mandir)/man1'. +'man2dir' + The directory for installing section 2 man pages. Write it as + '$(mandir)/man2' +'...' + + *Don't make the primary documentation for any GNU software be a man + page. Write a manual in Texinfo instead. Man pages are just for + the sake of people running GNU software on Unix, which is a + secondary application only.* + +'manext' + The file name extension for the installed man page. This should + contain a period followed by the appropriate digit; it should + normally be '.1'. + +'man1ext' + The file name extension for installed section 1 man pages. +'man2ext' + The file name extension for installed section 2 man pages. +'...' + Use these names instead of 'manext' if the package needs to install + man pages in more than one section of the manual. + + And finally, you should set the following variable: + +'srcdir' + The directory for the sources being compiled. The value of this + variable is normally inserted by the 'configure' shell script. (If + you are using Autoconf, use 'srcdir = @srcdir@'.) + + For example: + + # Common prefix for installation directories. + # NOTE: This directory must exist when you start the install. + prefix = /usr/local + datarootdir = $(prefix)/share + datadir = $(datarootdir) + exec_prefix = $(prefix) + # Where to put the executable for the command 'gcc'. + bindir = $(exec_prefix)/bin + # Where to put the directories used by the compiler. + libexecdir = $(exec_prefix)/libexec + # Where to put the Info files. + infodir = $(datarootdir)/info + + If your program installs a large number of files into one of the +standard user-specified directories, it might be useful to group them +into a subdirectory particular to that program. If you do this, you +should write the 'install' rule to create these subdirectories. + + Do not expect the user to include the subdirectory name in the value +of any of the variables listed above. The idea of having a uniform set +of variable names for installation directories is to enable the user to +specify the exact same values for several different GNU packages. In +order for this to be useful, all the packages must be designed so that +they will work sensibly when the user does so. + + At times, not all of these variables may be implemented in the +current release of Autoconf and/or Automake; but as of Autoconf 2.60, we +believe all of them are. When any are missing, the descriptions here +serve as specifications for what Autoconf will implement. As a +programmer, you can either use a development version of Autoconf or +avoid using these variables until a stable release is made which +supports them. + + +File: make.info, Node: Standard Targets, Next: Install Command Categories, Prev: Directory Variables, Up: Makefile Conventions + +16.6 Standard Targets for Users +=============================== + +All GNU programs should have the following targets in their Makefiles: + +'all' + Compile the entire program. This should be the default target. + This target need not rebuild any documentation files; Info files + should normally be included in the distribution, and DVI (and other + documentation format) files should be made only when explicitly + asked for. + + By default, the Make rules should compile and link with '-g', so + that executable programs have debugging symbols. Otherwise, you + are essentially helpless in the face of a crash, and it is often + far from easy to reproduce with a fresh build. + +'install' + Compile the program and copy the executables, libraries, and so on + to the file names where they should reside for actual use. If + there is a simple test to verify that a program is properly + installed, this target should run that test. + + Do not strip executables when installing them. This helps eventual + debugging that may be needed later, and nowadays disk space is + cheap and dynamic loaders typically ensure debug sections are not + loaded during normal execution. Users that need stripped binaries + may invoke the 'install-strip' target to do that. + + If possible, write the 'install' target rule so that it does not + modify anything in the directory where the program was built, + provided 'make all' has just been done. This is convenient for + building the program under one user name and installing it under + another. + + The commands should create all the directories in which files are + to be installed, if they don't already exist. This includes the + directories specified as the values of the variables 'prefix' and + 'exec_prefix', as well as all subdirectories that are needed. One + way to do this is by means of an 'installdirs' target as described + below. + + Use '-' before any command for installing a man page, so that + 'make' will ignore any errors. This is in case there are systems + that don't have the Unix man page documentation system installed. + + The way to install Info files is to copy them into '$(infodir)' + with '$(INSTALL_DATA)' (*note Command Variables::), and then run + the 'install-info' program if it is present. 'install-info' is a + program that edits the Info 'dir' file to add or update the menu + entry for the given Info file; it is part of the Texinfo package. + + Here is a sample rule to install an Info file that also tries to + handle some additional situations, such as 'install-info' not being + present. + + do-install-info: foo.info installdirs + $(NORMAL_INSTALL) + # Prefer an info file in . to one in srcdir. + if test -f foo.info; then d=.; \ + else d="$(srcdir)"; fi; \ + $(INSTALL_DATA) $$d/foo.info \ + "$(DESTDIR)$(infodir)/foo.info" + # Run install-info only if it exists. + # Use 'if' instead of just prepending '-' to the + # line so we notice real errors from install-info. + # Use '$(SHELL) -c' because some shells do not + # fail gracefully when there is an unknown command. + $(POST_INSTALL) + if $(SHELL) -c 'install-info --version' \ + >/dev/null 2>&1; then \ + install-info --dir-file="$(DESTDIR)$(infodir)/dir" \ + "$(DESTDIR)$(infodir)/foo.info"; \ + else true; fi + + When writing the 'install' target, you must classify all the + commands into three categories: normal ones, "pre-installation" + commands and "post-installation" commands. *Note Install Command + Categories::. + +'install-html' +'install-dvi' +'install-pdf' +'install-ps' + These targets install documentation in formats other than Info; + they're intended to be called explicitly by the person installing + the package, if that format is desired. GNU prefers Info files, so + these must be installed by the 'install' target. + + When you have many documentation files to install, we recommend + that you avoid collisions and clutter by arranging for these + targets to install in subdirectories of the appropriate + installation directory, such as 'htmldir'. As one example, if your + package has multiple manuals, and you wish to install HTML + documentation with many files (such as the "split" mode output by + 'makeinfo --html'), you'll certainly want to use subdirectories, or + two nodes with the same name in different manuals will overwrite + each other. + + Please make these 'install-FORMAT' targets invoke the commands for + the FORMAT target, for example, by making FORMAT a dependency. + +'uninstall' + Delete all the installed files--the copies that the 'install' and + 'install-*' targets create. + + This rule should not modify the directories where compilation is + done, only the directories where files are installed. + + The uninstallation commands are divided into three categories, just + like the installation commands. *Note Install Command + Categories::. + +'install-strip' + Like 'install', but strip the executable files while installing + them. In simple cases, this target can use the 'install' target in + a simple way: + + install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \ + install + + But if the package installs scripts as well as real executables, + the 'install-strip' target can't just refer to the 'install' + target; it has to strip the executables but not the scripts. + + 'install-strip' should not strip the executables in the build + directory which are being copied for installation. It should only + strip the copies that are installed. + + Normally we do not recommend stripping an executable unless you are + sure the program has no bugs. However, it can be reasonable to + install a stripped executable for actual execution while saving the + unstripped executable elsewhere in case there is a bug. + +'clean' + Delete all files in the current directory that are normally created + by building the program. Also delete files in other directories if + they are created by this makefile. However, don't delete the files + that record the configuration. Also preserve files that could be + made by building, but normally aren't because the distribution + comes with them. There is no need to delete parent directories + that were created with 'mkdir -p', since they could have existed + anyway. + + Delete '.dvi' files here if they are not part of the distribution. + +'distclean' + Delete all files in the current directory (or created by this + makefile) that are created by configuring or building the program. + If you have unpacked the source and built the program without + creating any other files, 'make distclean' should leave only the + files that were in the distribution. However, there is no need to + delete parent directories that were created with 'mkdir -p', since + they could have existed anyway. + +'mostlyclean' + Like 'clean', but may refrain from deleting a few files that people + normally don't want to recompile. For example, the 'mostlyclean' + target for GCC does not delete 'libgcc.a', because recompiling it + is rarely necessary and takes a lot of time. + +'maintainer-clean' + Delete almost everything that can be reconstructed with this + Makefile. This typically includes everything deleted by + 'distclean', plus more: C source files produced by Bison, tags + tables, Info files, and so on. + + The reason we say "almost everything" is that running the command + 'make maintainer-clean' should not delete 'configure' even if + 'configure' can be remade using a rule in the Makefile. More + generally, 'make maintainer-clean' should not delete anything that + needs to exist in order to run 'configure' and then begin to build + the program. Also, there is no need to delete parent directories + that were created with 'mkdir -p', since they could have existed + anyway. These are the only exceptions; 'maintainer-clean' should + delete everything else that can be rebuilt. + + The 'maintainer-clean' target is intended to be used by a + maintainer of the package, not by ordinary users. You may need + special tools to reconstruct some of the files that 'make + maintainer-clean' deletes. Since these files are normally included + in the distribution, we don't take care to make them easy to + reconstruct. If you find you need to unpack the full distribution + again, don't blame us. + + To help make users aware of this, the commands for the special + 'maintainer-clean' target should start with these two: + + @echo 'This command is intended for maintainers to use; it' + @echo 'deletes files that may need special tools to rebuild.' + +'TAGS' + Update a tags table for this program. + +'info' + Generate any Info files needed. The best way to write the rules is + as follows: + + info: foo.info + + foo.info: foo.texi chap1.texi chap2.texi + $(MAKEINFO) $(srcdir)/foo.texi + + You must define the variable 'MAKEINFO' in the Makefile. It should + run the 'makeinfo' program, which is part of the Texinfo + distribution. + + Normally a GNU distribution comes with Info files, and that means + the Info files are present in the source directory. Therefore, the + Make rule for an info file should update it in the source + directory. When users build the package, ordinarily Make will not + update the Info files because they will already be up to date. + +'dvi' +'html' +'pdf' +'ps' + Generate documentation files in the given format. These targets + should always exist, but any or all can be a no-op if the given + output format cannot be generated. These targets should not be + dependencies of the 'all' target; the user must manually invoke + them. + + Here's an example rule for generating DVI files from Texinfo: + + dvi: foo.dvi + + foo.dvi: foo.texi chap1.texi chap2.texi + $(TEXI2DVI) $(srcdir)/foo.texi + + You must define the variable 'TEXI2DVI' in the Makefile. It should + run the program 'texi2dvi', which is part of the Texinfo + distribution. ('texi2dvi' uses TeX to do the real work of + formatting. TeX is not distributed with Texinfo.) Alternatively, + write only the dependencies, and allow GNU 'make' to provide the + command. + + Here's another example, this one for generating HTML from Texinfo: + + html: foo.html + + foo.html: foo.texi chap1.texi chap2.texi + $(TEXI2HTML) $(srcdir)/foo.texi + + Again, you would define the variable 'TEXI2HTML' in the Makefile; + for example, it might run 'makeinfo --no-split --html' ('makeinfo' + is part of the Texinfo distribution). + +'dist' + Create a distribution tar file for this program. The tar file + should be set up so that the file names in the tar file start with + a subdirectory name which is the name of the package it is a + distribution for. This name can include the version number. + + For example, the distribution tar file of GCC version 1.40 unpacks + into a subdirectory named 'gcc-1.40'. + + The easiest way to do this is to create a subdirectory + appropriately named, use 'ln' or 'cp' to install the proper files + in it, and then 'tar' that subdirectory. + + Compress the tar file with 'gzip'. For example, the actual + distribution file for GCC version 1.40 is called 'gcc-1.40.tar.gz'. + It is ok to support other free compression formats as well. + + The 'dist' target should explicitly depend on all non-source files + that are in the distribution, to make sure they are up to date in + the distribution. *Note Making Releases: (standards)Releases. + +'check' + Perform self-tests (if any). The user must build the program + before running the tests, but need not install the program; you + should write the self-tests so that they work when the program is + built but not installed. + + The following targets are suggested as conventional names, for +programs in which they are useful. + +'installcheck' + Perform installation tests (if any). The user must build and + install the program before running the tests. You should not + assume that '$(bindir)' is in the search path. + +'installdirs' + It's useful to add a target named 'installdirs' to create the + directories where files are installed, and their parent + directories. There is a script called 'mkinstalldirs' which is + convenient for this; you can find it in the Gnulib package. You + can use a rule like this: + + # Make sure all installation directories (e.g. $(bindir)) + # actually exist by making them if necessary. + installdirs: mkinstalldirs + $(srcdir)/mkinstalldirs $(bindir) $(datadir) \ + $(libdir) $(infodir) \ + $(mandir) + + or, if you wish to support 'DESTDIR' (strongly encouraged), + + # Make sure all installation directories (e.g. $(bindir)) + # actually exist by making them if necessary. + installdirs: mkinstalldirs + $(srcdir)/mkinstalldirs \ + $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) \ + $(DESTDIR)$(libdir) $(DESTDIR)$(infodir) \ + $(DESTDIR)$(mandir) + + This rule should not modify the directories where compilation is + done. It should do nothing but create installation directories. + + +File: make.info, Node: Install Command Categories, Prev: Standard Targets, Up: Makefile Conventions + +16.7 Install Command Categories +=============================== + +When writing the 'install' target, you must classify all the commands +into three categories: normal ones, "pre-installation" commands and +"post-installation" commands. + + Normal commands move files into their proper places, and set their +modes. They may not alter any files except the ones that come entirely +from the package they belong to. + + Pre-installation and post-installation commands may alter other +files; in particular, they can edit global configuration files or data +bases. + + Pre-installation commands are typically executed before the normal +commands, and post-installation commands are typically run after the +normal commands. + + The most common use for a post-installation command is to run +'install-info'. This cannot be done with a normal command, since it +alters a file (the Info directory) which does not come entirely and +solely from the package being installed. It is a post-installation +command because it needs to be done after the normal command which +installs the package's Info files. + + Most programs don't need any pre-installation commands, but we have +the feature just in case it is needed. + + To classify the commands in the 'install' rule into these three +categories, insert "category lines" among them. A category line +specifies the category for the commands that follow. + + A category line consists of a tab and a reference to a special Make +variable, plus an optional comment at the end. There are three +variables you can use, one for each category; the variable name +specifies the category. Category lines are no-ops in ordinary execution +because these three Make variables are normally undefined (and you +_should not_ define them in the makefile). + + Here are the three possible category lines, each with a comment that +explains what it means: + + $(PRE_INSTALL) # Pre-install commands follow. + $(POST_INSTALL) # Post-install commands follow. + $(NORMAL_INSTALL) # Normal commands follow. + + If you don't use a category line at the beginning of the 'install' +rule, all the commands are classified as normal until the first category +line. If you don't use any category lines, all the commands are +classified as normal. + + These are the category lines for 'uninstall': + + $(PRE_UNINSTALL) # Pre-uninstall commands follow. + $(POST_UNINSTALL) # Post-uninstall commands follow. + $(NORMAL_UNINSTALL) # Normal commands follow. + + Typically, a pre-uninstall command would be used for deleting entries +from the Info directory. + + If the 'install' or 'uninstall' target has any dependencies which act +as subroutines of installation, then you should start _each_ +dependency's commands with a category line, and start the main target's +commands with a category line also. This way, you can ensure that each +command is placed in the right category regardless of which of the +dependencies actually run. + + Pre-installation and post-installation commands should not run any +programs except for these: + + [ basename bash cat chgrp chmod chown cmp cp dd diff echo + egrep expand expr false fgrep find getopt grep gunzip gzip + hostname install install-info kill ldconfig ln ls md5sum + mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee + test touch true uname xargs yes + + The reason for distinguishing the commands in this way is for the +sake of making binary packages. Typically a binary package contains all +the executables and other files that need to be installed, and has its +own method of installing them--so it does not need to run the normal +installation commands. But installing the binary package does need to +execute the pre-installation and post-installation commands. + + Programs to build binary packages work by extracting the +pre-installation and post-installation commands. Here is one way of +extracting the pre-installation commands (the '-s' option to 'make' is +needed to silence messages about entering subdirectories): + + make -s -n install -o all \ + PRE_INSTALL=pre-install \ + POST_INSTALL=post-install \ + NORMAL_INSTALL=normal-install \ + | gawk -f pre-install.awk + +where the file 'pre-install.awk' could contain this: + + $0 ~ /^(normal-install|post-install)[ \t]*$/ {on = 0} + on {print $0} + $0 ~ /^pre-install[ \t]*$/ {on = 1} + + +File: make.info, Node: Quick Reference, Next: Error Messages, Prev: Makefile Conventions, Up: Top + +Appendix A Quick Reference +************************** + +This appendix summarizes the directives, text manipulation functions, +and special variables which GNU 'make' understands. *Note Special +Targets::, *note Catalogue of Built-In Rules: Catalogue of Rules, and +*note Summary of Options: Options Summary, for other summaries. + + Here is a summary of the directives GNU 'make' recognizes: + +'define VARIABLE' +'define VARIABLE =' +'define VARIABLE :=' +'define VARIABLE ::=' +'define VARIABLE +=' +'define VARIABLE ?=' +'endef' + Define multi-line variables. + *Note Multi-Line::. + +'undefine VARIABLE' + Undefining variables. + *Note Undefine Directive::. + +'ifdef VARIABLE' +'ifndef VARIABLE' +'ifeq (A,B)' +'ifeq "A" "B"' +'ifeq 'A' 'B'' +'ifneq (A,B)' +'ifneq "A" "B"' +'ifneq 'A' 'B'' +'else' +'endif' + Conditionally evaluate part of the makefile. + *Note Conditionals::. + +'include FILE' +'-include FILE' +'sinclude FILE' + Include another makefile. + *Note Including Other Makefiles: Include. + +'override VARIABLE-ASSIGNMENT' + Define a variable, overriding any previous definition, even one + from the command line. + *Note The 'override' Directive: Override Directive. + +'export' + Tell 'make' to export all variables to child processes by default. + *Note Communicating Variables to a Sub-'make': Variables/Recursion. + +'export VARIABLE' +'export VARIABLE-ASSIGNMENT' +'unexport VARIABLE' + Tell 'make' whether or not to export a particular variable to child + processes. + *Note Communicating Variables to a Sub-'make': Variables/Recursion. + +'private VARIABLE-ASSIGNMENT' + Do not allow this variable assignment to be inherited by + prerequisites. + *Note Suppressing Inheritance::. + +'vpath PATTERN PATH' + Specify a search path for files matching a '%' pattern. + *Note The 'vpath' Directive: Selective Search. + +'vpath PATTERN' + Remove all search paths previously specified for PATTERN. + +'vpath' + Remove all search paths previously specified in any 'vpath' + directive. + + Here is a summary of the built-in functions (*note Functions::): + +'$(subst FROM,TO,TEXT)' + Replace FROM with TO in TEXT. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(patsubst PATTERN,REPLACEMENT,TEXT)' + Replace words matching PATTERN with REPLACEMENT in TEXT. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(strip STRING)' + Remove excess whitespace characters from STRING. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(findstring FIND,TEXT)' + Locate FIND in TEXT. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(filter PATTERN...,TEXT)' + Select words in TEXT that match one of the PATTERN words. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(filter-out PATTERN...,TEXT)' + Select words in TEXT that _do not_ match any of the PATTERN words. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(sort LIST)' + Sort the words in LIST lexicographically, removing duplicates. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(word N,TEXT)' + Extract the Nth word (one-origin) of TEXT. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(words TEXT)' + Count the number of words in TEXT. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(wordlist S,E,TEXT)' + Returns the list of words in TEXT from S to E. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(firstword NAMES...)' + Extract the first word of NAMES. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(lastword NAMES...)' + Extract the last word of NAMES. + *Note Functions for String Substitution and Analysis: Text + Functions. + +'$(dir NAMES...)' + Extract the directory part of each file name. + *Note Functions for File Names: File Name Functions. + +'$(notdir NAMES...)' + Extract the non-directory part of each file name. + *Note Functions for File Names: File Name Functions. + +'$(suffix NAMES...)' + Extract the suffix (the last '.' and following characters) of each + file name. + *Note Functions for File Names: File Name Functions. + +'$(basename NAMES...)' + Extract the base name (name without suffix) of each file name. + *Note Functions for File Names: File Name Functions. + +'$(addsuffix SUFFIX,NAMES...)' + Append SUFFIX to each word in NAMES. + *Note Functions for File Names: File Name Functions. + +'$(addprefix PREFIX,NAMES...)' + Prepend PREFIX to each word in NAMES. + *Note Functions for File Names: File Name Functions. + +'$(join LIST1,LIST2)' + Join two parallel lists of words. + *Note Functions for File Names: File Name Functions. + +'$(wildcard PATTERN...)' + Find file names matching a shell file name pattern (_not_ a '%' + pattern). + *Note The Function 'wildcard': Wildcard Function. + +'$(realpath NAMES...)' + For each file name in NAMES, expand to an absolute name that does + not contain any '.', '..', nor symlinks. + *Note Functions for File Names: File Name Functions. + +'$(abspath NAMES...)' + For each file name in NAMES, expand to an absolute name that does + not contain any '.' or '..' components, but preserves symlinks. + *Note Functions for File Names: File Name Functions. + +'$(error TEXT...)' + When this function is evaluated, 'make' generates a fatal error + with the message TEXT. + *Note Functions That Control Make: Make Control Functions. + +'$(warning TEXT...)' + When this function is evaluated, 'make' generates a warning with + the message TEXT. + *Note Functions That Control Make: Make Control Functions. + +'$(shell COMMAND)' + Execute a shell command and return its output. + *Note The 'shell' Function: Shell Function. + +'$(origin VARIABLE)' + Return a string describing how the 'make' variable VARIABLE was + defined. + *Note The 'origin' Function: Origin Function. + +'$(flavor VARIABLE)' + Return a string describing the flavor of the 'make' variable + VARIABLE. + *Note The 'flavor' Function: Flavor Function. + +'$(foreach VAR,WORDS,TEXT)' + Evaluate TEXT with VAR bound to each word in WORDS, and concatenate + the results. + *Note The 'foreach' Function: Foreach Function. + +'$(if CONDITION,THEN-PART[,ELSE-PART])' + Evaluate the condition CONDITION; if it's non-empty substitute the + expansion of the THEN-PART otherwise substitute the expansion of + the ELSE-PART. + *Note Functions for Conditionals: Conditional Functions. + +'$(or CONDITION1[,CONDITION2[,CONDITION3...]])' + Evaluate each condition CONDITIONN one at a time; substitute the + first non-empty expansion. If all expansions are empty, substitute + the empty string. + *Note Functions for Conditionals: Conditional Functions. + +'$(and CONDITION1[,CONDITION2[,CONDITION3...]])' + Evaluate each condition CONDITIONN one at a time; if any expansion + results in the empty string substitute the empty string. If all + expansions result in a non-empty string, substitute the expansion + of the last CONDITION. + *Note Functions for Conditionals: Conditional Functions. + +'$(call VAR,PARAM,...)' + Evaluate the variable VAR replacing any references to '$(1)', + '$(2)' with the first, second, etc. PARAM values. + *Note The 'call' Function: Call Function. + +'$(eval TEXT)' + Evaluate TEXT then read the results as makefile commands. Expands + to the empty string. + *Note The 'eval' Function: Eval Function. + +'$(file OP FILENAME,TEXT)' + Expand the arguments, then open the file FILENAME using mode OP and + write TEXT to that file. + *Note The 'file' Function: File Function. + +'$(value VAR)' + Evaluates to the contents of the variable VAR, with no expansion + performed on it. + *Note The 'value' Function: Value Function. + + Here is a summary of the automatic variables. *Note Automatic +Variables::, for full information. + +'$@' + The file name of the target. + +'$%' + The target member name, when the target is an archive member. + +'$<' + The name of the first prerequisite. + +'$?' + 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::). + +'$^' +'$+' + The names of all the prerequisites, with spaces between them. For + prerequisites which are archive members, only the named member is + used (*note Archives::). The value of '$^' omits duplicate + prerequisites, while '$+' retains them and preserves their order. + +'$*' + The stem with which an implicit rule matches (*note How Patterns + Match: Pattern Match.). + +'$(@D)' +'$(@F)' + The directory part and the file-within-directory part of '$@'. + +'$(*D)' +'$(*F)' + The directory part and the file-within-directory part of '$*'. + +'$(%D)' +'$(%F)' + The directory part and the file-within-directory part of '$%'. + +'$( tar-`sed -e '/version_string/!d' \ + -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ + -e q + version.c`.shar.Z + + .PHONY: dist + dist: $(SRCS) $(AUX) + echo tar-`sed \ + -e '/version_string/!d' \ + -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ + -e q + version.c` > .fname + -rm -rf `cat .fname` + mkdir `cat .fname` + ln $(SRCS) $(AUX) `cat .fname` + tar chZf `cat .fname`.tar.Z `cat .fname` + -rm -rf `cat .fname` .fname + + tar.zoo: $(SRCS) $(AUX) + -rm -rf tmp.dir + -mkdir tmp.dir + -rm tar.zoo + for X in $(SRCS) $(AUX) ; do \ + echo $$X ; \ + sed 's/$$/^M/' $$X \ + > tmp.dir/$$X ; done + cd tmp.dir ; zoo aM ../tar.zoo * + -rm -rf tmp.dir + + +File: make.info, Node: GNU Free Documentation License, Next: Concept Index, Prev: Complex Makefile, Up: Top + +Appendix D GNU Free Documentation License +***************************************** + + Version 1.3, 3 November 2008 + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled "History" in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + "History" section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version's + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + 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, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + 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 + . + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: make.info, Node: Concept Index, Next: Name Index, Prev: GNU Free Documentation License, Up: Top + +Index of Concepts +***************** + +[index] +* Menu: + +* !=: Setting. (line 6) +* !=, expansion: Reading Makefiles. (line 34) +* # (comments), in makefile: Makefile Contents. (line 41) +* # (comments), in recipes: Recipe Syntax. (line 29) +* #include: Automatic Prerequisites. + (line 16) +* $, in function call: Syntax of Functions. (line 6) +* $, in rules: Rule Syntax. (line 33) +* $, in variable name: Computed Names. (line 6) +* $, in variable reference: Reference. (line 6) +* %, in pattern rules: Pattern Intro. (line 9) +* %, quoting in patsubst: Text Functions. (line 26) +* %, quoting in static pattern: Static Usage. (line 37) +* %, quoting in vpath: Selective Search. (line 39) +* %, quoting with \ (backslash): Selective Search. (line 39) +* %, quoting with \ (backslash) <1>: Static Usage. (line 37) +* %, quoting with \ (backslash) <2>: Text Functions. (line 26) +* * (wildcard character): Wildcards. (line 6) +* +, and define: Canned Recipes. (line 49) +* +, and recipe execution: Instead of Execution. + (line 67) +* +, and recipes: MAKE Variable. (line 18) +* +=: Appending. (line 6) +* +=, 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 285) +* --assume-new, and recursion: Options/Recursion. (line 22) +* --assume-old: Avoiding Compilation. + (line 6) +* --assume-old <1>: Options Summary. (line 164) +* --assume-old, and recursion: Options/Recursion. (line 22) +* --check-symlink-times: Options Summary. (line 145) +* --debug: Options Summary. (line 43) +* --directory: Recursion. (line 20) +* --directory <1>: Options Summary. (line 26) +* --directory, and --print-directory: -w Option. (line 20) +* --directory, and recursion: Options/Recursion. (line 22) +* --dry-run: Echoing. (line 18) +* --dry-run <1>: Instead of Execution. + (line 14) +* --dry-run <2>: Options Summary. (line 155) +* --environment-overrides: Options Summary. (line 85) +* --eval: Options Summary. (line 90) +* --file: Makefile Names. (line 23) +* --file <1>: Makefile Arguments. (line 6) +* --file <2>: Options Summary. (line 98) +* --file, and recursion: Options/Recursion. (line 22) +* --help: Options Summary. (line 104) +* --ignore-errors: Errors. (line 30) +* --ignore-errors <1>: Options Summary. (line 109) +* --include-dir: Include. (line 53) +* --include-dir <1>: Options Summary. (line 114) +* --jobs: Parallel. (line 6) +* --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 154) +* --keep-going: Errors. (line 46) +* --keep-going <1>: Testing. (line 16) +* --keep-going <2>: Options Summary. (line 130) +* --load-average: Parallel. (line 35) +* --load-average <1>: Options Summary. (line 137) +* --makefile: Makefile Names. (line 23) +* --makefile <1>: Makefile Arguments. (line 6) +* --makefile <2>: Options Summary. (line 99) +* --max-load: Parallel. (line 35) +* --max-load <1>: Options Summary. (line 138) +* --new-file: Instead of Execution. + (line 41) +* --new-file <1>: Options Summary. (line 284) +* --new-file, and recursion: Options/Recursion. (line 22) +* --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 276) +* --old-file: Avoiding Compilation. + (line 6) +* --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 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 202) +* --quiet: Echoing. (line 24) +* --quiet <1>: Options Summary. (line 233) +* --recon: Echoing. (line 18) +* --recon <1>: Instead of Execution. + (line 14) +* --recon <2>: Options Summary. (line 156) +* --silent: Echoing. (line 24) +* --silent <1>: Options Summary. (line 232) +* --stop: Options Summary. (line 240) +* --touch: Instead of Execution. + (line 24) +* --touch <1>: Options Summary. (line 248) +* --touch, and recursion: MAKE Variable. (line 35) +* --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 283) +* -b: Options Summary. (line 9) +* -B: Options Summary. (line 14) +* -C: Recursion. (line 20) +* -C <1>: Options Summary. (line 25) +* -C, and -w: -w Option. (line 20) +* -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 97) +* -f, and recursion: Options/Recursion. (line 22) +* -h: Options Summary. (line 103) +* -I: Include. (line 53) +* -i: Errors. (line 30) +* -i <1>: Options Summary. (line 108) +* -I <1>: Options Summary. (line 113) +* -j: Parallel. (line 6) +* -j <1>: Options Summary. (line 120) +* -j, and archive update: Archive Pitfalls. (line 6) +* -j, and recursion: Options/Recursion. (line 25) +* -k: Errors. (line 46) +* -k <1>: Testing. (line 16) +* -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) +* -M (to compiler): Automatic Prerequisites. + (line 18) +* -MM (to GNU compiler): Automatic Prerequisites. + (line 67) +* -n: Echoing. (line 18) +* -n <1>: Instead of Execution. + (line 14) +* -n <2>: Options Summary. (line 153) +* -O: Parallel Output. (line 11) +* -o: Avoiding Compilation. + (line 6) +* -o <1>: Options Summary. (line 162) +* -O <1>: Options Summary. (line 171) +* -o, and recursion: Options/Recursion. (line 22) +* -p: Options Summary. (line 187) +* -q: Instead of Execution. + (line 32) +* -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 231) +* -S: Options Summary. (line 238) +* -t: Instead of Execution. + (line 24) +* -t <1>: Options Summary. (line 247) +* -t, and recursion: MAKE Variable. (line 35) +* -v: Options Summary. (line 262) +* -W: Instead of Execution. + (line 41) +* -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) +* -w, disabling: -w Option. (line 20) +* .a (archives): Archive Suffix Rules. + (line 6) +* .c: Catalogue of Rules. (line 35) +* .C: Catalogue of Rules. (line 39) +* .cc: Catalogue of Rules. (line 39) +* .ch: Catalogue of Rules. (line 149) +* .cpp: Catalogue of Rules. (line 39) +* .d: Automatic Prerequisites. + (line 80) +* .def: Catalogue of Rules. (line 71) +* .dvi: Catalogue of Rules. (line 149) +* .f: Catalogue of Rules. (line 49) +* .F: Catalogue of Rules. (line 49) +* .info: Catalogue of Rules. (line 156) +* .l: Catalogue of Rules. (line 121) +* .LIBPATTERNS, and link libraries: Libraries/Search. (line 6) +* .ln: Catalogue of Rules. (line 143) +* .mod: Catalogue of Rules. (line 71) +* .o: Catalogue of Rules. (line 35) +* .o <1>: Catalogue of Rules. (line 83) +* .ONESHELL, use of: One Shell. (line 6) +* .p: Catalogue of Rules. (line 45) +* .PRECIOUS intermediate files: Chained Rules. (line 56) +* .r: Catalogue of Rules. (line 49) +* .s: Catalogue of Rules. (line 76) +* .S: Catalogue of Rules. (line 79) +* .sh: Catalogue of Rules. (line 178) +* .SHELLFLAGS, value of: Choosing the Shell. (line 6) +* .sym: Catalogue of Rules. (line 71) +* .tex: Catalogue of Rules. (line 149) +* .texi: Catalogue of Rules. (line 156) +* .texinfo: Catalogue of Rules. (line 156) +* .txinfo: Catalogue of Rules. (line 156) +* .w: Catalogue of Rules. (line 149) +* .web: Catalogue of Rules. (line 149) +* .y: Catalogue of Rules. (line 117) +* :: rules (double-colon): Double-Colon. (line 6) +* ::=: Flavors. (line 56) +* ::= <1>: Setting. (line 6) +* :=: Flavors. (line 56) +* := <1>: Setting. (line 6) +* =: Flavors. (line 10) +* = <1>: Setting. (line 6) +* =, expansion: Reading Makefiles. (line 34) +* ? (wildcard character): Wildcards. (line 6) +* ?=: Flavors. (line 135) +* ?= <1>: Setting. (line 6) +* ?=, expansion: Reading Makefiles. (line 34) +* @ (in recipes): Echoing. (line 6) +* @, and define: Canned Recipes. (line 49) +* [...] (wildcard characters): Wildcards. (line 6) +* \ (backslash), for continuation lines: Simple Makefile. (line 41) +* \ (backslash), in recipes: Splitting Recipe Lines. + (line 6) +* \ (backslash), to quote %: Selective Search. (line 39) +* \ (backslash), to quote % <1>: Static Usage. (line 37) +* \ (backslash), to quote % <2>: Text Functions. (line 26) +* __.SYMDEF: Archive Symbols. (line 6) +* ~ (tilde): Wildcards. (line 11) +* abspath: File Name Functions. (line 120) +* algorithm for directory search: Search Algorithm. (line 6) +* all (standard target): Goals. (line 73) +* appending to variables: Appending. (line 6) +* ar: Implicit Variables. (line 40) +* archive: Archives. (line 6) +* archive member targets: Archive Members. (line 6) +* archive symbol directory updating: Archive Symbols. (line 6) +* archive, and -j: Archive Pitfalls. (line 6) +* archive, and parallel execution: Archive Pitfalls. (line 6) +* archive, suffix rule for: Archive Suffix Rules. + (line 6) +* Arg list too long: Options/Recursion. (line 58) +* arguments of functions: Syntax of Functions. (line 6) +* as: Catalogue of Rules. (line 76) +* as <1>: Implicit Variables. (line 43) +* assembly, rule to compile: Catalogue of Rules. (line 76) +* automatic generation of prerequisites: Include. (line 51) +* automatic generation of prerequisites <1>: Automatic Prerequisites. + (line 6) +* automatic variables: Automatic Variables. (line 6) +* automatic variables in prerequisites: Automatic Variables. (line 17) +* backquotes: Shell Function. (line 6) +* backslash (\), for continuation lines: Simple Makefile. (line 41) +* backslash (\), in recipes: Splitting Recipe Lines. + (line 6) +* backslash (\), to quote %: Selective Search. (line 39) +* backslash (\), to quote % <1>: Static Usage. (line 37) +* backslash (\), to quote % <2>: Text Functions. (line 26) +* backslash (\), to quote newlines: Splitting Lines. (line 6) +* backslashes in pathnames and wildcard expansion: Wildcard Pitfall. + (line 31) +* basename: File Name Functions. (line 56) +* binary packages: Install Command Categories. + (line 80) +* broken pipe: Parallel Input. (line 11) +* bugs, reporting: Bugs. (line 6) +* built-in special targets: Special Targets. (line 6) +* C++, rule to compile: Catalogue of Rules. (line 39) +* C, rule to compile: Catalogue of Rules. (line 35) +* canned recipes: Canned Recipes. (line 6) +* cc: Catalogue of Rules. (line 35) +* cc <1>: Implicit Variables. (line 46) +* cd (shell command): Execution. (line 12) +* cd (shell command) <1>: MAKE Variable. (line 16) +* chains of rules: Chained Rules. (line 6) +* check (standard target): Goals. (line 115) +* clean (standard target): Goals. (line 76) +* clean target: Simple Makefile. (line 85) +* clean target <1>: Cleanup. (line 11) +* cleaning up: Cleanup. (line 6) +* clobber (standard target): Goals. (line 87) +* co: Catalogue of Rules. (line 163) +* co <1>: Implicit Variables. (line 66) +* combining rules by prerequisite: Combine By Prerequisite. + (line 6) +* command expansion: Shell Function. (line 6) +* command line variable definitions, and recursion: Options/Recursion. + (line 17) +* command line variables: Overriding. (line 6) +* commands, sequences of: Canned Recipes. (line 6) +* comments, in makefile: Makefile Contents. (line 41) +* comments, in recipes: Recipe Syntax. (line 29) +* compatibility: Features. (line 6) +* compatibility in exporting: Variables/Recursion. (line 104) +* compilation, testing: Testing. (line 6) +* computed variable name: Computed Names. (line 6) +* conditional expansion: Conditional Functions. + (line 6) +* conditional variable assignment: Flavors. (line 135) +* conditionals: Conditionals. (line 6) +* continuation lines: Simple Makefile. (line 41) +* controlling make: Make Control Functions. + (line 6) +* conventions for makefiles: Makefile Conventions. + (line 6) +* convert guile types: Guile Types. (line 6) +* ctangle: Catalogue of Rules. (line 149) +* 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 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 34) +* defining variables verbatim: Multi-Line. (line 6) +* 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) +* directories, printing them: -w Option. (line 6) +* directories, updating archive symbol: Archive Symbols. (line 6) +* directory part: File Name Functions. (line 16) +* directory search (VPATH): Directory Search. (line 6) +* directory search (VPATH), and implicit rules: Implicit/Search. + (line 6) +* directory search (VPATH), and link libraries: Libraries/Search. + (line 6) +* directory search (VPATH), and recipes: Recipes/Search. (line 6) +* directory search algorithm: Search Algorithm. (line 6) +* directory search, traditional (GPATH): Search Algorithm. (line 42) +* dist (standard target): Goals. (line 107) +* distclean (standard target): Goals. (line 85) +* dollar sign ($), in function call: Syntax of Functions. (line 6) +* dollar sign ($), in rules: Rule Syntax. (line 33) +* dollar sign ($), in variable name: Computed Names. (line 6) +* dollar sign ($), in variable reference: Reference. (line 6) +* DOS, choosing a shell in: Choosing the Shell. (line 38) +* double-colon rules: Double-Colon. (line 6) +* duplicate words, removing: Text Functions. (line 155) +* E2BIG: Options/Recursion. (line 58) +* echoing of recipes: Echoing. (line 6) +* editor: Introduction. (line 22) +* Emacs (M-x compile): Errors. (line 61) +* empty recipes: Empty Recipes. (line 6) +* empty targets: Empty Targets. (line 6) +* environment: Environment. (line 6) +* environment, and recursion: Variables/Recursion. (line 6) +* environment, SHELL in: Choosing the Shell. (line 12) +* error, stopping on: Make Control Functions. + (line 11) +* errors (in recipes): Errors. (line 6) +* errors with wildcards: Wildcard Pitfall. (line 6) +* evaluating makefile syntax: Eval Function. (line 6) +* example of loaded objects: Loaded Object Example. + (line 6) +* example using Guile: Guile Example. (line 6) +* execution, in parallel: Parallel. (line 6) +* execution, instead of: Instead of Execution. + (line 6) +* execution, of recipes: Execution. (line 6) +* exit status (errors): Errors. (line 6) +* 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 93) +* explicit rules, secondary expansion of: Secondary Expansion. + (line 104) +* exporting variables: Variables/Recursion. (line 6) +* extensions, Guile: Guile Integration. (line 6) +* extensions, load directive: load Directive. (line 6) +* extensions, loading: Loading Objects. (line 6) +* f77: Catalogue of Rules. (line 49) +* f77 <1>: Implicit Variables. (line 57) +* FDL, GNU Free Documentation License: GNU Free Documentation License. + (line 6) +* features of GNU make: Features. (line 6) +* features, missing: Missing. (line 6) +* file name functions: File Name Functions. (line 6) +* file name of makefile: Makefile Names. (line 6) +* file name of makefile, how to specify: Makefile Names. (line 31) +* file name prefix, adding: File Name Functions. (line 78) +* file name suffix: File Name Functions. (line 42) +* file name suffix, adding: File Name Functions. (line 67) +* file name with wildcards: Wildcards. (line 6) +* file name, abspath of: File Name Functions. (line 120) +* file name, basename of: File Name Functions. (line 56) +* file name, directory part: File Name Functions. (line 16) +* file name, nondirectory part: File Name Functions. (line 26) +* file name, realpath of: File Name Functions. (line 113) +* file, reading from: File Function. (line 6) +* file, writing to: File Function. (line 6) +* files, assuming new: Instead of Execution. + (line 41) +* files, assuming old: Avoiding Compilation. + (line 6) +* files, avoiding recompilation of: Avoiding Compilation. + (line 6) +* files, intermediate: Chained Rules. (line 16) +* filtering out words: Text Functions. (line 133) +* filtering words: Text Functions. (line 115) +* finding strings: Text Functions. (line 104) +* flags: Options Summary. (line 6) +* flags for compilers: Implicit Variables. (line 6) +* flavor of variable: Flavor Function. (line 6) +* flavors of variables: Flavors. (line 6) +* FORCE: Force Targets. (line 6) +* force targets: Force Targets. (line 6) +* Fortran, rule to compile: Catalogue of Rules. (line 49) +* functions: Functions. (line 6) +* functions, for controlling make: Make Control Functions. + (line 6) +* functions, for file names: File Name Functions. (line 6) +* functions, for text: Text Functions. (line 6) +* functions, syntax of: Syntax of Functions. (line 6) +* functions, user defined: Call Function. (line 6) +* g++: Catalogue of Rules. (line 39) +* g++ <1>: Implicit Variables. (line 49) +* gcc: Catalogue of Rules. (line 35) +* generating prerequisites automatically: Include. (line 51) +* generating prerequisites automatically <1>: Automatic Prerequisites. + (line 6) +* get: Catalogue of Rules. (line 172) +* get <1>: Implicit Variables. (line 69) +* globbing (wildcards): Wildcards. (line 6) +* goal: How Make Works. (line 11) +* 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 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 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) +* implicit rule, search algorithm: Implicit Rule Search. + (line 6) +* implicit rules, secondary expansion of: Secondary Expansion. + (line 144) +* included makefiles, default directories: Include. (line 53) +* including (MAKEFILES variable): MAKEFILES Variable. (line 6) +* 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) +* input during parallel execution: Parallel Input. (line 6) +* install (standard target): Goals. (line 93) +* installation directories, creating: Directory Variables. (line 20) +* installations, staged: DESTDIR. (line 6) +* interface for loaded objects: Loaded Object API. (line 6) +* intermediate files: Chained Rules. (line 16) +* intermediate files, preserving: Chained Rules. (line 46) +* intermediate targets, explicit: Special Targets. (line 48) +* interrupt: Interrupts. (line 6) +* job slots: Parallel. (line 6) +* job slots, and recursion: Options/Recursion. (line 25) +* job slots, sharing: Job Slots. (line 6) +* jobs, limiting based on load: Parallel. (line 35) +* jobserver: Job Slots. (line 16) +* jobserver on POSIX: POSIX Jobserver. (line 6) +* jobserver on Windows: Windows Jobserver. (line 6) +* joining lists of words: File Name Functions. (line 89) +* killing (interruption): Interrupts. (line 6) +* last-resort default rules: Last Resort. (line 6) +* ld: Catalogue of Rules. (line 83) +* lex: Catalogue of Rules. (line 121) +* lex <1>: Implicit Variables. (line 73) +* Lex, rule to run: Catalogue of Rules. (line 121) +* libraries for linking, directory search: Libraries/Search. (line 6) +* library archive, suffix rule for: Archive Suffix Rules. + (line 6) +* limiting jobs based on load: Parallel. (line 35) +* link libraries, and directory search: Libraries/Search. (line 6) +* link libraries, patterns matching: Libraries/Search. (line 6) +* linking, predefined rule for: Catalogue of Rules. (line 83) +* 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 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) +* loaded object example: Loaded Object Example. + (line 6) +* loaded object licensing: Loaded Object API. (line 31) +* loaded objects: Loading Objects. (line 6) +* loaded objects, remaking of: Remaking Loaded Objects. + (line 6) +* long lines, splitting: Splitting Lines. (line 6) +* loops in variable expansion: Flavors. (line 44) +* lpr (shell command): Wildcard Examples. (line 21) +* lpr (shell command) <1>: Empty Targets. (line 25) +* m2c: Catalogue of Rules. (line 71) +* m2c <1>: Implicit Variables. (line 60) +* macro: Using Variables. (line 10) +* make depend: Automatic Prerequisites. + (line 37) +* make extensions: Extending make. (line 6) +* make integration: Integrating make. (line 6) +* make interface to guile: Guile Interface. (line 6) +* make procedures in guile: Guile Interface. (line 6) +* makefile: Introduction. (line 7) +* makefile name: Makefile Names. (line 6) +* makefile name, how to specify: Makefile Names. (line 31) +* makefile rule parts: Rule Introduction. (line 6) +* makefile syntax, evaluating: Eval Function. (line 6) +* makefile, and MAKEFILES variable: MAKEFILES Variable. (line 6) +* makefile, conventions for: Makefile Conventions. + (line 6) +* makefile, how make processes: How Make Works. (line 6) +* makefile, how to write: Makefiles. (line 6) +* makefile, including: Include. (line 6) +* makefile, overriding: Overriding 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. + (line 6) +* match-anything rule, used to override: Overriding Makefiles. + (line 12) +* missing features: Missing. (line 6) +* mistakes with wildcards: Wildcard Pitfall. (line 6) +* modified variable reference: Substitution Refs. (line 6) +* Modula-2, rule to compile: Catalogue of Rules. (line 71) +* mostlyclean (standard target): Goals. (line 79) +* multi-line variable definition: Multi-Line. (line 6) +* 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 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) +* newline, quoting, in makefile: Simple Makefile. (line 41) +* newline, quoting, in recipes: Splitting Recipe Lines. + (line 6) +* nondirectory part: File Name Functions. (line 26) +* normal prerequisites: Prerequisite Types. (line 6) +* obj: Variables Simplify. (line 20) +* OBJ: Variables Simplify. (line 20) +* objects: Variables Simplify. (line 14) +* OBJECTS: Variables Simplify. (line 20) +* objects, loaded: Loading Objects. (line 6) +* objs: Variables Simplify. (line 20) +* OBJS: Variables Simplify. (line 20) +* old-fashioned suffix rules: Suffix Rules. (line 6) +* options: Options Summary. (line 6) +* options, and recursion: Options/Recursion. (line 6) +* options, setting from environment: Options/Recursion. (line 81) +* options, setting in makefiles: Options/Recursion. (line 81) +* order of pattern rules: Pattern Match. (line 30) +* 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 172) +* overriding makefiles: Overriding Makefiles. + (line 6) +* overriding variables with arguments: Overriding. (line 6) +* overriding with override: Override Directive. (line 6) +* parallel execution: Parallel. (line 6) +* 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 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 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) +* pattern-specific variables: Pattern-specific. (line 6) +* pc: Catalogue of Rules. (line 45) +* pc <1>: Implicit Variables. (line 63) +* phony targets: Phony Targets. (line 6) +* phony targets and recipe execution: Instead of Execution. + (line 75) +* pitfalls of wildcards: Wildcard Pitfall. (line 6) +* plugin_is_GPL_compatible: Loaded Object API. (line 31) +* portability: Features. (line 6) +* POSIX: Overview. (line 13) +* POSIX <1>: Options/Recursion. (line 61) +* 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 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 93) +* prerequisites: Rule Syntax. (line 47) +* prerequisites, and automatic variables: Automatic Variables. + (line 17) +* prerequisites, automatic generation: Include. (line 51) +* prerequisites, automatic generation <1>: Automatic Prerequisites. + (line 6) +* prerequisites, introduction to: Rule Introduction. (line 8) +* 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) +* preserving intermediate files: Chained Rules. (line 46) +* preserving with .PRECIOUS: Special Targets. (line 32) +* preserving with .PRECIOUS <1>: Chained Rules. (line 56) +* preserving with .SECONDARY: Special Targets. (line 54) +* print (standard target): Goals. (line 98) +* print target: Wildcard Examples. (line 21) +* print target <1>: Empty Targets. (line 25) +* printing directories: -w Option. (line 6) +* printing messages: Make Control Functions. + (line 43) +* printing of recipes: Echoing. (line 6) +* printing user warnings: Make Control Functions. + (line 35) +* problems and bugs, reporting: Bugs. (line 6) +* problems with wildcards: Wildcard Pitfall. (line 6) +* processing a makefile: How Make Works. (line 6) +* question mode: Instead of Execution. + (line 32) +* quoting %, in patsubst: Text Functions. (line 26) +* quoting %, in static pattern: Static Usage. (line 37) +* quoting %, in vpath: Selective Search. (line 39) +* quoting newline, in makefile: Simple Makefile. (line 41) +* quoting newline, in recipes: Splitting Recipe Lines. + (line 6) +* Ratfor, rule to compile: Catalogue of Rules. (line 49) +* RCS, rule to extract from: Catalogue of Rules. (line 163) +* reading from a file: File Function. (line 6) +* reading makefiles: Reading Makefiles. (line 6) +* README: Makefile Names. (line 9) +* realclean (standard target): Goals. (line 86) +* realpath: File Name Functions. (line 113) +* recipe: Simple Makefile. (line 74) +* 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) +* recipes: Rule Syntax. (line 25) +* recipes <1>: Recipes. (line 6) +* recipes setting shell variables: Execution. (line 12) +* recipes, and directory search: Recipes/Search. (line 6) +* recipes, backslash (\) in: Splitting Recipe Lines. + (line 6) +* recipes, canned: Canned Recipes. (line 6) +* recipes, comments in: Recipe Syntax. (line 29) +* recipes, echoing: Echoing. (line 6) +* recipes, empty: Empty Recipes. (line 6) +* recipes, errors in: Errors. (line 6) +* recipes, execution in parallel: Parallel. (line 6) +* recipes, how to write: Recipes. (line 6) +* recipes, instead of executing: Instead of Execution. + (line 6) +* recipes, introduction to: Rule Introduction. (line 8) +* recipes, quoting newlines in: Splitting Recipe Lines. + (line 6) +* recipes, splitting: Splitting Recipe Lines. + (line 6) +* recipes, using variables in: Variables in Recipes. + (line 6) +* recompilation: Introduction. (line 22) +* recompilation, avoiding: Avoiding Compilation. + (line 6) +* recording events with empty targets: Empty Targets. (line 6) +* recursion: Recursion. (line 6) +* recursion, and -C: Options/Recursion. (line 22) +* recursion, and -f: Options/Recursion. (line 22) +* recursion, and -j: Options/Recursion. (line 25) +* recursion, and -o: Options/Recursion. (line 22) +* recursion, and -t: MAKE Variable. (line 35) +* recursion, and -W: Options/Recursion. (line 22) +* recursion, and -w: -w Option. (line 20) +* recursion, and command line variable definitions: Options/Recursion. + (line 17) +* recursion, and environment: Variables/Recursion. (line 6) +* recursion, and MAKE variable: MAKE Variable. (line 6) +* recursion, and MAKEFILES variable: MAKEFILES Variable. (line 15) +* recursion, and options: Options/Recursion. (line 6) +* recursion, and printing directories: -w Option. (line 6) +* recursion, and variables: Variables/Recursion. (line 6) +* recursion, level of: Variables/Recursion. (line 114) +* recursive variable expansion: Using Variables. (line 6) +* recursive variable expansion <1>: Flavors. (line 6) +* recursively expanded variables: Flavors. (line 6) +* reference to variables: Reference. (line 6) +* reference to variables <1>: Advanced. (line 6) +* relinking: How Make Works. (line 46) +* remaking loaded objects: Remaking Loaded Objects. + (line 6) +* remaking makefiles: Remaking Makefiles. (line 6) +* 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) +* rm (shell command): Simple Makefile. (line 85) +* rm (shell command) <1>: Wildcard Examples. (line 12) +* rm (shell command) <2>: Phony Targets. (line 20) +* rm (shell command) <3>: Errors. (line 27) +* rule prerequisites: Rule Syntax. (line 47) +* rule syntax: Rule Syntax. (line 6) +* rule targets: Rule Syntax. (line 18) +* rule, double-colon (::): Double-Colon. (line 6) +* rule, explicit, definition of: Makefile Contents. (line 10) +* rule, how to write: Rules. (line 6) +* rule, implicit: Implicit Rules. (line 6) +* rule, implicit, and directory search: Implicit/Search. (line 6) +* rule, implicit, and VPATH: Implicit/Search. (line 6) +* rule, implicit, chains of: Chained Rules. (line 6) +* rule, implicit, definition of: Makefile Contents. (line 16) +* rule, implicit, how to use: Using Implicit. (line 6) +* rule, implicit, introduction to: make Deduces. (line 6) +* rule, implicit, predefined: Catalogue of Rules. (line 6) +* rule, introduction to: Rule Introduction. (line 6) +* rule, multiple for one target: Multiple Rules. (line 6) +* rule, no recipe or prerequisites: Force Targets. (line 6) +* rule, pattern: Pattern Intro. (line 6) +* rule, static pattern: Static Pattern. (line 6) +* rule, static pattern versus implicit: Static versus Implicit. + (line 6) +* rule, with multiple targets: Multiple Targets. (line 6) +* rules, and $: Rule Syntax. (line 33) +* s. (SCCS file prefix): Catalogue of Rules. (line 172) +* SCCS, rule to extract from: Catalogue of Rules. (line 172) +* search algorithm, implicit rule: Implicit Rule Search. + (line 6) +* search path for prerequisites (VPATH): Directory Search. (line 6) +* search path for prerequisites (VPATH), and implicit rules: Implicit/Search. + (line 6) +* search path for prerequisites (VPATH), and link libraries: Libraries/Search. + (line 6) +* searching for strings: Text Functions. (line 104) +* secondary expansion: Secondary Expansion. (line 6) +* secondary expansion and explicit rules: Secondary Expansion. + (line 104) +* secondary expansion and implicit rules: Secondary Expansion. + (line 144) +* secondary expansion and static pattern rules: Secondary Expansion. + (line 136) +* secondary files: Chained Rules. (line 46) +* secondary targets: Special Targets. (line 54) +* sed (shell command): Automatic Prerequisites. + (line 72) +* selecting a word: Text Functions. (line 159) +* selecting word lists: Text Functions. (line 168) +* sequences of commands: Canned Recipes. (line 6) +* setting options from environment: Options/Recursion. (line 81) +* setting options in makefiles: Options/Recursion. (line 81) +* setting variables: Setting. (line 6) +* several rules for one target: Multiple Rules. (line 6) +* several targets in a rule: Multiple Targets. (line 6) +* shar (standard target): Goals. (line 104) +* shell command, function for: Shell Function. (line 6) +* shell file name pattern (in include): Include. (line 13) +* shell variables, setting in recipes: Execution. (line 12) +* shell wildcards (in include): Include. (line 13) +* shell, choosing the: Choosing the Shell. (line 6) +* SHELL, exported value: Variables/Recursion. (line 23) +* SHELL, import from environment: Environment. (line 37) +* shell, in DOS and Windows: Choosing the Shell. (line 38) +* SHELL, MS-DOS specifics: Choosing the Shell. (line 44) +* SHELL, value of: Choosing the Shell. (line 6) +* signal: Interrupts. (line 6) +* silent operation: Echoing. (line 6) +* simple makefile: Simple Makefile. (line 6) +* simple variable expansion: Using Variables. (line 6) +* simplifying with variables: Variables Simplify. (line 6) +* simply expanded variables: Flavors. (line 56) +* sorting words: Text Functions. (line 147) +* spaces, in variable values: Flavors. (line 107) +* spaces, stripping: Text Functions. (line 80) +* special targets: Special Targets. (line 6) +* special variables: Special Variables. (line 6) +* specifying makefile name: Makefile Names. (line 31) +* splitting long lines: Splitting Lines. (line 6) +* splitting recipes: Splitting Recipe Lines. + (line 6) +* staged installs: DESTDIR. (line 6) +* standard input: Parallel Input. (line 6) +* standards conformance: Overview. (line 13) +* standards for makefiles: Makefile Conventions. + (line 6) +* static pattern rule: Static Pattern. (line 6) +* static pattern rule, syntax of: Static Usage. (line 6) +* static pattern rule, versus implicit: Static versus Implicit. + (line 6) +* static pattern rules, secondary expansion of: Secondary Expansion. + (line 136) +* stem: Static Usage. (line 17) +* stem <1>: Pattern Match. (line 6) +* stem, shortest: Pattern Match. (line 38) +* stem, variable for: Automatic Variables. (line 78) +* stopping make: Make Control Functions. + (line 11) +* strings, searching for: Text Functions. (line 104) +* stripping whitespace: Text Functions. (line 80) +* sub-make: Variables/Recursion. (line 6) +* subdirectories, recursion for: Recursion. (line 6) +* substitution variable reference: Substitution Refs. (line 6) +* suffix rule: Suffix Rules. (line 6) +* suffix rule, for archive: Archive Suffix Rules. + (line 6) +* suffix, adding: File Name Functions. (line 67) +* suffix, function to find: File Name Functions. (line 42) +* suffix, substituting in variables: Substitution Refs. (line 6) +* suppressing inheritance: Suppressing Inheritance. + (line 6) +* switches: Options Summary. (line 6) +* symbol directories, updating archive: Archive Symbols. (line 6) +* syntax of recipe: Recipe Syntax. (line 6) +* syntax of rules: Rule Syntax. (line 6) +* tab character (in commands): Rule Syntax. (line 25) +* tabs in rules: Rule Introduction. (line 21) +* TAGS (standard target): Goals. (line 112) +* tangle: Catalogue of Rules. (line 149) +* tangle <1>: Implicit Variables. (line 100) +* tar (standard target): Goals. (line 101) +* 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 63) +* target, deleting on interrupt: Interrupts. (line 6) +* 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) +* target-specific variables: Target-specific. (line 6) +* targets: Rule Syntax. (line 18) +* targets without a file: Phony Targets. (line 6) +* 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) +* terminal rule: Match-Anything Rules. + (line 6) +* terminal, output to: Terminal Output. (line 6) +* test (standard target): Goals. (line 116) +* testing compilation: Testing. (line 6) +* tex: Catalogue of Rules. (line 149) +* tex <1>: Implicit Variables. (line 87) +* TeX, rule to run: Catalogue of Rules. (line 149) +* texi2dvi: Catalogue of Rules. (line 156) +* texi2dvi <1>: Implicit Variables. (line 91) +* Texinfo, rule to format: Catalogue of Rules. (line 156) +* tilde (~): Wildcards. (line 11) +* tools, sharing job slots: Job Slots. (line 6) +* touch (shell command): Wildcard Examples. (line 21) +* touch (shell command) <1>: Empty Targets. (line 25) +* touching files: Instead of Execution. + (line 24) +* 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 293) +* undefining variable: Undefine Directive. (line 6) +* updating archive symbol directories: Archive Symbols. (line 6) +* updating loaded objects: Remaking Loaded Objects. + (line 6) +* updating makefiles: Remaking Makefiles. (line 6) +* user defined functions: Call Function. (line 6) +* value: Using Variables. (line 6) +* value, how a variable gets it: Values. (line 6) +* variable: Using Variables. (line 6) +* variable definition: Makefile Contents. (line 22) +* variable references in recipes: Variables in Recipes. + (line 6) +* variables: Variables Simplify. (line 6) +* variables, $ in name: Computed Names. (line 6) +* variables, and implicit rule: Automatic Variables. (line 6) +* variables, appending to: Appending. (line 6) +* variables, automatic: Automatic Variables. (line 6) +* variables, command line: Overriding. (line 6) +* variables, command line, and recursion: Options/Recursion. (line 17) +* variables, computed names: Computed Names. (line 6) +* variables, conditional assignment: Flavors. (line 135) +* variables, defining verbatim: Multi-Line. (line 6) +* variables, environment: Variables/Recursion. (line 6) +* variables, environment <1>: Environment. (line 6) +* variables, exporting: Variables/Recursion. (line 6) +* variables, flavor of: Flavor Function. (line 6) +* variables, flavors: Flavors. (line 6) +* variables, how they get their values: Values. (line 6) +* variables, how to reference: Reference. (line 6) +* variables, loops in expansion: Flavors. (line 44) +* variables, modified reference: Substitution Refs. (line 6) +* variables, multi-line: Multi-Line. (line 6) +* variables, nested references: Computed Names. (line 6) +* variables, origin of: Origin Function. (line 6) +* variables, overriding: Override Directive. (line 6) +* variables, overriding with arguments: Overriding. (line 6) +* variables, pattern-specific: Pattern-specific. (line 6) +* variables, recursively expanded: Flavors. (line 6) +* variables, setting: Setting. (line 6) +* variables, simply expanded: Flavors. (line 56) +* variables, spaces in values: Flavors. (line 107) +* variables, substituting suffix in: Substitution Refs. (line 6) +* 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 293) +* varying prerequisites: Static Pattern. (line 6) +* verbatim variable definition: Multi-Line. (line 6) +* vpath: Directory Search. (line 6) +* VPATH, and implicit rules: Implicit/Search. (line 6) +* VPATH, and link libraries: Libraries/Search. (line 6) +* warnings, printing: Make Control Functions. + (line 35) +* weave: Catalogue of Rules. (line 149) +* weave <1>: Implicit Variables. (line 94) +* 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) +* wildcard pitfalls: Wildcard Pitfall. (line 6) +* wildcard, function: File Name Functions. (line 106) +* wildcard, in archive member: Archive Members. (line 36) +* wildcard, in include: Include. (line 13) +* wildcards and MS-DOS/MS-Windows backslashes: Wildcard Pitfall. + (line 31) +* Windows, choosing a shell in: Choosing the Shell. (line 38) +* word, selecting a: Text Functions. (line 159) +* words, extracting first: Text Functions. (line 185) +* words, extracting last: Text Functions. (line 198) +* words, filtering: Text Functions. (line 115) +* words, filtering out: Text Functions. (line 133) +* words, finding number: Text Functions. (line 180) +* words, iterating over: Foreach Function. (line 6) +* words, joining lists: File Name Functions. (line 89) +* words, removing duplicates: Text Functions. (line 155) +* words, selecting lists of: Text Functions. (line 168) +* writing recipes: Recipes. (line 6) +* writing rules: Rules. (line 6) +* writing to a file: File Function. (line 6) +* yacc: Catalogue of Rules. (line 117) +* yacc <1>: Implicit Variables. (line 77) +* yacc <2>: Canned Recipes. (line 18) +* Yacc, rule to run: Catalogue of Rules. (line 117) + + +File: make.info, Node: Name Index, Prev: Concept Index, Up: Top + +Index of Functions, Variables, & Directives +******************************************* + +[index] +* Menu: + +* $%: Automatic Variables. (line 37) +* $(%D): Automatic Variables. (line 129) +* $(%F): Automatic Variables. (line 130) +* $(*D): Automatic Variables. (line 124) +* $(*F): Automatic Variables. (line 125) +* $(+D): Automatic Variables. (line 147) +* $(+F): Automatic Variables. (line 148) +* $(: Last Resort. (line 23) +* .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 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) +* .INCLUDE_DIRS (list of include directories): Special Variables. + (line 174) +* .INTERMEDIATE: Special Targets. (line 47) +* .LIBPATTERNS: Libraries/Search. (line 6) +* .LOADED: load Directive. (line 62) +* .LOW_RESOLUTION_TIME: Special Targets. (line 90) +* .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 155) +* .POSIX <1>: Options/Recursion. (line 61) +* .PRECIOUS: Special Targets. (line 31) +* .PRECIOUS <1>: Interrupts. (line 22) +* .RECIPEPREFIX (change the recipe prefix character): Special Variables. + (line 99) +* .SECONDARY: Special Targets. (line 53) +* .SECONDEXPANSION: Secondary Expansion. (line 6) +* .SECONDEXPANSION <1>: Special Targets. (line 63) +* .SHELLFLAGS: Choosing the Shell. (line 6) +* .SHELLFLAGS <1>: Choosing the Shell. (line 87) +* .SHELLSTATUS: Shell Function. (line 25) +* .SILENT: Special Targets. (line 121) +* .SILENT <1>: Echoing. (line 24) +* .SUFFIXES: Special Targets. (line 16) +* .SUFFIXES <1>: Suffix Rules. (line 61) +* .VARIABLES (list of variables): Special Variables. (line 112) +* /usr/gnu/include: Include. (line 53) +* /usr/include: Include. (line 53) +* /usr/local/include: Include. (line 53) +* < (automatic variable): Automatic Variables. (line 43) +* : Conditional Functions. + (line 12) +* ifdef: Conditional Syntax. (line 6) +* ifeq: Conditional Syntax. (line 6) +* ifndef: Conditional Syntax. (line 6) +* ifneq: Conditional Syntax. (line 6) +* include: Include. (line 6) +* info: Make Control Functions. + (line 43) +* join: File Name Functions. (line 89) +* lastword: Text Functions. (line 198) +* LDFLAGS: Implicit Variables. (line 139) +* LDLIBS: Implicit Variables. (line 144) +* LEX: Implicit Variables. (line 72) +* LFLAGS: Implicit Variables. (line 150) +* libexecdir: Directory Variables. (line 70) +* LINT: Implicit Variables. (line 80) +* LINTFLAGS: Implicit Variables. (line 162) +* load: load Directive. (line 9) +* LOADLIBES: Implicit Variables. (line 144) +* M2C: Implicit Variables. (line 60) +* MAKE: MAKE Variable. (line 6) +* MAKE <1>: Flavors. (line 88) +* MAKECMDGOALS: Goals. (line 30) +* Makefile: Makefile Names. (line 7) +* makefile: Makefile Names. (line 7) +* MAKEFILES: MAKEFILES Variable. (line 6) +* MAKEFILES <1>: Variables/Recursion. (line 126) +* MAKEFILE_LIST (list of parsed makefiles): Special Variables. + (line 8) +* MAKEFLAGS: Options/Recursion. (line 6) +* MAKEINFO: Implicit Variables. (line 83) +* MAKELEVEL: Variables/Recursion. (line 114) +* MAKELEVEL <1>: Flavors. (line 88) +* MAKEOVERRIDES: Options/Recursion. (line 50) +* MAKESHELL (MS-DOS alternative to SHELL): Choosing the Shell. + (line 27) +* MAKE_HOST: Quick Reference. (line 348) +* MAKE_RESTARTS (number of times make has restarted): Special Variables. + (line 73) +* MAKE_TERMERR (whether stderr is a terminal): Special Variables. + (line 80) +* MAKE_TERMOUT (whether stdout is a terminal): Special Variables. + (line 80) +* MAKE_VERSION: Quick Reference. (line 343) +* MFLAGS: Options/Recursion. (line 66) +* notdir: File Name Functions. (line 26) +* or: Conditional Functions. + (line 37) +* origin: Origin Function. (line 6) +* OUTPUT_OPTION: Catalogue of Rules. (line 200) +* override: Override Directive. (line 6) +* patsubst: Substitution Refs. (line 28) +* patsubst <1>: Text Functions. (line 18) +* PC: Implicit Variables. (line 63) +* PFLAGS: Implicit Variables. (line 156) +* prefix: Directory Variables. (line 29) +* private: Suppressing Inheritance. + (line 6) +* realpath: File Name Functions. (line 113) +* RFLAGS: Implicit Variables. (line 159) +* RM: Implicit Variables. (line 106) +* sbindir: Directory Variables. (line 63) +* SHELL: Choosing the Shell. (line 6) +* SHELL <1>: Choosing the Shell. (line 88) +* shell: Shell Function. (line 6) +* SHELL (recipe execution): Execution. (line 6) +* sort: Text Functions. (line 147) +* strip: Text Functions. (line 80) +* subst: Multiple Targets. (line 39) +* subst <1>: Text Functions. (line 9) +* suffix: File Name Functions. (line 42) +* SUFFIXES: Suffix Rules. (line 81) +* TANGLE: Implicit Variables. (line 100) +* TEX: Implicit Variables. (line 87) +* TEXI2DVI: Implicit Variables. (line 90) +* undefine: Undefine Directive. (line 6) +* unexport: Variables/Recursion. (line 45) +* value: Value Function. (line 6) +* VPATH: Directory Search. (line 6) +* VPATH <1>: General Search. (line 6) +* vpath: Directory Search. (line 6) +* vpath <1>: Selective Search. (line 6) +* warning: Make Control Functions. + (line 35) +* WEAVE: Implicit Variables. (line 94) +* wildcard: Wildcard Function. (line 6) +* wildcard <1>: File Name Functions. (line 106) +* word: Text Functions. (line 159) +* wordlist: Text Functions. (line 168) +* words: Text Functions. (line 180) +* YACC: Implicit Variables. (line 76) +* YFLAGS: Implicit Variables. (line 153) + diff --git a/third_party/make/doc/make.texi b/third_party/make/doc/make.texi new file mode 100644 index 00000000000..733c0b962de --- /dev/null +++ b/third_party/make/doc/make.texi @@ -0,0 +1,13061 @@ +\input texinfo @c -*- Texinfo -*- +@c %**start of header +@setfilename make.info + +@include version.texi +@set EDITION 0.75 + +@settitle GNU @code{make} +@setchapternewpage odd +@c Combine the variable and function indices: +@syncodeindex vr fn +@c Combine the program and concept indices: +@syncodeindex pg cp +@c FSF publishers: format makebook.texi instead of using this file directly. +@c ISBN confirmed by Jasimin Huang on 25 Mar 2009 +@set ISBN 1-882114-83-3 +@c %**end of header + +@copying +This file documents the GNU @code{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 @value{EDITION}, last updated @value{UPDATED}, +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, 2017, 2018, 2019, +2020 Free Software Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,'' +and with the Back-Cover Texts as in (a) below. A copy of the +license is included in the section entitled ``GNU Free Documentation +License.'' + +(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and +modify this GNU manual. Buying copies from the FSF supports it in +developing GNU and promoting software freedom.'' +@end quotation +@end copying + +@c finalout + +@c ISPELL CHECK: done, 10 June 1993 --roland +@c ISPELL CHECK: done, 2000-06-25 --Martin Buchholz + + +@dircategory Software development +@direntry +* Make: (make). Remake files automatically. +@end direntry + +@iftex +@shorttitlepage GNU Make +@end iftex +@titlepage +@title GNU Make +@subtitle A Program for Directing Recompilation +@subtitle GNU @code{make} Version @value{VERSION} +@subtitle @value{UPDATED-MONTH} +@author Richard M. Stallman, Roland McGrath, Paul D. Smith +@page +@vskip 0pt plus 1filll +@insertcopying +@sp 2 +Published by the Free Software Foundation @* +51 Franklin St. -- Fifth Floor @* +Boston, MA 02110-1301 USA @* +ISBN @value{ISBN} @* +@sp 2 +Cover art by Etienne Suvasa. +@end titlepage + +@summarycontents +@contents + +@ifnottex +@node Top, Overview, (dir), (dir) +@top GNU @code{make} + +@insertcopying +@end ifnottex + +@menu +* Overview:: Overview of @code{make}. +* Introduction:: An introduction to @code{make}. +* Makefiles:: Makefiles tell @code{make} what to do. +* Rules:: Rules describe when a file must be remade. +* Recipes:: Recipes say how to remake a file. +* Using Variables:: You can use variables to avoid repetition. +* Conditionals:: Use or ignore parts of the makefile based + on the values of variables. +* Functions:: Many powerful ways to manipulate text. +* Invoking make: Running. How to invoke @code{make} on the command line. +* Implicit Rules:: Use implicit rules to treat many files alike, + based on their file names. +* Archives:: How @code{make} can update library archives. +* Extending make:: Using extensions to @code{make}. +* Integrating make:: Integrating @code{make} with other tools. +* Features:: Features GNU @code{make} has over other @code{make}s. +* Missing:: What GNU @code{make} lacks from other @code{make}s. +* Makefile Conventions:: Conventions for writing makefiles for + GNU programs. +* Quick Reference:: A quick reference for experienced users. +* Error Messages:: A list of common errors generated by @code{make}. +* Complex Makefile:: A real example of a straightforward, + but nontrivial, makefile. + +* GNU Free Documentation License:: License for copying this manual. +* Concept Index:: Index of Concepts. +* Name Index:: Index of Functions, Variables, & Directives. + +@detailmenu + --- The Detailed Node Listing --- + +Overview of @code{make} + +* Preparing:: Preparing and running @code{make}. +* Reading:: On reading this text. +* Bugs:: Problems and bugs. + +An Introduction to Makefiles + +* Rule Introduction:: What a rule looks like. +* Simple Makefile:: A simple makefile. +* How Make Works:: How @code{make} processes this makefile. +* Variables Simplify:: Variables make makefiles simpler. +* make Deduces:: Letting @code{make} deduce the recipes. +* Combine By Prerequisite:: Another style of makefile. +* Cleanup:: Rules for cleaning the directory. + +Writing Makefiles + +* Makefile Contents:: What makefiles contain. +* Makefile Names:: How to name your makefile. +* Include:: How one makefile can use another makefile. +* MAKEFILES Variable:: The environment can specify extra makefiles. +* Remaking Makefiles:: How makefiles get remade. +* Overriding Makefiles:: How to override part of one makefile + with another makefile. +* 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 + +* Splitting Lines:: Splitting long lines in makefiles + +Writing Rules + +* Rule Example:: An example explained. +* Rule Syntax:: General syntax explained. +* Prerequisite Types:: There are two types of prerequisites. +* Wildcards:: Using wildcard characters such as `*'. +* Directory Search:: Searching other directories for source files. +* Phony Targets:: Using a target that is not a real file's name. +* Force Targets:: You can use a target without a recipe + or prerequisites to mark other targets + as phony. +* Empty Targets:: When only the date matters and the + files are empty. +* Special Targets:: Targets with special built-in meanings. +* Multiple Targets:: When to make use of several targets in a rule. +* Multiple Rules:: How to use several rules with the same target. +* Static Pattern:: Static pattern rules apply to multiple targets + and can vary the prerequisites according to + the target name. +* Double-Colon:: How to use a special kind of rule to allow + several independent rules for one target. +* Automatic Prerequisites:: How to automatically generate rules giving + prerequisites from source files themselves. + +Using Wildcard Characters in File Names + +* Wildcard Examples:: Several examples. +* Wildcard Pitfall:: Problems to avoid. +* Wildcard Function:: How to cause wildcard expansion where + it does not normally take place. + +Searching Directories for Prerequisites + +* General Search:: Specifying a search path that applies + to every prerequisite. +* Selective Search:: Specifying a search path + for a specified class of names. +* Search Algorithm:: When and how search paths are applied. +* Recipes/Search:: How to write recipes that work together + with search paths. +* Implicit/Search:: How search paths affect implicit rules. +* Libraries/Search:: Directory search for link libraries. + +Static Pattern Rules + +* Static Usage:: The syntax of static pattern rules. +* Static versus Implicit:: When are they better than implicit rules? + +Writing Recipes in Rules + +* Recipe Syntax:: Recipe syntax features and pitfalls. +* Echoing:: How to control when recipes are echoed. +* Execution:: How recipes are executed. +* Parallel:: How recipes can be executed in parallel. +* Errors:: What happens after a recipe execution error. +* Interrupts:: What happens when a recipe is interrupted. +* Recursion:: Invoking @code{make} from makefiles. +* Canned Recipes:: Defining canned recipes. +* Empty Recipes:: Defining useful, do-nothing recipes. + +Recipe Syntax + +* Splitting Recipe Lines:: Breaking long recipe lines for readability. +* Variables in Recipes:: Using @code{make} variables in recipes. + +Recipe Execution + +* One Shell:: One shell for all lines in a recipe. +* Choosing the Shell:: How @code{make} chooses the shell used + to run recipes. + +Parallel Execution + +* Parallel Output:: Handling output during parallel execution +* Parallel Input:: Handling input during parallel execution + +Recursive Use of @code{make} + +* MAKE Variable:: The special effects of using @samp{$(MAKE)}. +* Variables/Recursion:: How to communicate variables to a sub-@code{make}. +* Options/Recursion:: How to communicate options to a sub-@code{make}. +* -w Option:: How the @samp{-w} or @samp{--print-directory} option + helps debug use of recursive @code{make} commands. + +How to Use Variables + +* Reference:: How to use the value of a variable. +* Flavors:: Variables come in two flavors. +* Advanced:: Advanced features for referencing a variable. +* Values:: All the ways variables get their values. +* Setting:: How to set a variable in the makefile. +* Appending:: How to append more text to the old value + of a variable. +* Override Directive:: How to set a variable in the makefile even if + the user has set it with a command argument. +* Multi-Line:: An alternate way to set a variable + to a multi-line string. +* Undefine Directive:: How to undefine a variable so that it appears + as if it was never set. +* Environment:: Variable values can come from the environment. +* Target-specific:: Variable values can be defined on a per-target + basis. +* Pattern-specific:: Target-specific variable values can be applied + to a group of targets that match a pattern. +* Suppressing Inheritance:: Suppress inheritance of variables. +* Special Variables:: Variables with special meaning or behavior. + +Advanced Features for Reference to Variables + +* Substitution Refs:: Referencing a variable with + substitutions on the value. +* Computed Names:: Computing the name of the variable to refer to. + +Conditional Parts of Makefiles + +* Conditional Example:: Example of a conditional +* Conditional Syntax:: The syntax of conditionals. +* Testing Flags:: Conditionals that test flags. + +Functions for Transforming Text + +* Syntax of Functions:: How to write a function call. +* Text Functions:: General-purpose text manipulation functions. +* File Name Functions:: Functions for manipulating file names. +* Conditional Functions:: Functions that implement conditions. +* Foreach Function:: Repeat some text with controlled variation. +* File Function:: Write text to a file. +* Call Function:: Expand a user-defined function. +* Value Function:: Return the un-expanded value of a variable. +* Eval Function:: Evaluate the arguments as makefile syntax. +* Origin Function:: Find where a variable got its value. +* Flavor Function:: Find out the flavor of a variable. +* Make Control Functions:: Functions that control how make runs. +* Shell Function:: Substitute the output of a shell command. +* Guile Function:: Use GNU Guile embedded scripting language. + +How to Run @code{make} + +* Makefile Arguments:: How to specify which makefile to use. +* Goals:: How to use goal arguments to specify which + parts of the makefile to use. +* Instead of Execution:: How to use mode flags to specify what + kind of thing to do with the recipes + in the makefile other than simply + execute them. +* Avoiding Compilation:: How to avoid recompiling certain files. +* Overriding:: How to override a variable to specify + an alternate compiler and other things. +* Testing:: How to proceed past some errors, to + test compilation. +* Options Summary:: Summary of Options + +Using Implicit Rules + +* Using Implicit:: How to use an existing implicit rule + to get the recipes for updating a file. +* Catalogue of Rules:: A list of built-in rules. +* Implicit Variables:: How to change what predefined rules do. +* Chained Rules:: How to use a chain of implicit rules. +* Pattern Rules:: How to define new implicit rules. +* Last Resort:: How to define a recipe for rules which + cannot find any. +* Suffix Rules:: The old-fashioned style of implicit rule. +* Implicit Rule Search:: The precise algorithm for applying + implicit rules. + +Defining and Redefining Pattern Rules + +* Pattern Intro:: An introduction to pattern rules. +* Pattern Examples:: Examples of pattern rules. +* Automatic Variables:: How to use automatic variables in the + recipe of implicit rules. +* Pattern Match:: How patterns match. +* Match-Anything Rules:: Precautions you should take prior to + defining rules that can match any + target file whatever. +* Canceling Rules:: How to override or cancel built-in rules. + +Using @code{make} to Update Archive Files + +* Archive Members:: Archive members as targets. +* Archive Update:: The implicit rule for archive member targets. +* Archive Pitfalls:: Dangers to watch out for when using archives. +* Archive Suffix Rules:: You can write a special kind of suffix rule + for updating archives. + +Implicit Rule for Archive Member Targets + +* Archive Symbols:: How to update archive symbol directories. + +Extending GNU @code{make} + +* Guile Integration:: Using Guile as an embedded scripting language. +* Loading Objects:: Loading dynamic objects as extensions. + +GNU Guile Integration + +* Guile Types:: Converting Guile types to @code{make} strings. +* Guile Interface:: Invoking @code{make} functions from Guile. +* Guile Example:: Example using Guile in @code{make}. + +Loading Dynamic Objects + +* load Directive:: Loading dynamic objects as extensions. +* Remaking Loaded Objects:: How loaded objects get remade. +* Loaded Object API:: Programmatic interface for loaded objects. +* Loaded Object Example:: Example of a loaded object + +Integrating GNU @code{make} + +* Job Slots:: Share job slots with GNU @code{make}. +* Terminal Output:: Control output to terminals. + +Sharing Job Slots with GNU @code{make} + +* POSIX Jobserver:: Using the jobserver on POSIX systems. +* Windows Jobserver:: Using the jobserver on Windows systems. + +@end detailmenu +@end menu + +@node Overview, Introduction, Top, Top +@comment node-name, next, previous, up +@chapter Overview of @code{make} + +The @code{make} utility automatically determines which pieces of a large +program need to be recompiled, and issues commands to recompile them. +This manual describes GNU @code{make}, which was implemented by Richard +Stallman and Roland McGrath. Development since Version 3.76 has been +handled by Paul D. Smith. + +GNU @code{make} conforms to section 6.2 of @cite{IEEE Standard +1003.2-1992} (POSIX.2). +@cindex POSIX +@cindex IEEE Standard 1003.2 +@cindex standards conformance + +Our examples show C programs, since they are most common, but you can use +@code{make} with any programming language whose compiler can be run with a +shell command. Indeed, @code{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. + +@menu +* Preparing:: Preparing and running @code{make}. +* Reading:: On reading this text. +* Bugs:: Problems and bugs. +@end menu + +@node Preparing, Reading, Overview, Overview +@ifnottex +@heading Preparing and Running Make +@end ifnottex + +To prepare to use @code{make}, you must write a file called +the @dfn{makefile} that describes the relationships among files +in your program and provides 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.@refill + +Once a suitable makefile exists, each time you change some source files, +this simple shell command: + +@example +make +@end example + +@noindent +suffices to perform all necessary recompilations. The @code{make} program +uses the makefile data base 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 recipes recorded in the data base. + +You can provide command line arguments to @code{make} to control which +files should be recompiled, or how. @xref{Running, ,How to Run +@code{make}}. + +@node Reading, Bugs, Preparing, Overview +@section How to Read This Manual + +If you are new to @code{make}, or are looking for a general +introduction, read the first few sections of each chapter, skipping the +later sections. In each chapter, the first few sections contain +introductory or general information and the later sections contain +specialized or technical information. +@ifnottex +The exception is the second chapter, @ref{Introduction, ,An +Introduction to Makefiles}, all of which is introductory. +@end ifnottex +@iftex +The exception is @ref{Introduction, ,An Introduction to Makefiles}, +all of which is introductory. +@end iftex + +If you are familiar with other @code{make} programs, see @ref{Features, +,Features of GNU @code{make}}, which lists the enhancements GNU +@code{make} has, and @ref{Missing, ,Incompatibilities and Missing +Features}, which explains the few things GNU @code{make} lacks that +others have. + +For a quick summary, see @ref{Options Summary}, @ref{Quick Reference}, +and @ref{Special Targets}. + +@node Bugs, , Reading, Overview +@section Problems and Bugs +@cindex reporting bugs +@cindex bugs, reporting +@cindex problems and bugs, reporting + +If you have problems with GNU @code{make} or think you've found a bug, +please report it to the developers; we cannot promise to do anything but +we might well want to fix it. + +Before reporting a bug, make sure you've actually found a real bug. +Carefully reread the documentation and see if it really says you can do +what you're trying to do. If it's not clear whether you should be able +to do something or not, report that too; it's a bug in the +documentation! + +Before reporting a bug or trying to fix it yourself, try to isolate it +to the smallest possible makefile that reproduces the problem. Then +send us the makefile and the exact results @code{make} gave you, +including any error or warning messages. Please don't paraphrase +these messages: it's best to cut and paste them into your report. +When generating this small makefile, be sure to not use any non-free +or unusual tools in your recipes: you can almost always emulate what +such a tool would do with simple shell commands. Finally, be sure to +explain what you expected to occur; this will help us decide whether +the problem was really in the documentation. + +Once you have a precise problem you can report it in one of two ways. +Either send electronic mail to: + +@example + bug-make@@gnu.org +@end example + +@noindent +or use our Web-based project management tool, at: + +@example + http://savannah.gnu.org/projects/make/ +@end example + +@noindent +In addition to the information above, please be careful to include the +version number of @code{make} you are using. You can get this +information with the command @samp{make --version}. Be sure also to +include the type of machine and operating system you are using. One +way to obtain this information is by looking at the final lines of +output from the command @samp{make --help}. + +@node Introduction, Makefiles, Overview, Top +@comment node-name, next, previous, up +@chapter An Introduction to Makefiles + +You need a file called a @dfn{makefile} to tell @code{make} what to do. +Most often, the makefile tells @code{make} how to compile and link a +program. +@cindex makefile + +In this chapter, we will discuss a simple makefile that describes how to +compile and link a text editor which consists of eight C source files +and three header files. The makefile can also tell @code{make} how to +run miscellaneous commands when explicitly asked (for example, to remove +certain files as a clean-up operation). To see a more complex example +of a makefile, see @ref{Complex Makefile}. + +When @code{make} recompiles the editor, each changed C source file +must be recompiled. If a header file has changed, each C source file +that includes the header file must be recompiled to be safe. Each +compilation produces an object file corresponding to the source file. +Finally, if any source file has been recompiled, all the object files, +whether newly made or saved from previous compilations, must be linked +together to produce the new executable editor. +@cindex recompilation +@cindex editor + +@menu +* Rule Introduction:: What a rule looks like. +* Simple Makefile:: A simple makefile. +* How Make Works:: How @code{make} processes this makefile. +* Variables Simplify:: Variables make makefiles simpler. +* make Deduces:: Letting @code{make} deduce the recipes. +* Combine By Prerequisite:: Another style of makefile. +* Cleanup:: Rules for cleaning the directory. +@end menu + +@node Rule Introduction, Simple Makefile, Introduction, Introduction +@comment node-name, next, previous, up +@section What a Rule Looks Like +@cindex rule, introduction to +@cindex makefile rule parts +@cindex parts of makefile rule + +A simple makefile consists of ``rules'' with the following shape: + +@cindex targets, introduction to +@cindex prerequisites, introduction to +@cindex recipes, introduction to +@example +@group +@var{target} @dots{} : @var{prerequisites} @dots{} + @var{recipe} + @dots{} + @dots{} +@end group +@end example + +A @dfn{target} is usually the name of a file that is generated by a +program; examples of targets are executable or object files. A target +can also be the name of an action to carry out, such as @samp{clean} +(@pxref{Phony Targets}). + +A @dfn{prerequisite} is a file that is used as input to create the +target. A target often depends on several files. + +@cindex tabs in rules +A @dfn{recipe} is an action that @code{make} carries out. A recipe +may have more than one command, either on the same line or each on its +own line. @strong{Please note:} you need to put a tab character at +the beginning of every recipe line! This is an obscurity that catches +the unwary. If you prefer to prefix your recipes with a character +other than tab, you can set the @code{.RECIPEPREFIX} variable to an +alternate character (@pxref{Special Variables}). + +Usually a recipe is in a rule with prerequisites and serves to create a +target file if any of the prerequisites change. However, the rule that +specifies a recipe for the target need not have prerequisites. For +example, the rule containing the delete command associated with the +target @samp{clean} does not have prerequisites. + +A @dfn{rule}, then, explains how and when to remake certain files +which are the targets of the particular rule. @code{make} carries out +the recipe on the prerequisites to create or update the target. A +rule can also explain how and when to carry out an action. +@xref{Rules, , Writing Rules}. + +A makefile may contain other text besides rules, but a simple makefile +need only contain rules. Rules may look somewhat more complicated +than shown in this template, but all fit the pattern more or less. + +@node Simple Makefile, How Make Works, Rule Introduction, Introduction +@section A Simple Makefile +@cindex simple makefile +@cindex makefile, simple + +Here is a straightforward makefile that describes the way an +executable file called @code{edit} depends on eight object files +which, in turn, depend on eight C source and three header files. + +In this example, all the C files include @file{defs.h}, but only those +defining editing commands include @file{command.h}, and only low +level files that change the editor buffer include @file{buffer.h}. + +@example +@group +edit : main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + cc -o edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +main.o : main.c defs.h + cc -c main.c +kbd.o : kbd.c defs.h command.h + cc -c kbd.c +command.o : command.c defs.h command.h + cc -c command.c +display.o : display.c defs.h buffer.h + cc -c display.c +insert.o : insert.c defs.h buffer.h + cc -c insert.c +search.o : search.c defs.h buffer.h + cc -c search.c +files.o : files.c defs.h buffer.h command.h + cc -c files.c +utils.o : utils.c defs.h + cc -c utils.c +clean : + rm edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o +@end group +@end example + +@noindent +We split each long line into two lines using backslash/newline; this is +like using one long line, but is easier to read. @xref{Splitting Lines, +, Splitting Long Lines}. +@cindex continuation lines +@cindex @code{\} (backslash), for continuation lines +@cindex backslash (@code{\}), for continuation lines +@cindex quoting newline, in makefile +@cindex newline, quoting, in makefile + +To use this makefile to create the executable file called @file{edit}, +type: + +@example +make +@end example + +To use this makefile to delete the executable file and all the object +files from the directory, type: + +@example +make clean +@end example + +In the example makefile, the targets include the executable file +@samp{edit}, and the object files @samp{main.o} and @samp{kbd.o}. The +prerequisites are files such as @samp{main.c} and @samp{defs.h}. +In fact, each @samp{.o} file is both a target and a prerequisite. +Recipes include @w{@samp{cc -c main.c}} and @w{@samp{cc -c kbd.c}}. + +When a target is a file, it needs to be recompiled or relinked if any +of its prerequisites change. In addition, any prerequisites that are +themselves automatically generated should be updated first. In this +example, @file{edit} depends on each of the eight object files; the +object file @file{main.o} depends on the source file @file{main.c} and +on the header file @file{defs.h}. + +A recipe may follow each line that contains a target and +prerequisites. These recipes say how to update the target file. A +tab character (or whatever character is specified by the +@code{.RECIPEPREFIX} variable; @pxref{Special Variables}) must come at +the beginning of every line in the recipe to distinguish recipes from +other lines in the makefile. (Bear in mind that @code{make} does not +know anything about how the recipes work. It is up to you to supply +recipes that will update the target file properly. All @code{make} +does is execute the recipe you have specified when the target file +needs to be updated.)@refill +@cindex recipe + +The target @samp{clean} is not a file, but merely the name of an +action. Since you normally do not want to carry out the actions in +this rule, @samp{clean} is not a prerequisite of any other rule. +Consequently, @code{make} never does anything with it unless you tell +it specifically. Note that this rule not only is not a prerequisite, +it also does not have any prerequisites, so the only purpose of the +rule is to run the specified recipe. Targets that do not refer to +files but are just actions are called @dfn{phony targets}. +@xref{Phony Targets}, for information about this kind of target. +@xref{Errors, , Errors in Recipes}, to see how to cause @code{make} +to ignore errors from @code{rm} or any other command. +@cindex @code{clean} target +@cindex @code{rm} (shell command) + +@node How Make Works, Variables Simplify, Simple Makefile, Introduction +@comment node-name, next, previous, up +@section How @code{make} Processes a Makefile +@cindex processing a makefile +@cindex makefile, how @code{make} processes + +By default, @code{make} starts with the first target (not targets whose +names start with @samp{.}). This is called the @dfn{default goal}. +(@dfn{Goals} are the targets that @code{make} strives ultimately to +update. You can override this behavior using the command line +(@pxref{Goals, , Arguments to Specify the Goals}) or with the +@code{.DEFAULT_GOAL} special variable (@pxref{Special Variables, , +Other Special Variables}). +@cindex default goal +@cindex goal, default +@cindex goal + +In the simple example of the previous section, the default goal is to +update the executable program @file{edit}; therefore, we put that rule +first. + +Thus, when you give the command: + +@example +make +@end example + +@noindent +@code{make} reads the makefile in the current directory and begins by +processing the first rule. In the example, this rule is for relinking +@file{edit}; but before @code{make} can fully process this rule, it +must process the rules for the files that @file{edit} depends on, +which in this case are the object files. Each of these files is +processed according to its own rule. These rules say to update each +@samp{.o} file by compiling its source file. The recompilation must +be done if the source file, or any of the header files named as +prerequisites, is more recent than the object file, or if the object +file does not exist. + +The other rules are processed because their targets appear as +prerequisites of the goal. If some other rule is not depended on by the +goal (or anything it depends on, etc.), that rule is not processed, +unless you tell @code{make} to do so (with a command such as +@w{@code{make clean}}). + +Before recompiling an object file, @code{make} considers updating its +prerequisites, the source file and header files. This makefile does not +specify anything to be done for them---the @samp{.c} and @samp{.h} files +are not the targets of any rules---so @code{make} does nothing for these +files. But @code{make} would update automatically generated C programs, +such as those made by Bison or Yacc, by their own rules at this time. + +After recompiling whichever object files need it, @code{make} decides +whether to relink @file{edit}. This must be done if the file +@file{edit} does not exist, or if any of the object files are newer than +it. If an object file was just recompiled, it is now newer than +@file{edit}, so @file{edit} is relinked. +@cindex relinking + +Thus, if we change the file @file{insert.c} and run @code{make}, +@code{make} will compile that file to update @file{insert.o}, and then +link @file{edit}. If we change the file @file{command.h} and run +@code{make}, @code{make} will recompile the object files @file{kbd.o}, +@file{command.o} and @file{files.o} and then link the file @file{edit}. + +@node Variables Simplify, make Deduces, How Make Works, Introduction +@section Variables Make Makefiles Simpler +@cindex variables +@cindex simplifying with variables + +In our example, we had to list all the object files twice in the rule for +@file{edit} (repeated here): + +@example +@group +edit : main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + cc -o edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o +@end group +@end example + +@cindex @code{objects} +Such duplication is error-prone; if a new object file is added to the +system, we might add it to one list and forget the other. We can eliminate +the risk and simplify the makefile by using a variable. @dfn{Variables} +allow a text string to be defined once and substituted in multiple places +later (@pxref{Using Variables, ,How to Use Variables}). + +@cindex @code{OBJECTS} +@cindex @code{objs} +@cindex @code{OBJS} +@cindex @code{obj} +@cindex @code{OBJ} +It is standard practice for every makefile to have a variable named +@code{objects}, @code{OBJECTS}, @code{objs}, @code{OBJS}, @code{obj}, +or @code{OBJ} which is a list of all object file names. We would +define such a variable @code{objects} with a line like this in the +makefile:@refill + +@example +@group +objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o +@end group +@end example + +@noindent +Then, each place we want to put a list of the object file names, we can +substitute the variable's value by writing @samp{$(objects)} +(@pxref{Using Variables, ,How to Use Variables}). + +Here is how the complete simple makefile looks when you use a variable +for the object files: + +@example +@group +objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +edit : $(objects) + cc -o edit $(objects) +main.o : main.c defs.h + cc -c main.c +kbd.o : kbd.c defs.h command.h + cc -c kbd.c +command.o : command.c defs.h command.h + cc -c command.c +display.o : display.c defs.h buffer.h + cc -c display.c +insert.o : insert.c defs.h buffer.h + cc -c insert.c +search.o : search.c defs.h buffer.h + cc -c search.c +files.o : files.c defs.h buffer.h command.h + cc -c files.c +utils.o : utils.c defs.h + cc -c utils.c +clean : + rm edit $(objects) +@end group +@end example + +@node make Deduces, Combine By Prerequisite, Variables Simplify, Introduction +@section Letting @code{make} Deduce the Recipes +@cindex deducing recipes (implicit rules) +@cindex implicit rule, introduction to +@cindex rule, implicit, introduction to + +It is not necessary to spell out the recipes for compiling the individual +C source files, because @code{make} can figure them out: it has an +@dfn{implicit rule} for updating a @samp{.o} file from a correspondingly +named @samp{.c} file using a @samp{cc -c} command. For example, it will +use the recipe @samp{cc -c main.c -o main.o} to compile @file{main.c} into +@file{main.o}. We can therefore omit the recipes from the rules for the +object files. @xref{Implicit Rules, ,Using Implicit Rules}.@refill + +When a @samp{.c} file is used automatically in this way, it is also +automatically added to the list of prerequisites. We can therefore omit +the @samp{.c} files from the prerequisites, provided we omit the recipe. + +Here is the entire example, with both of these changes, and a variable +@code{objects} as suggested above: + +@example +@group +objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +edit : $(objects) + cc -o edit $(objects) + +main.o : defs.h +kbd.o : defs.h command.h +command.o : defs.h command.h +display.o : defs.h buffer.h +insert.o : defs.h buffer.h +search.o : defs.h buffer.h +files.o : defs.h buffer.h command.h +utils.o : defs.h + +.PHONY : clean +clean : + rm edit $(objects) +@end group +@end example + +@noindent +This is how we would write the makefile in actual practice. (The +complications associated with @samp{clean} are described elsewhere. +See @ref{Phony Targets}, and @ref{Errors, ,Errors in Recipes}.) + +Because implicit rules are so convenient, they are important. You +will see them used frequently.@refill + +@node Combine By Prerequisite, Cleanup, make Deduces, Introduction +@section Another Style of Makefile +@cindex combining rules by prerequisite + +When the objects of a makefile are created only by implicit rules, an +alternative style of makefile is possible. In this style of makefile, +you group entries by their prerequisites instead of by their targets. +Here is what one looks like: + +@example +@group +objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +edit : $(objects) + cc -o edit $(objects) + +$(objects) : defs.h +kbd.o command.o files.o : command.h +display.o insert.o search.o files.o : buffer.h +@end group +@end example + +@noindent +Here @file{defs.h} is given as a prerequisite of all the object files; +@file{command.h} and @file{buffer.h} are prerequisites of the specific +object files listed for them. + +Whether this is better is a matter of taste: it is more compact, but some +people dislike it because they find it clearer to put all the information +about each target in one place. + +@node Cleanup, , Combine By Prerequisite, Introduction +@section Rules for Cleaning the Directory +@cindex cleaning up +@cindex removing, to clean up + +Compiling a program is not the only thing you might want to write rules +for. Makefiles commonly tell how to do a few other things besides +compiling a program: for example, how to delete all the object files +and executables so that the directory is @samp{clean}. + +@cindex @code{clean} target +Here is how we +could write a @code{make} rule for cleaning our example editor: + +@example +@group +clean: + rm edit $(objects) +@end group +@end example + +In practice, we might want to write the rule in a somewhat more +complicated manner to handle unanticipated situations. We would do this: + +@example +@group +.PHONY : clean +clean : + -rm edit $(objects) +@end group +@end example + +@noindent +This prevents @code{make} from getting confused by an actual file +called @file{clean} and causes it to continue in spite of errors from +@code{rm}. (See @ref{Phony Targets}, and @ref{Errors, ,Errors in +Recipes}.) + +@noindent +A rule such as this should not be placed at the beginning of the +makefile, because we do not want it to run by default! Thus, in the +example makefile, we want the rule for @code{edit}, which recompiles +the editor, to remain the default goal. + +Since @code{clean} is not a prerequisite of @code{edit}, this rule will not +run at all if we give the command @samp{make} with no arguments. In +order to make the rule run, we have to type @samp{make clean}. +@xref{Running, ,How to Run @code{make}}. + +@node Makefiles, Rules, Introduction, Top +@chapter Writing Makefiles + +@cindex makefile, how to write +The information that tells @code{make} how to recompile a system comes from +reading a data base called the @dfn{makefile}. + +@menu +* Makefile Contents:: What makefiles contain. +* Makefile Names:: How to name your makefile. +* Include:: How one makefile can use another makefile. +* MAKEFILES Variable:: The environment can specify extra makefiles. +* Remaking Makefiles:: How makefiles get remade. +* Overriding Makefiles:: How to override part of one makefile + with another makefile. +* Reading Makefiles:: How makefiles are read in. +* Parsing Makefiles:: How makefiles are parsed. +* Secondary Expansion:: How and when secondary expansion is performed. +@end menu + +@node Makefile Contents, Makefile Names, Makefiles, Makefiles +@section What Makefiles Contain + +Makefiles contain five kinds of things: @dfn{explicit rules}, +@dfn{implicit rules}, @dfn{variable definitions}, @dfn{directives}, +and @dfn{comments}. Rules, variables, and directives are described at +length in later chapters.@refill + +@itemize @bullet +@cindex rule, explicit, definition of +@cindex explicit rule, definition of +@item +An @dfn{explicit rule} says when and how to remake one or more files, +called the rule's @dfn{targets}. It lists the other files that the +targets depend on, called the @dfn{prerequisites} of the target, and +may also give a recipe to use to create or update the targets. +@xref{Rules, ,Writing Rules}. + +@cindex rule, implicit, definition of +@cindex implicit rule, definition of +@item +An @dfn{implicit rule} says when and how to remake a class of files +based on their names. It describes how a target may depend on a file +with a name similar to the target and gives a recipe to create or +update such a target. @xref{Implicit Rules, ,Using Implicit Rules}. + +@cindex variable definition +@item +A @dfn{variable definition} is a line that specifies a text string +value for a variable that can be substituted into the text later. The +simple makefile example shows a variable definition for @code{objects} +as a list of all object files (@pxref{Variables Simplify, , Variables +Make Makefiles Simpler}). + +@cindex directive +@item +A @dfn{directive} is an instruction for @code{make} to do something +special while reading the makefile. These include: + +@itemize @bullet +@item +Reading another makefile (@pxref{Include, ,Including Other Makefiles}). + +@item +Deciding (based on the values of variables) whether to use or +ignore a part of the makefile (@pxref{Conditionals, ,Conditional Parts of Makefiles}). + +@item +Defining a variable from a verbatim string containing multiple lines +(@pxref{Multi-Line, ,Defining Multi-Line Variables}). +@end itemize + +@cindex comments, in makefile +@cindex @code{#} (comments), in makefile +@item +@samp{#} in a line of a makefile starts a @dfn{comment}. It and the +rest of the line are ignored, except that a trailing backslash not +escaped by another backslash will continue the comment across multiple +lines. A line containing just a comment (with perhaps spaces before +it) is effectively blank, and is ignored. If you want a literal +@code{#}, escape it with a backslash (e.g., @code{\#}). Comments may +appear on any line in the makefile, although they are treated +specially in certain situations. + +You cannot use comments within variable references or function calls: +any instance of @code{#} will be treated literally (rather than as the +start of a comment) inside a variable reference or function call. + +Comments within a recipe are passed to the shell, just as with any +other recipe text. The shell decides how to interpret it: whether or +not this is a comment is up to the shell. + +Within a @code{define} directive, comments are not ignored during the +definition of the variable, but rather kept intact in the value of the +variable. When the variable is expanded they will either be treated +as @code{make} comments or as recipe text, depending on the context in +which the variable is evaluated. +@end itemize + +@menu +* Splitting Lines:: Splitting long lines in makefiles +@end menu + +@node Splitting Lines, , Makefile Contents, Makefile Contents +@subsection Splitting Long Lines +@cindex splitting long lines +@cindex long lines, splitting +@cindex backslash (@code{\}), to quote newlines + +Makefiles use a ``line-based'' syntax in which the newline character +is special and marks the end of a statement. GNU @code{make} has no +limit on the length of a statement line, up to the amount of memory in +your computer. + +However, it is difficult to read lines which are too long to display +without wrapping or scrolling. So, you can format your makefiles for +readability by adding newlines into the middle of a statement: you do +this by escaping the internal newlines with a backslash (@code{\}) +character. Where we need to make a distinction we will refer to +``physical lines'' as a single line ending with a newline (regardless +of whether it is escaped) and a ``logical line'' being a complete +statement including all escaped newlines up to the first non-escaped +newline. + +The way in which backslash/newline combinations are handled depends on +whether the statement is a recipe line or a non-recipe line. Handling +of backslash/newline in a recipe line is discussed later +(@pxref{Splitting Recipe Lines}). + +Outside of recipe lines, backslash/newlines are converted into a +single space character. Once that is done, all whitespace around the +backslash/newline is condensed into a single space: this includes all +whitespace preceding the backslash, all whitespace at the beginning of +the line after the backslash/newline, and any consecutive +backslash/newline combinations. + +If the @code{.POSIX} special target is defined then backslash/newline +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 +@cindex name of makefile +@cindex default makefile name +@cindex file name of makefile + +@c following paragraph rewritten to avoid overfull hbox +By default, when @code{make} looks for the makefile, it tries the +following names, in order: @file{GNUmakefile}, @file{makefile} +and @file{Makefile}.@refill +@findex Makefile +@findex GNUmakefile +@findex makefile + +@cindex @code{README} +Normally you should call your makefile either @file{makefile} or +@file{Makefile}. (We recommend @file{Makefile} because it appears +prominently near the beginning of a directory listing, right near other +important files such as @file{README}.) The first name checked, +@file{GNUmakefile}, is not recommended for most makefiles. You should +use this name if you have a makefile that is specific to GNU +@code{make}, and will not be understood by other versions of +@code{make}. Other @code{make} programs look for @file{makefile} and +@file{Makefile}, but not @file{GNUmakefile}. + +If @code{make} finds none of these names, it does not use any makefile. +Then you must specify a goal with a command argument, and @code{make} +will attempt to figure out how to remake it using only its built-in +implicit rules. @xref{Implicit Rules, ,Using Implicit Rules}. + +@cindex @code{-f} +@cindex @code{--file} +@cindex @code{--makefile} +If you want to use a nonstandard name for your makefile, you can specify +the makefile name with the @samp{-f} or @samp{--file} option. The +arguments @w{@samp{-f @var{name}}} or @w{@samp{--file=@var{name}}} tell +@code{make} to read the file @var{name} as the makefile. If you use +more than one @samp{-f} or @samp{--file} option, you can specify several +makefiles. All the makefiles are effectively concatenated in the order +specified. The default makefile names @file{GNUmakefile}, +@file{makefile} and @file{Makefile} are not checked automatically if you +specify @samp{-f} or @samp{--file}.@refill +@cindex specifying makefile name +@cindex makefile name, how to specify +@cindex name of makefile, how to specify +@cindex file name of makefile, how to specify + +@node Include, MAKEFILES Variable, Makefile Names, Makefiles +@section Including Other Makefiles +@cindex including other makefiles +@cindex makefile, including + +@findex include +The @code{include} directive tells @code{make} to suspend reading the +current makefile and read one or more other makefiles before continuing. +The directive is a line in the makefile that looks like this: + +@example +include @var{filenames}@dots{} +@end example + +@noindent +@var{filenames} can contain shell file name patterns. If +@var{filenames} is empty, nothing is included and no error is printed. +@cindex shell file name pattern (in @code{include}) +@cindex shell wildcards (in @code{include}) +@cindex wildcard, in @code{include} + +Extra spaces are allowed and ignored at the beginning of the line, but +the first character must not be a tab (or the value of +@code{.RECIPEPREFIX})---if the line begins with a tab, it will be +considered a recipe line. Whitespace is required between +@code{include} and the file names, and between file names; extra +whitespace is ignored there and at the end of the directive. A +comment starting with @samp{#} is allowed at the end of the line. If +the file names contain any variable or function references, they are +expanded. @xref{Using Variables, ,How to Use Variables}. + +For example, if you have three @file{.mk} files, @file{a.mk}, +@file{b.mk}, and @file{c.mk}, and @code{$(bar)} expands to +@code{bish bash}, then the following expression + +@example +include foo *.mk $(bar) +@end example + +is equivalent to + +@example +include foo a.mk b.mk c.mk bish bash +@end example + +When @code{make} processes an @code{include} directive, it suspends +reading of the containing makefile and reads from each listed file in +turn. When that is finished, @code{make} resumes reading the +makefile in which the directive appears. + +One occasion for using @code{include} directives is when several programs, +handled by individual makefiles in various directories, need to use a +common set of variable definitions +(@pxref{Setting, ,Setting Variables}) or pattern rules +(@pxref{Pattern Rules, ,Defining and Redefining Pattern Rules}). + +Another such occasion is when you want to generate prerequisites from +source files automatically; the prerequisites can be put in a file that +is included by the main makefile. This practice is generally cleaner +than that of somehow appending the prerequisites to the end of the main +makefile as has been traditionally done with other versions of +@code{make}. @xref{Automatic Prerequisites}. +@cindex prerequisites, automatic generation +@cindex automatic generation of prerequisites +@cindex generating prerequisites automatically + +@cindex @code{-I} +@cindex @code{--include-dir} +@cindex included makefiles, default directories +@cindex default directories for included makefiles +@findex /usr/gnu/include +@findex /usr/local/include +@findex /usr/include +If the specified name does not start with a slash, and the file is not +found in the current directory, several other directories are searched. +First, any directories you have specified with the @samp{-I} or +@samp{--include-dir} option are searched +(@pxref{Options Summary, ,Summary of Options}). +Then the following directories (if they exist) +are searched, in this order: +@file{@var{prefix}/include} (normally @file{/usr/local/include} +@footnote{GNU Make compiled for MS-DOS and MS-Windows behaves as if +@var{prefix} has been defined to be the root of the DJGPP tree +hierarchy.}) +@file{/usr/gnu/include}, +@file{/usr/local/include}, @file{/usr/include}. + +If an included makefile cannot be found in any of these directories, a +warning message is generated, but it is not an immediately fatal error; +processing of the makefile containing the @code{include} continues. +Once it has finished reading makefiles, @code{make} will try to remake +any that are out of date or don't exist. +@xref{Remaking Makefiles, ,How Makefiles Are Remade}. +Only after it has tried to find a way to remake a makefile and failed, +will @code{make} diagnose the missing makefile as a fatal error. + +If you want @code{make} to simply ignore a makefile which does not exist +or cannot be remade, with no error message, use the @w{@code{-include}} +directive instead of @code{include}, like this: + +@example +-include @var{filenames}@dots{} +@end example + +This acts like @code{include} in every way except that there is no +error (not even a warning) if any of the @var{filenames} (or any +prerequisites of any of the @var{filenames}) do not exist or cannot be +remade. + +For compatibility with some other @code{make} implementations, +@code{sinclude} is another name for @w{@code{-include}}. + +@node MAKEFILES Variable, Remaking Makefiles, Include, Makefiles +@section The Variable @code{MAKEFILES} +@cindex makefile, and @code{MAKEFILES} variable +@cindex including (@code{MAKEFILES} variable) + +@vindex MAKEFILES +If the environment variable @code{MAKEFILES} is defined, @code{make} +considers its value as a list of names (separated by whitespace) of +additional makefiles to be read before the others. This works much +like the @code{include} directive: various directories are searched +for those files (@pxref{Include, ,Including Other Makefiles}). In +addition, the default goal is never taken from one of these makefiles +(or any makefile included by them) and it is not an error if the files +listed in @code{MAKEFILES} are not found.@refill + +@cindex recursion, and @code{MAKEFILES} variable +The main use of @code{MAKEFILES} is in communication between recursive +invocations of @code{make} (@pxref{Recursion, ,Recursive Use of +@code{make}}). It usually is not desirable to set the environment +variable before a top-level invocation of @code{make}, because it is +usually better not to mess with a makefile from outside. However, if +you are running @code{make} without a specific makefile, a makefile in +@code{MAKEFILES} can do useful things to help the built-in implicit +rules work better, such as defining search paths (@pxref{Directory Search}). + +Some users are tempted to set @code{MAKEFILES} in the environment +automatically on login, and program makefiles to expect this to be done. +This is a very bad idea, because such makefiles will fail to work if run by +anyone else. It is much better to write explicit @code{include} directives +in the makefiles. @xref{Include, , Including Other Makefiles}. + +@node Remaking Makefiles, Overriding Makefiles, MAKEFILES Variable, Makefiles +@section How Makefiles Are Remade +@cindex updating makefiles +@cindex remaking makefiles +@cindex makefile, remaking of +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 +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 +Rules, ,Using Implicit Rules}), it will be updated if necessary. After +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.) 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 +on them, perhaps for efficiency reasons, you can use any normal method +of preventing implicit rule look-up to do so. For example, you can +write an explicit rule with the makefile as the target, and an empty +recipe (@pxref{Empty Recipes, ,Using Empty Recipes}). + +If the makefiles specify a double-colon rule to remake a file with +a recipe but no prerequisites, that file will always be remade +(@pxref{Double-Colon}). In the case of makefiles, a makefile that has a +double-colon rule with a recipe but no prerequisites will be remade every +time @code{make} is run, and then again after @code{make} starts over +and reads the makefiles in again. This would cause an infinite loop: +@code{make} would constantly remake the makefile, and never do anything +else. So, to avoid this, @code{make} will @strong{not} attempt to +remake makefiles which are specified as targets of a double-colon rule +with a recipe but no prerequisites.@refill + +If you do not specify any makefiles to be read with @samp{-f} or +@samp{--file} options, @code{make} will try the default makefile names; +@pxref{Makefile Names, ,What Name to Give Your Makefile}. Unlike +makefiles explicitly requested with @samp{-f} or @samp{--file} options, +@code{make} is not certain that these makefiles should exist. However, +if a default makefile does not exist but can be created by running +@code{make} rules, you probably want the rules to be run so that the +makefile can be used. + +Therefore, if none of the default makefiles exists, @code{make} will try +to make each of them in the same order in which they are searched for +(@pxref{Makefile Names, ,What Name to Give Your Makefile}) +until it succeeds in making one, or it runs out of names to try. Note +that it is not an error if @code{make} cannot find or make any makefile; +a makefile is not always necessary.@refill + +When you use the @samp{-t} or @samp{--touch} option +(@pxref{Instead of Execution, ,Instead of Executing Recipes}), +you would not want to use an out-of-date makefile to decide which +targets to touch. So the @samp{-t} option has no effect on updating +makefiles; they are really updated even if @samp{-t} is specified. +Likewise, @samp{-q} (or @samp{--question}) and @samp{-n} (or +@samp{--just-print}) do not prevent updating of makefiles, because an +out-of-date makefile would result in the wrong output for other targets. +Thus, @samp{make -f mfile -n foo} will update @file{mfile}, read it in, +and then print the recipe to update @file{foo} and its prerequisites +without running it. The recipe printed for @file{foo} will be the one +specified in the updated contents of @file{mfile}. + +However, on occasion you might actually wish to prevent updating of even +the makefiles. You can do this by specifying the makefiles as goals in +the command line as well as specifying them as makefiles. When the +makefile name is specified explicitly as a goal, the options @samp{-t} +and so on do apply to them. + +Thus, @samp{make -f mfile -n mfile foo} would read the makefile +@file{mfile}, print the recipe needed to update it without actually +running it, and then print the recipe needed to update @file{foo} +without running that. The recipe for @file{foo} will be the one +specified by the existing contents of @file{mfile}. + +@node Overriding Makefiles, Reading Makefiles, Remaking Makefiles, Makefiles +@section Overriding Part of Another Makefile + +@cindex overriding makefiles +@cindex makefile, overriding +Sometimes it is useful to have a makefile that is mostly just like +another makefile. You can often use the @samp{include} directive to +include one in the other, and add more targets or variable definitions. +However, it is invalid for two makefiles to give different recipes for +the same target. But there is another way. + +@cindex match-anything rule, used to override +In the containing makefile (the one that wants to include the other), +you can use a match-anything pattern rule to say that to remake any +target that cannot be made from the information in the containing +makefile, @code{make} should look in another makefile. +@xref{Pattern Rules}, for more information on pattern rules. + +For example, if you have a makefile called @file{Makefile} that says how +to make the target @samp{foo} (and other targets), you can write a +makefile called @file{GNUmakefile} that contains: + +@example +foo: + frobnicate > foo + +%: force + @@$(MAKE) -f Makefile $@@ +force: ; +@end example + +If you say @samp{make foo}, @code{make} will find @file{GNUmakefile}, +read it, and see that to make @file{foo}, it needs to run the recipe +@samp{frobnicate > foo}. If you say @samp{make bar}, @code{make} will +find no way to make @file{bar} in @file{GNUmakefile}, so it will use the +recipe from the pattern rule: @samp{make -f Makefile bar}. If +@file{Makefile} provides a rule for updating @file{bar}, @code{make} +will apply the rule. And likewise for any other target that +@file{GNUmakefile} does not say how to make. + +The way this works is that the pattern rule has a pattern of just +@samp{%}, so it matches any target whatever. The rule specifies a +prerequisite @file{force}, to guarantee that the recipe will be run even +if the target file already exists. We give the @file{force} target an +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, Parsing Makefiles, Overriding Makefiles, Makefiles +@section How @code{make} Reads a Makefile +@cindex reading makefiles +@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 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. 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 +chapters. + +@subheading Variable Assignment +@cindex +=, expansion +@cindex =, expansion +@cindex ?=, expansion +@cindex +=, expansion +@cindex !=, expansion +@cindex define, expansion + +Variable definitions are parsed as follows: + +@example +@var{immediate} = @var{deferred} +@var{immediate} ?= @var{deferred} +@var{immediate} := @var{immediate} +@var{immediate} ::= @var{immediate} +@var{immediate} += @var{deferred} or @var{immediate} +@var{immediate} != @var{immediate} + +define @var{immediate} + @var{deferred} +endef + +define @var{immediate} = + @var{deferred} +endef + +define @var{immediate} ?= + @var{deferred} +endef + +define @var{immediate} := + @var{immediate} +endef + +define @var{immediate} ::= + @var{immediate} +endef + +define @var{immediate} += + @var{deferred} or @var{immediate} +endef + +define @var{immediate} != + @var{immediate} +endef +@end example + +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). + +@subheading Conditional Directives +@cindex ifdef, expansion +@cindex ifeq, expansion +@cindex ifndef, expansion +@cindex ifneq, expansion + +Conditional directives are parsed immediately. This means, for +example, that automatic variables cannot be used in conditional +directives, as automatic variables are not set until the recipe for +that rule is invoked. If you need to use automatic variables in a +conditional directive you @emph{must} move the condition into the +recipe and use shell conditional syntax instead. + +@subheading Rule Definition +@cindex target, expansion +@cindex prerequisite, expansion +@cindex implicit rule, expansion +@cindex pattern rule, expansion +@cindex explicit rule, expansion + +A rule is always expanded the same way, regardless of the form: + +@example +@var{immediate} : @var{immediate} ; @var{deferred} + @var{deferred} +@end example + +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}). + +@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 +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. + +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 +prerequisites of the targets defined after the special target are +expanded a @emph{second time}. In most circumstances this secondary +expansion will have no effect, since all variable and function +references will have been expanded during the initial parsing of the +makefiles. In order to take advantage of the secondary expansion +phase of the parser, then, it's necessary to @emph{escape} the +variable or function reference in the makefile. In this case the +first expansion merely un-escapes the reference but doesn't expand it, +and expansion is left to the secondary expansion phase. For example, +consider this makefile: + +@example +.SECONDEXPANSION: +ONEVAR = onefile +TWOVAR = twofile +myfile: $(ONEVAR) $$(TWOVAR) +@end example + +After the first expansion phase the prerequisites list of the +@file{myfile} target will be @code{onefile} and @code{$(TWOVAR)}; the +first (unescaped) variable reference to @var{ONEVAR} is expanded, +while the second (escaped) variable reference is simply unescaped, +without being recognized as a variable reference. Now during the +secondary expansion the first word is expanded again but since it +contains no variable or function references it remains the value +@file{onefile}, while the second word is now a normal reference to the +variable @var{TWOVAR}, which is expanded to the value @file{twofile}. +The final result is that there are two prerequisites, @file{onefile} +and @file{twofile}. + +Obviously, this is not a very interesting case since the same result +could more easily have been achieved simply by having both variables +appear, unescaped, in the prerequisites list. One difference becomes +apparent if the variables are reset; consider this example: + +@example +.SECONDEXPANSION: +AVAR = top +onefile: $(AVAR) +twofile: $$(AVAR) +AVAR = bottom +@end example + +Here the prerequisite of @file{onefile} will be expanded immediately, +and resolve to the value @file{top}, while the prerequisite of +@file{twofile} will not be full expanded until the secondary expansion +and yield a value of @file{bottom}. + +This is marginally more exciting, but the true power of this feature +only becomes apparent when you discover that secondary expansions +always take place within the scope of the automatic variables for that +target. This means that you can use variables such as @code{$@@}, +@code{$*}, etc. during the second expansion and they will have their +expected values, just as in the recipe. All you have to do is defer +the expansion by escaping the @code{$}. Also, secondary expansion +occurs for both explicit and implicit (pattern) rules. Knowing this, +the possible uses for this feature increase dramatically. For +example: + +@example +.SECONDEXPANSION: +main_OBJS := main.o try.o test.o +lib_OBJS := lib.o api.o + +main lib: $$($$@@_OBJS) +@end example + +Here, after the initial expansion the prerequisites of both the +@file{main} and @file{lib} targets will be @code{$($@@_OBJS)}. During +the secondary expansion, the @code{$@@} variable is set to the name of +the target and so the expansion for the @file{main} target will yield +@code{$(main_OBJS)}, or @code{main.o try.o test.o}, while the +secondary expansion for the @file{lib} target will yield +@code{$(lib_OBJS)}, or @code{lib.o api.o}. + +You can also mix in functions here, as long as they are properly escaped: + +@example +main_SRCS := main.c try.c test.c +lib_SRCS := lib.c api.c + +.SECONDEXPANSION: +main lib: $$(patsubst %.c,%.o,$$($$@@_SRCS)) +@end example + +This version allows users to specify source files rather than object +files, but gives the same resulting prerequisites list as the previous +example. + +Evaluation of automatic variables during the secondary expansion +phase, especially of the target name variable @code{$$@@}, behaves +similarly to evaluation within recipes. However, there are some +subtle differences and ``corner cases'' which come into play for the +different types of rule definitions that @code{make} understands. The +subtleties of using the different automatic variables are described +below. + +@subheading Secondary Expansion of Explicit Rules +@cindex secondary expansion and explicit rules +@cindex explicit rules, secondary expansion of + +During the secondary expansion of explicit rules, @code{$$@@} and +@code{$$%} evaluate, respectively, to the file name of the target and, +when the target is an archive member, the target member name. The +@code{$$<} variable evaluates to the first prerequisite in the first +rule for this target. @code{$$^} and @code{$$+} evaluate to the list +of all prerequisites of rules @emph{that have already appeared} for +the same target (@code{$$+} with repetitions and @code{$$^} +without). The following example will help illustrate these behaviors: + +@example +.SECONDEXPANSION: + +foo: foo.1 bar.1 $$< $$^ $$+ # line #1 + +foo: foo.2 bar.2 $$< $$^ $$+ # line #2 + +foo: foo.3 bar.3 $$< $$^ $$+ # line #3 +@end example + +In the first prerequisite list, all three variables (@code{$$<}, +@code{$$^}, and @code{$$+}) expand to the empty string. In the +second, they will have values @code{foo.1}, @code{foo.1 bar.1}, and +@code{foo.1 bar.1} respectively. In the third they will have values +@code{foo.1}, @code{foo.1 bar.1 foo.2 bar.2}, and @code{foo.1 bar.1 +foo.2 bar.2 foo.1 foo.1 bar.1 foo.1 bar.1} respectively. + +Rules undergo secondary expansion in makefile order, except that +the rule with the recipe is always evaluated last. + +The variables @code{$$?} and @code{$$*} are not available and expand +to the empty string. + +@subheading Secondary Expansion of Static Pattern Rules +@cindex secondary expansion and static pattern rules +@cindex static pattern rules, secondary expansion of + +Rules for secondary expansion of static pattern rules are identical to +those for explicit rules, above, with one exception: for static +pattern rules the @code{$$*} variable is set to the pattern stem. As +with explicit rules, @code{$$?} is not available and expands to the +empty string. + +@subheading Secondary Expansion of Implicit Rules +@cindex secondary expansion and implicit rules +@cindex implicit rules, secondary expansion of + +As @code{make} searches for an implicit rule, it substitutes the stem +and then performs secondary expansion for every rule with a matching +target pattern. The value of the automatic variables is derived in +the same fashion as for static pattern rules. As an example: + +@example +.SECONDEXPANSION: + +foo: bar + +foo foz: fo%: bo% + +%oo: $$< $$^ $$+ $$* +@end example + +When the implicit rule is tried for target @file{foo}, @code{$$<} +expands to @file{bar}, @code{$$^} expands to @file{bar boo}, +@code{$$+} also expands to @file{bar boo}, and @code{$$*} expands to +@file{f}. + +Note that the directory prefix (D), as described in @ref{Implicit Rule +Search, ,Implicit Rule Search Algorithm}, is appended (after +expansion) to all the patterns in the prerequisites list. As an +example:@refill + +@example +.SECONDEXPANSION: + +/tmp/foo.o: + +%.o: $$(addsuffix /%.c,foo bar) foo.h + @@echo $^ +@end example + +The prerequisite list printed, after the secondary expansion and +directory prefix reconstruction, will be @file{/tmp/foo/foo.c +/tmp/bar/foo.c foo.h}. If you are not interested in this +reconstruction, you can use @code{$$*} instead of @code{%} in the +prerequisites list. + +@node Rules, Recipes, Makefiles, Top +@chapter Writing Rules +@cindex writing rules +@cindex rule, how to write +@cindex target +@cindex prerequisite + +A @dfn{rule} appears in the makefile and says when and how to remake +certain files, called the rule's @dfn{targets} (most often only one per rule). +It lists the other files that are the @dfn{prerequisites} of the target, and +the @dfn{recipe} to use to create or update the target. + +@cindex default goal +@cindex goal, default +The order of rules is not significant, except for determining the +@dfn{default goal}: the target for @code{make} to consider, if you do +not otherwise specify one. The default goal is the target of the first +rule in the first makefile. If the first rule has multiple targets, +only the first target is taken as the default. There are two +exceptions: a target starting with a period is not a default unless it +contains one or more slashes, @samp{/}, as well; and, a target that +defines a pattern rule has no effect on the default goal. +(@xref{Pattern Rules, ,Defining and Redefining Pattern Rules}.) + +Therefore, we usually write the makefile so that the first rule is the +one for compiling the entire program or all the programs described by +the makefile (often with a target called @samp{all}). +@xref{Goals, ,Arguments to Specify the Goals}. + +@menu +* Rule Example:: An example explained. +* Rule Syntax:: General syntax explained. +* Prerequisite Types:: There are two types of prerequisites. +* Wildcards:: Using wildcard characters such as `*'. +* Directory Search:: Searching other directories for source files. +* Phony Targets:: Using a target that is not a real file's name. +* Force Targets:: You can use a target without a recipe + or prerequisites to mark other targets + as phony. +* Empty Targets:: When only the date matters and the + files are empty. +* Special Targets:: Targets with special built-in meanings. +* Multiple Targets:: When to make use of several targets in a rule. +* Multiple Rules:: How to use several rules with the same target. +* Static Pattern:: Static pattern rules apply to multiple targets + and can vary the prerequisites according to + the target name. +* Double-Colon:: How to use a special kind of rule to allow + several independent rules for one target. +* Automatic Prerequisites:: How to automatically generate rules giving + prerequisites from source files themselves. +@end menu + +@ifnottex +@node Rule Example, Rule Syntax, Rules, Rules +@section Rule Example + +Here is an example of a rule: + +@example +foo.o : foo.c defs.h # module for twiddling the frobs + cc -c -g foo.c +@end example + +Its target is @file{foo.o} and its prerequisites are @file{foo.c} and +@file{defs.h}. It has one command in the recipe: @samp{cc -c -g foo.c}. +The recipe starts with a tab to identify it as a recipe. + +This rule says two things: + +@itemize @bullet +@item +How to decide whether @file{foo.o} is out of date: it is out of date +if it does not exist, or if either @file{foo.c} or @file{defs.h} is +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 is why @file{defs.h} was added +to the prerequisites. +@end itemize +@end ifnottex + +@node Rule Syntax, Prerequisite Types, Rule Example, Rules +@section Rule Syntax + +@cindex rule syntax +@cindex syntax of rules +In general, a rule looks like this: + +@example +@var{targets} : @var{prerequisites} + @var{recipe} + @dots{} +@end example + +@noindent +or like this: + +@example +@var{targets} : @var{prerequisites} ; @var{recipe} + @var{recipe} + @dots{} +@end example + +@cindex targets +@cindex rule targets +The @var{targets} are file names, separated by spaces. Wildcard +characters may be used (@pxref{Wildcards, ,Using Wildcard Characters +in File Names}) and a name of the form @file{@var{a}(@var{m})} +represents member @var{m} in archive file @var{a} +(@pxref{Archive Members, ,Archive Members as Targets}). +Usually there is only one +target per rule, but occasionally there is a reason to have more +(@pxref{Multiple Targets, , Multiple Targets in a Rule}).@refill + +@cindex recipes +@cindex tab character (in commands) +The @var{recipe} lines start with a tab character (or the first +character in the value of the @code{.RECIPEPREFIX} variable; +@pxref{Special Variables}). The first recipe line may appear on the line +after the prerequisites, with a tab character, or may appear on the +same line, with a semicolon. Either way, the effect is the same. +There are other differences in the syntax of recipes. +@xref{Recipes, ,Writing Recipes in Rules}. + +@cindex dollar sign (@code{$}), in rules +@cindex @code{$}, in rules +@cindex rules, and @code{$} +Because dollar signs are used to start @code{make} variable +references, if you really want a dollar sign in a target or +prerequisite you must write two of them, @samp{$$} (@pxref{Using +Variables, ,How to Use Variables}). If you have enabled secondary +expansion (@pxref{Secondary Expansion}) and you want a literal dollar +sign in the prerequisites list, you must actually write @emph{four} +dollar signs (@samp{$$$$}). + +You may split a long line by inserting a backslash followed by a +newline, but this is not required, as @code{make} places no limit on +the length of a line in a makefile. + +A rule tells @code{make} two things: when the targets are out of date, +and how to update them when necessary. + +@cindex prerequisites +@cindex rule prerequisites +The criterion for being out of date is specified in terms of the +@var{prerequisites}, which consist of file names separated by spaces. +(Wildcards and archive members (@pxref{Archives}) are allowed here too.) +A target is out of date if it does not exist or if it is older than any +of the prerequisites (by comparison of last-modification times). The +idea is that the contents of the target file are computed based on +information in the prerequisites, so if any of the prerequisites changes, +the contents of the existing target file are no longer necessarily +valid. + +How to update is specified by a @var{recipe}. This is one or more +lines to be executed by the shell (normally @samp{sh}), but with some +extra features (@pxref{Recipes, ,Writing Recipes in Rules}). + +@node Prerequisite Types, Wildcards, Rule Syntax, Rules +@comment node-name, next, previous, up +@section Types of Prerequisites +@cindex prerequisite types +@cindex types of prerequisites + +@cindex prerequisites, normal +@cindex normal prerequisites +@cindex prerequisites, order-only +@cindex order-only prerequisites +There are actually two different types of prerequisites understood by +GNU @code{make}: normal prerequisites such as described in the +previous section, and @dfn{order-only} prerequisites. A normal +prerequisite makes two statements: first, it imposes an order in which +recipes will be invoked: the recipes for all prerequisites of a target +will be completed before the recipe for the target is run. Second, it +imposes a dependency relationship: if any prerequisite is newer than +the target, then the target is considered out-of-date and must be +rebuilt. + +Normally, this is exactly what you want: if a target's prerequisite is +updated, then the target should also be updated. + +Occasionally, however, you have a situation where you want to impose a +specific ordering on the rules to be invoked @emph{without} forcing +the target to be updated if one of those rules is executed. In that +case, you want to define @dfn{order-only} prerequisites. Order-only +prerequisites can be specified by placing a pipe symbol (@code{|}) +in the prerequisites list: any prerequisites to the left of the pipe +symbol are normal; any prerequisites to the right are order-only: + +@example +@var{targets} : @var{normal-prerequisites} | @var{order-only-prerequisites} +@end example + +The normal prerequisites section may of course be empty. Also, you +may still declare multiple lines of prerequisites for the same target: +they are appended appropriately (normal prerequisites are appended to +the list of normal prerequisites; order-only prerequisites are +appended to the list of order-only prerequisites). Note that if you +declare the same file to be both a normal and an order-only +prerequisite, the normal prerequisite takes precedence (since they +have a strict superset of the behavior of an order-only prerequisite). + +Consider an example where your targets are to be placed in a separate +directory, and that directory might not exist before @code{make} is +run. In this situation, you want the directory to be created before +any targets are placed into it but, because the timestamps on +directories change whenever a file is added, removed, or renamed, we +certainly don't want to rebuild all the targets whenever the +directory's timestamp changes. One way to manage this is with +order-only prerequisites: make the directory an order-only +prerequisite on all the targets: + +@example +OBJDIR := objdir +OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o) + +$(OBJDIR)/%.o : %.c + $(COMPILE.c) $(OUTPUT_OPTION) $< + +all: $(OBJS) + +$(OBJS): | $(OBJDIR) + +$(OBJDIR): + mkdir $(OBJDIR) +@end example + +Now the rule to create the @file{objdir} directory will be run, if +needed, before any @samp{.o} is built, but no @samp{.o} will be built +because the @file{objdir} directory timestamp changed. + +@node Wildcards, Directory Search, Prerequisite Types, Rules +@section Using Wildcard Characters in File Names +@cindex wildcard +@cindex file name with wildcards +@cindex globbing (wildcards) + +@cindex @code{*} (wildcard character) +@cindex @code{?} (wildcard character) +@cindex @code{[@dots{}]} (wildcard characters) +A single file name can specify many files using @dfn{wildcard characters}. +The wildcard characters in @code{make} are @samp{*}, @samp{?} and +@samp{[@dots{}]}, the same as in the Bourne shell. For example, @file{*.c} +specifies a list of all the files (in the working directory) whose names +end in @samp{.c}.@refill + +@cindex @code{~} (tilde) +@cindex tilde (@code{~}) +@cindex home directory +The character @samp{~} at the beginning of a file name also has special +significance. If alone, or followed by a slash, it represents your home +directory. For example @file{~/bin} expands to @file{/home/you/bin}. +If the @samp{~} is followed by a word, the string represents the home +directory of the user named by that word. For example @file{~john/bin} +expands to @file{/home/john/bin}. On systems which don't have a home +directory for each user (such as MS-DOS or MS-Windows), this +functionality can be simulated by setting the environment variable +@var{HOME}.@refill + +Wildcard expansion is performed by @code{make} automatically in +targets and in prerequisites. In recipes, the shell is responsible +for wildcard expansion. In other contexts, wildcard expansion happens +only if you request it explicitly with the @code{wildcard} function. + +The special significance of a wildcard character can be turned off by +preceding it with a backslash. Thus, @file{foo\*bar} would refer to a +specific file whose name consists of @samp{foo}, an asterisk, and +@samp{bar}.@refill + +@menu +* Wildcard Examples:: Several examples. +* Wildcard Pitfall:: Problems to avoid. +* Wildcard Function:: How to cause wildcard expansion where + it does not normally take place. +@end menu + +@node Wildcard Examples, Wildcard Pitfall, Wildcards, Wildcards +@subsection Wildcard Examples + +Wildcards can be used in the recipe of a rule, where they are expanded +by the shell. For example, here is a rule to delete all the object files: + +@example +@group +clean: + rm -f *.o +@end group +@end example +@cindex @code{rm} (shell command) + +Wildcards are also useful in the prerequisites of a rule. With the +following rule in the makefile, @samp{make print} will print all the +@samp{.c} files that have changed since the last time you printed them: + +@example +print: *.c + lpr -p $? + touch print +@end example + +@cindex @code{print} target +@cindex @code{lpr} (shell command) +@cindex @code{touch} (shell command) +@noindent +This rule uses @file{print} as an empty target file; see @ref{Empty +Targets, ,Empty Target Files to Record Events}. (The automatic variable +@samp{$?} is used to print only those files that have changed; see +@ref{Automatic Variables}.)@refill + +Wildcard expansion does not happen when you define a variable. Thus, if +you write this: + +@example +objects = *.o +@end example + +@noindent +then the value of the variable @code{objects} is the actual string +@samp{*.o}. However, if you use the value of @code{objects} in a +target or prerequisite, wildcard expansion will take place there. If +you use the value of @code{objects} in a recipe, the shell may perform +wildcard expansion when the recipe runs. To set @code{objects} to the +expansion, instead use: + +@example +objects := $(wildcard *.o) +@end example + +@noindent +@xref{Wildcard Function}. + +@node Wildcard Pitfall, Wildcard Function, Wildcard Examples, Wildcards +@subsection Pitfalls of Using Wildcards +@cindex wildcard pitfalls +@cindex pitfalls of wildcards +@cindex mistakes with wildcards +@cindex errors with wildcards +@cindex problems with wildcards + +Now here is an example of a naive way of using wildcard expansion, that +does not do what you would intend. Suppose you would like to say that the +executable file @file{foo} is made from all the object files in the +directory, and you write this: + +@example +objects = *.o + +foo : $(objects) + cc -o foo $(CFLAGS) $(objects) +@end example + +@noindent +The value of @code{objects} is the actual string @samp{*.o}. Wildcard +expansion happens in the rule for @file{foo}, so that each @emph{existing} +@samp{.o} file becomes a prerequisite of @file{foo} and will be recompiled if +necessary. + +But what if you delete all the @samp{.o} files? When a wildcard matches +no files, it is left as it is, so then @file{foo} will depend on the +oddly-named file @file{*.o}. Since no such file is likely to exist, +@code{make} will give you an error saying it cannot figure out how to +make @file{*.o}. This is not what you want! + +Actually it is possible to obtain the desired result with wildcard +expansion, but you need more sophisticated techniques, including the +@code{wildcard} function and string substitution. +@ifnottex +@xref{Wildcard Function, ,The Function @code{wildcard}}. +@end ifnottex +@iftex +These are described in the following section. +@end iftex + +@cindex wildcards and MS-DOS/MS-Windows backslashes +@cindex backslashes in pathnames and wildcard expansion + +Microsoft operating systems (MS-DOS and MS-Windows) use backslashes to +separate directories in pathnames, like so: + +@example + c:\foo\bar\baz.c +@end example + +This is equivalent to the Unix-style @file{c:/foo/bar/baz.c} (the +@file{c:} part is the so-called drive letter). When @code{make} runs on +these systems, it supports backslashes as well as the Unix-style forward +slashes in pathnames. However, this support does @emph{not} include the +wildcard expansion, where backslash is a quote character. Therefore, +you @emph{must} use Unix-style slashes in these cases. + + +@node Wildcard Function, , Wildcard Pitfall, Wildcards +@subsection The Function @code{wildcard} +@findex wildcard + +Wildcard expansion happens automatically in rules. But wildcard expansion +does not normally take place when a variable is set, or inside the +arguments of a function. If you want to do wildcard expansion in such +places, you need to use the @code{wildcard} function, like this: + +@example +$(wildcard @var{pattern}@dots{}) +@end example + +@noindent +This string, used anywhere in a makefile, is replaced by a +space-separated list of names of existing files that match one of the +given file name patterns. If no existing file name matches a pattern, +then that pattern is omitted from the output of the @code{wildcard} +function. Note that this is different from how unmatched wildcards +behave in rules, where they are used verbatim rather than ignored +(@pxref{Wildcard Pitfall}). + +One use of the @code{wildcard} function is to get a list of all the C source +files in a directory, like this: + +@example +$(wildcard *.c) +@end example + +We can change the list of C source files into a list of object files by +replacing the @samp{.c} suffix with @samp{.o} in the result, like this: + +@example +$(patsubst %.c,%.o,$(wildcard *.c)) +@end example + +@noindent +(Here we have used another function, @code{patsubst}. +@xref{Text Functions, ,Functions for String Substitution and Analysis}.)@refill + +Thus, a makefile to compile all C source files in the directory and then +link them together could be written as follows: + +@example +objects := $(patsubst %.c,%.o,$(wildcard *.c)) + +foo : $(objects) + cc -o foo $(objects) +@end example + +@noindent +(This takes advantage of the implicit rule for compiling C programs, so +there is no need to write explicit rules for compiling the files. +@xref{Flavors, ,The Two Flavors of Variables}, for an explanation of +@samp{:=}, which is a variant of @samp{=}.) + +@node Directory Search, Phony Targets, Wildcards, Rules +@section Searching Directories for Prerequisites +@vindex VPATH +@findex vpath +@cindex vpath +@cindex search path for prerequisites (@code{VPATH}) +@cindex directory search (@code{VPATH}) + +For large systems, it is often desirable to put sources in a separate +directory from the binaries. The @dfn{directory search} features of +@code{make} facilitate this by searching several directories +automatically to find a prerequisite. When you redistribute the files +among directories, you do not need to change the individual rules, +just the search paths. + +@menu +* General Search:: Specifying a search path that applies + to every prerequisite. +* Selective Search:: Specifying a search path + for a specified class of names. +* Search Algorithm:: When and how search paths are applied. +* Recipes/Search:: How to write recipes that work together + with search paths. +* Implicit/Search:: How search paths affect implicit rules. +* Libraries/Search:: Directory search for link libraries. +@end menu + +@node General Search, Selective Search, Directory Search, Directory Search +@subsection @code{VPATH}: Search Path for All Prerequisites +@vindex VPATH + +The value of the @code{make} variable @code{VPATH} specifies a list of +directories that @code{make} should search. Most often, the +directories are expected to contain prerequisite files that are not in the +current directory; however, @code{make} uses @code{VPATH} as a search +list for both prerequisites and targets of rules. + +Thus, if a file that is listed as a target or prerequisite does not exist +in the current directory, @code{make} searches the directories listed in +@code{VPATH} for a file with that name. If a file is found in one of +them, that file may become the prerequisite (see below). Rules may then +specify the names of files in the prerequisite list as if they all +existed in the current directory. @xref{Recipes/Search, ,Writing Recipes with Directory Search}. + +In the @code{VPATH} variable, directory names are separated by colons or +blanks. The order in which directories are listed is the order followed +by @code{make} in its search. (On MS-DOS and MS-Windows, semi-colons +are used as separators of directory names in @code{VPATH}, since the +colon can be used in the pathname itself, after the drive letter.) + +For example, + +@example +VPATH = src:../headers +@end example + +@noindent +specifies a path containing two directories, @file{src} and +@file{../headers}, which @code{make} searches in that order. + +With this value of @code{VPATH}, the following rule, + +@example +foo.o : foo.c +@end example + +@noindent +is interpreted as if it were written like this: + +@example +foo.o : src/foo.c +@end example + +@noindent +assuming the file @file{foo.c} does not exist in the current directory but +is found in the directory @file{src}. + +@node Selective Search, Search Algorithm, General Search, Directory Search +@subsection The @code{vpath} Directive +@findex vpath + +Similar to the @code{VPATH} variable, but more selective, is the +@code{vpath} directive (note lower case), which allows you to specify a +search path for a particular class of file names: those that match a +particular pattern. Thus you can supply certain search directories for +one class of file names and other directories (or none) for other file +names. + +There are three forms of the @code{vpath} directive: + +@table @code +@item vpath @var{pattern} @var{directories} +Specify the search path @var{directories} for file names that match +@var{pattern}. + +The search path, @var{directories}, is a list of directories to be +searched, separated by colons (semi-colons on MS-DOS and MS-Windows) or +blanks, just like the search path used in the @code{VPATH} variable. + +@item vpath @var{pattern} +Clear out the search path associated with @var{pattern}. + +@c Extra blank line makes sure this gets two lines. +@item vpath + +Clear all search paths previously specified with @code{vpath} directives. +@end table + +A @code{vpath} pattern is a string containing a @samp{%} character. The +string must match the file name of a prerequisite that is being searched +for, the @samp{%} character matching any sequence of zero or more +characters (as in pattern rules; @pxref{Pattern Rules, ,Defining and +Redefining Pattern Rules}). For example, @code{%.h} matches files that +end in @code{.h}. (If there is no @samp{%}, the pattern must match the +prerequisite exactly, which is not useful very often.) + +@cindex @code{%}, quoting in @code{vpath} +@cindex @code{%}, quoting with @code{\} (backslash) +@cindex @code{\} (backslash), to quote @code{%} +@cindex backslash (@code{\}), to quote @code{%} +@cindex quoting @code{%}, in @code{vpath} +@samp{%} characters in a @code{vpath} directive's pattern can be quoted +with preceding backslashes (@samp{\}). Backslashes that would otherwise +quote @samp{%} characters can be quoted with more backslashes. +Backslashes that quote @samp{%} characters or other backslashes are +removed from the pattern before it is compared to file names. Backslashes +that are not in danger of quoting @samp{%} characters go unmolested.@refill + +When a prerequisite fails to exist in the current directory, if the +@var{pattern} in a @code{vpath} directive matches the name of the +prerequisite file, then the @var{directories} in that directive are searched +just like (and before) the directories in the @code{VPATH} variable. + +For example, + +@example +vpath %.h ../headers +@end example + +@noindent +tells @code{make} to look for any prerequisite whose name ends in @file{.h} +in the directory @file{../headers} if the file is not found in the current +directory. + +If several @code{vpath} patterns match the prerequisite file's name, then +@code{make} processes each matching @code{vpath} directive one by one, +searching all the directories mentioned in each directive. @code{make} +handles multiple @code{vpath} directives in the order in which they +appear in the makefile; multiple directives with the same pattern are +independent of each other. + +@need 750 +Thus, + +@example +@group +vpath %.c foo +vpath % blish +vpath %.c bar +@end group +@end example + +@noindent +will look for a file ending in @samp{.c} in @file{foo}, then +@file{blish}, then @file{bar}, while + +@example +@group +vpath %.c foo:bar +vpath % blish +@end group +@end example + +@noindent +will look for a file ending in @samp{.c} in @file{foo}, then +@file{bar}, then @file{blish}. + +@node Search Algorithm, Recipes/Search, Selective Search, Directory Search +@subsection How Directory Searches are Performed +@cindex algorithm for directory search +@cindex directory search algorithm + +When a prerequisite is found through directory search, regardless of type +(general or selective), the pathname located may not be the one that +@code{make} actually provides you in the prerequisite list. Sometimes +the path discovered through directory search is thrown away. + +The algorithm @code{make} uses to decide whether to keep or abandon a +path found via directory search is as follows: + +@enumerate +@item +If a target file does not exist at the path specified in the makefile, +directory search is performed. + +@item +If the directory search is successful, that path is kept and this file +is tentatively stored as the target. + +@item +All prerequisites of this target are examined using this same method. + +@item +After processing the prerequisites, the target may or may not need to be +rebuilt: + +@enumerate a +@item +If the target does @emph{not} need to be rebuilt, the path to the file +found during directory search is used for any prerequisite lists which +contain this target. In short, if @code{make} doesn't need to rebuild +the target then you use the path found via directory search. + +@item +If the target @emph{does} need to be rebuilt (is out-of-date), the +pathname found during directory search is @emph{thrown away}, and the +target is rebuilt using the file name specified in the makefile. In +short, if @code{make} must rebuild, then the target is rebuilt locally, +not in the directory found via directory search. +@end enumerate +@end enumerate + +This algorithm may seem complex, but in practice it is quite often +exactly what you want. + +@cindex traditional directory search (GPATH) +@cindex directory search, traditional (GPATH) +Other versions of @code{make} use a simpler algorithm: if the file does +not exist, and it is found via directory search, then that pathname is +always used whether or not the target needs to be built. Thus, if the +target is rebuilt it is created at the pathname discovered during +directory search. + +@vindex GPATH +If, in fact, this is the behavior you want for some or all of your +directories, you can use the @code{GPATH} variable to indicate this to +@code{make}. + +@code{GPATH} has the same syntax and format as @code{VPATH} (that is, a +space- or colon-delimited list of pathnames). If an out-of-date target +is found by directory search in a directory that also appears in +@code{GPATH}, then that pathname is not thrown away. The target is +rebuilt using the expanded path. + +@node Recipes/Search, Implicit/Search, Search Algorithm, Directory Search +@subsection Writing Recipes with Directory Search +@cindex recipes, and directory search +@cindex directory search (@code{VPATH}), and recipes + +When a prerequisite is found in another directory through directory search, +this cannot change the recipe of the rule; they will execute as written. +Therefore, you must write the recipe with care so that it will look for +the prerequisite in the directory where @code{make} finds it. + +This is done with the @dfn{automatic variables} such as @samp{$^} +(@pxref{Automatic Variables}). +For instance, the value of @samp{$^} is a +list of all the prerequisites of the rule, including the names of +the directories in which they were found, and the value of +@samp{$@@} is the target. Thus:@refill + +@example +foo.o : foo.c + cc -c $(CFLAGS) $^ -o $@@ +@end example + +@noindent +(The variable @code{CFLAGS} exists so you can specify flags for C +compilation by implicit rules; we use it here for consistency so it will +affect all C compilations uniformly; +@pxref{Implicit Variables, ,Variables Used by Implicit Rules}.) + +Often the prerequisites include header files as well, which you do not +want to mention in the recipe. The automatic variable @samp{$<} is +just the first prerequisite: + +@example +VPATH = src:../headers +foo.o : foo.c defs.h hack.h + cc -c $(CFLAGS) $< -o $@@ +@end example + +@node Implicit/Search, Libraries/Search, Recipes/Search, Directory Search +@subsection Directory Search and Implicit Rules +@cindex @code{VPATH}, and implicit rules +@cindex directory search (@code{VPATH}), and implicit rules +@cindex search path for prerequisites (@code{VPATH}), and implicit rules +@cindex implicit rule, and directory search +@cindex implicit rule, and @code{VPATH} +@cindex rule, implicit, and directory search +@cindex rule, implicit, and @code{VPATH} + +The search through the directories specified in @code{VPATH} or with +@code{vpath} also happens during consideration of implicit rules +(@pxref{Implicit Rules, ,Using Implicit Rules}). + +For example, when a file @file{foo.o} has no explicit rule, @code{make} +considers implicit rules, such as the built-in rule to compile +@file{foo.c} if that file exists. If such a file is lacking in the +current directory, the appropriate directories are searched for it. If +@file{foo.c} exists (or is mentioned in the makefile) in any of the +directories, the implicit rule for C compilation is applied. + +The recipes of implicit rules normally use automatic variables as a +matter of necessity; consequently they will use the file names found by +directory search with no extra effort. + +@node Libraries/Search, , Implicit/Search, Directory Search +@subsection Directory Search for Link Libraries +@cindex link libraries, and directory search +@cindex libraries for linking, directory search +@cindex directory search (@code{VPATH}), and link libraries +@cindex @code{VPATH}, and link libraries +@cindex search path for prerequisites (@code{VPATH}), and link libraries +@cindex @code{-l} (library search) +@cindex link libraries, patterns matching +@cindex @code{.LIBPATTERNS}, and link libraries +@vindex .LIBPATTERNS + +Directory search applies in a special way to libraries used with the +linker. This special feature comes into play when you write a prerequisite +whose name is of the form @samp{-l@var{name}}. (You can tell something +strange is going on here because the prerequisite is normally the name of a +file, and the @emph{file name} of a library generally looks like +@file{lib@var{name}.a}, not like @samp{-l@var{name}}.)@refill + +When a prerequisite's name has the form @samp{-l@var{name}}, @code{make} +handles it specially by searching for the file @file{lib@var{name}.so}, +and, if it is not found, for the file @file{lib@var{name}.a} in the current +directory, in directories specified by matching @code{vpath} +search paths and the @code{VPATH} search path, and then in the +directories @file{/lib}, @file{/usr/lib}, and @file{@var{prefix}/lib} +(normally @file{/usr/local/lib}, but MS-DOS/MS-Windows versions of +@code{make} behave as if @var{prefix} is defined to be the root of the +DJGPP installation tree). + +For example, if there is a @file{/usr/lib/libcurses.a} library on your +system (and no @file{/usr/lib/libcurses.so} file), then + +@example +@group +foo : foo.c -lcurses + cc $^ -o $@@ +@end group +@end example + +@noindent +would cause the command @samp{cc foo.c /usr/lib/libcurses.a -o foo} to +be executed when @file{foo} is older than @file{foo.c} or than +@file{/usr/lib/libcurses.a}.@refill + +Although the default set of files to be searched for is +@file{lib@var{name}.so} and @file{lib@var{name}.a}, this is customizable +via the @code{.LIBPATTERNS} variable. Each word in the value of this +variable is a pattern string. When a prerequisite like +@samp{-l@var{name}} is seen, @code{make} will replace the percent in +each pattern in the list with @var{name} and perform the above directory +searches using each library file name. + +The default value for @code{.LIBPATTERNS} is @samp{lib%.so lib%.a}, +which provides the default behavior described above. + +You can turn off link library expansion completely by setting this +variable to an empty value. + +@node Phony Targets, Force Targets, Directory Search, Rules +@section Phony Targets +@cindex phony targets +@cindex targets, phony +@cindex targets without a file + +A phony target is one that is not really the name of a file; rather it +is just a name for a recipe to be executed when you make an explicit +request. There are two reasons to use a phony target: to avoid a +conflict with a file of the same name, and to improve performance. + +If you write a rule whose recipe will not create the target file, the +recipe will be executed every time the target comes up for remaking. +Here is an example: + +@example +@group +clean: + rm *.o temp +@end group +@end example + +@noindent +Because the @code{rm} command does not create a file named @file{clean}, +probably no such file will ever exist. Therefore, the @code{rm} command +will be executed every time you say @samp{make clean}. +@cindex @code{rm} (shell command) + +@findex .PHONY +In this example, the @file{clean} target will not work properly if a +file named @file{clean} is ever created in this directory. Since it +has no prerequisites, @file{clean} would always be considered up to +date and its recipe would not be executed. To avoid this problem you +can explicitly declare the target to be phony by making it a +prerequisite of the special target @code{.PHONY} +(@pxref{Special Targets, ,Special Built-in Target Names}) as follows: + +@example +@group +.PHONY: clean +clean: + rm *.o temp +@end group +@end example + +@noindent +Once this is done, @samp{make clean} will run the recipe regardless of +whether there is a file named @file{clean}. + +Phony targets are also useful in conjunction with recursive +invocations of @code{make} (@pxref{Recursion, ,Recursive Use of @code{make}}). +In this situation the makefile will often contain a variable which +lists a number of sub-directories to be built. A simplistic way to +handle this is to define one rule with a recipe that loops over the +sub-directories, like this: + +@example +@group +SUBDIRS = foo bar baz + +subdirs: + for dir in $(SUBDIRS); do \ + $(MAKE) -C $$dir; \ + done +@end group +@end example + +There are problems with this method, however. First, any error +detected in a sub-make is ignored by this rule, so it will continue +to build the rest of the directories even when one fails. This can be +overcome by adding shell commands to note the error and exit, but then +it will do so even if @code{make} is invoked with the @code{-k} +option, which is unfortunate. Second, and perhaps more importantly, +you cannot take advantage of @code{make}'s ability to build targets in +parallel (@pxref{Parallel, ,Parallel Execution}), since there is only +one rule. + +By declaring the sub-directories as @code{.PHONY} targets (you must do +this as the sub-directory obviously always exists; otherwise it won't +be built) you can remove these problems: + +@example +@group +SUBDIRS = foo bar baz + +.PHONY: subdirs $(SUBDIRS) + +subdirs: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) -C $@@ + +foo: baz +@end group +@end example + +Here we've also declared that the @file{foo} sub-directory cannot be +built until after the @file{baz} sub-directory is complete; this kind of +relationship declaration is particularly important when attempting +parallel builds. + +The implicit rule search (@pxref{Implicit Rules}) is skipped for +@code{.PHONY} targets. This is why declaring a target as +@code{.PHONY} is good for performance, even if you are not worried +about the actual file existing. + +A phony target should not be a prerequisite of a real target file; if it +is, its recipe will be run every time @code{make} goes to update that +file. As long as a phony target is never a prerequisite of a real +target, the phony target recipe will be executed only when the phony +target is a specified goal (@pxref{Goals, ,Arguments to Specify the +Goals}). + +Phony targets can have prerequisites. When one directory contains multiple +programs, it is most convenient to describe all of the programs in one +makefile @file{./Makefile}. Since the target remade by default will be the +first one in the makefile, it is common to make this a phony target named +@samp{all} and give it, as prerequisites, all the individual programs. For +example: + +@example +all : prog1 prog2 prog3 +.PHONY : all + +prog1 : prog1.o utils.o + cc -o prog1 prog1.o utils.o + +prog2 : prog2.o + cc -o prog2 prog2.o + +prog3 : prog3.o sort.o utils.o + cc -o prog3 prog3.o sort.o utils.o +@end example + +@noindent +Now you can say just @samp{make} to remake all three programs, or +specify as arguments the ones to remake (as in @samp{make prog1 +prog3}). Phoniness is not inherited: the prerequisites of a phony +target are not themselves phony, unless explicitly declared to be so. + +When one phony target is a prerequisite of another, it serves as a subroutine +of the other. For example, here @samp{make cleanall} will delete the +object files, the difference files, and the file @file{program}: + +@example +.PHONY: cleanall cleanobj cleandiff + +cleanall : cleanobj cleandiff + rm program + +cleanobj : + rm *.o + +cleandiff : + rm *.diff +@end example + +@node Force Targets, Empty Targets, Phony Targets, Rules +@section Rules without Recipes or Prerequisites +@cindex force targets +@cindex targets, force +@cindex @code{FORCE} +@cindex rule, no recipe or prerequisites + +If a rule has no prerequisites or recipe, and the target of the rule +is a nonexistent file, then @code{make} imagines this target to have +been updated whenever its rule is run. This implies that all targets +depending on this one will always have their recipe run. + +An example will illustrate this: + +@example +@group +clean: FORCE + rm $(objects) +FORCE: +@end group +@end example + +Here the target @samp{FORCE} satisfies the special conditions, so the +target @file{clean} that depends on it is forced to run its recipe. +There is nothing special about the name @samp{FORCE}, but that is one +name commonly used this way. + +As you can see, using @samp{FORCE} this way has the same results as using +@samp{.PHONY: clean}. + +Using @samp{.PHONY} is more explicit and more efficient. However, +other versions of @code{make} do not support @samp{.PHONY}; thus +@samp{FORCE} appears in many makefiles. @xref{Phony Targets}. + +@node Empty Targets, Special Targets, Force Targets, Rules +@section Empty Target Files to Record Events +@cindex empty targets +@cindex targets, empty +@cindex recording events with empty targets + +The @dfn{empty target} is a variant of the phony target; it is used to hold +recipes for an action that you request explicitly from time to time. +Unlike a phony target, this target file can really exist; but the file's +contents do not matter, and usually are empty. + +The purpose of the empty target file is to record, with its +last-modification time, when the rule's recipe was last executed. It +does so because one of the commands in the recipe is a @code{touch} +command to update the target file. + +The empty target file should have some prerequisites (otherwise it +doesn't make sense). When you ask to remake the empty target, the +recipe is executed if any prerequisite is more recent than the target; +in other words, if a prerequisite has changed since the last time you +remade the target. Here is an example: + +@example +print: foo.c bar.c + lpr -p $? + touch print +@end example +@cindex @code{print} target +@cindex @code{lpr} (shell command) +@cindex @code{touch} (shell command) + +@noindent +With this rule, @samp{make print} will execute the @code{lpr} command if +either source file has changed since the last @samp{make print}. The +automatic variable @samp{$?} is used to print only those files that have +changed (@pxref{Automatic Variables}). + +@node Special Targets, Multiple Targets, Empty Targets, Rules +@section Special Built-in Target Names +@cindex special targets +@cindex built-in special targets +@cindex targets, built-in special + +Certain names have special meanings if they appear as targets. + +@table @code +@findex .PHONY +@item .PHONY + +The prerequisites of the special target @code{.PHONY} are considered to +be phony targets. When it is time to consider such a target, +@code{make} will run its recipe unconditionally, regardless of +whether a file with that name exists or what its last-modification +time is. @xref{Phony Targets, ,Phony Targets}. + +@findex .SUFFIXES +@item .SUFFIXES + +The prerequisites of the special target @code{.SUFFIXES} are the list +of suffixes to be used in checking for suffix rules. +@xref{Suffix Rules, , Old-Fashioned Suffix Rules}. + +@findex .DEFAULT +@item .DEFAULT + +The recipe specified for @code{.DEFAULT} is used for any target for +which no rules are found (either explicit rules or implicit rules). +@xref{Last Resort}. If a @code{.DEFAULT} recipe is specified, every +file mentioned as a prerequisite, but not as a target in a rule, will have +that recipe executed on its behalf. @xref{Implicit Rule Search, +,Implicit Rule Search Algorithm}. + +@findex .PRECIOUS +@item .PRECIOUS +@cindex precious targets +@cindex preserving with @code{.PRECIOUS} + +The targets which @code{.PRECIOUS} depends on are given the following +special treatment: if @code{make} is killed or interrupted during the +execution of their recipes, the target is not deleted. +@xref{Interrupts, ,Interrupting or Killing @code{make}}. Also, if the +target is an intermediate file, it will not be deleted after it is no +longer needed, as is normally done. @xref{Chained Rules, ,Chains of +Implicit Rules}. In this latter respect it overlaps with the +@code{.SECONDARY} special target. + +You can also list the target pattern of an implicit rule (such as +@samp{%.o}) as a prerequisite file of the special target @code{.PRECIOUS} +to preserve intermediate files created by rules whose target patterns +match that file's name. + +@findex .INTERMEDIATE +@item .INTERMEDIATE +@cindex intermediate targets, explicit + +The targets which @code{.INTERMEDIATE} depends on are treated as +intermediate files. @xref{Chained Rules, ,Chains of Implicit Rules}. +@code{.INTERMEDIATE} with no prerequisites has no effect. + +@findex .SECONDARY +@item .SECONDARY +@cindex secondary targets +@cindex preserving with @code{.SECONDARY} + +The targets which @code{.SECONDARY} depends on are treated as +intermediate files, except that they are never automatically deleted. +@xref{Chained Rules, ,Chains of Implicit Rules}. + +@code{.SECONDARY} with no prerequisites causes all targets to be treated +as secondary (i.e., no target is removed because it is considered +intermediate). + +@findex .SECONDEXPANSION +@item .SECONDEXPANSION + +If @code{.SECONDEXPANSION} is mentioned as a target anywhere in the +makefile, then all prerequisite lists defined @emph{after} it appears +will be expanded a second time after all makefiles have been read in. +@xref{Secondary Expansion, ,Secondary Expansion}. + +@findex .DELETE_ON_ERROR +@item .DELETE_ON_ERROR +@cindex removing targets on failure + +If @code{.DELETE_ON_ERROR} is mentioned as a target anywhere in the +makefile, then @code{make} will delete the target of a rule if it has +changed and its recipe exits with a nonzero exit status, just as it +does when it receives a signal. @xref{Errors, ,Errors in Recipes}. + +@findex .IGNORE +@item .IGNORE + +If you specify prerequisites for @code{.IGNORE}, then @code{make} will +ignore errors in execution of the recipe for those particular files. +The recipe for @code{.IGNORE} (if any) is ignored. + +If mentioned as a target with no prerequisites, @code{.IGNORE} says to +ignore errors in execution of recipes for all files. This usage of +@samp{.IGNORE} is supported only for historical compatibility. Since +this affects every recipe in the makefile, it is not very useful; we +recommend you use the more selective ways to ignore errors in specific +recipes. @xref{Errors, ,Errors in Recipes}. + +@findex .LOW_RESOLUTION_TIME +@item .LOW_RESOLUTION_TIME + +If you specify prerequisites for @code{.LOW_RESOLUTION_TIME}, +@command{make} assumes that these files are created by commands that +generate low resolution time stamps. The recipe for the +@code{.LOW_RESOLUTION_TIME} target are ignored. + +The high resolution file time stamps of many modern file systems +lessen the chance of @command{make} incorrectly concluding that a file +is up to date. Unfortunately, some hosts do not provide a way to set a +high resolution file time stamp, so commands like @samp{cp -p} that +explicitly set a file's time stamp must discard its sub-second part. +If a file is created by such a command, you should list it as a +prerequisite of @code{.LOW_RESOLUTION_TIME} so that @command{make} +does not mistakenly conclude that the file is out of date. For +example: + +@example +@group +.LOW_RESOLUTION_TIME: dst +dst: src + cp -p src dst +@end group +@end example + +Since @samp{cp -p} discards the sub-second part of @file{src}'s time +stamp, @file{dst} is typically slightly older than @file{src} even when +it is up to date. The @code{.LOW_RESOLUTION_TIME} line causes +@command{make} to consider @file{dst} to be up to date if its time stamp +is at the start of the same second that @file{src}'s time stamp is in. + +Due to a limitation of the archive format, archive member time stamps +are always low resolution. You need not list archive members as +prerequisites of @code{.LOW_RESOLUTION_TIME}, as @command{make} does this +automatically. + +@findex .SILENT +@item .SILENT + +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. 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}). + +@findex .EXPORT_ALL_VARIABLES +@item .EXPORT_ALL_VARIABLES + +Simply by being mentioned as a target, this tells @code{make} to +export all variables to child processes by default. +@xref{Variables/Recursion, ,Communicating Variables to a +Sub-@code{make}}. + +@findex .NOTPARALLEL +@item .NOTPARALLEL +@cindex parallel execution, overriding + +If @code{.NOTPARALLEL} is mentioned as a target, then this invocation +of @code{make} will be run serially, even if the @samp{-j} option is +given. Any recursively invoked @code{make} command will still run +recipes in parallel (unless its makefile also contains this target). +Any prerequisites on this target are ignored. + +@findex .ONESHELL +@item .ONESHELL +@cindex recipe execution, single invocation + +If @code{.ONESHELL} is mentioned as a target, then when a target is +built all lines of the recipe will be given to a single invocation of +the shell rather than each line being invoked separately +(@pxref{Execution, ,Recipe Execution}). + +@findex .POSIX +@item .POSIX +@cindex POSIX-conforming mode, setting + +If @code{.POSIX} is mentioned as a target, then the makefile will be +parsed and run in POSIX-conforming mode. This does @emph{not} mean +that only POSIX-conforming makefiles will be accepted: all advanced +GNU @code{make} features are still available. Rather, this target +causes @code{make} to behave as required by POSIX in those areas +where @code{make}'s default behavior differs. + +In particular, if this target is mentioned then recipes will be +invoked as if the shell had been passed the @code{-e} flag: the first +failing command in a recipe will cause the recipe to fail immediately. +@end table + +Any defined implicit rule suffix also counts as a special target if it +appears as a target, and so does the concatenation of two suffixes, such +as @samp{.c.o}. These targets are suffix rules, an obsolete way of +defining implicit rules (but a way still widely used). In principle, any +target name could be special in this way if you break it in two and add +both pieces to the suffix list. In practice, suffixes normally begin with +@samp{.}, so these special target names also begin with @samp{.}. +@xref{Suffix Rules, ,Old-Fashioned Suffix Rules}. + +@node Multiple Targets, Multiple Rules, Special Targets, Rules +@section Multiple Targets in a Rule +@cindex multiple targets +@cindex several targets in a rule +@cindex targets, multiple +@cindex rule, with multiple targets + +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. + +Rules with independent targets are useful in two cases: + +@itemize @bullet +@item +You want just prerequisites, no recipe. For example: + +@example +kbd.o command.o files.o: command.h +@end example + +@noindent +gives an additional prerequisite to each of the three object files +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 automatic variable +@samp{$@@} can be used to substitute the particular target to be +remade into the commands (@pxref{Automatic Variables}). For example: + +@example +@group +bigoutput littleoutput : text.g + generate text.g -$(subst output,,$@@) > $@@ +@end group +@end example +@findex subst + +@noindent +is equivalent to + +@example +bigoutput : text.g + generate text.g -big > bigoutput +littleoutput : text.g + generate text.g -little > littleoutput +@end example + +@noindent +Here we assume the hypothetical program @code{generate} makes two +types of output, one if given @samp{-big} and one if given +@samp{-little}. +@xref{Text Functions, ,Functions for String Substitution and Analysis}, +for an explanation of the @code{subst} function. +@end itemize + +Suppose you would like to vary the prerequisites according to the +target, much as the variable @samp{$@@} allows you to vary the recipe. +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 +@cindex several rules for one target +@cindex rule, multiple for one target +@cindex target, multiple rules for one + +One file can be the target of several rules. All the prerequisites +mentioned in all the rules are merged into one list of prerequisites for +the target. If the target is older than any prerequisite from any rule, +the recipe is executed. + +There can only be one recipe to be executed for a file. If more than +one rule gives a recipe for the same file, @code{make} uses the last +one given and prints an error message. (As a special case, if the +file's name begins with a dot, no error message is printed. This odd +behavior is only for compatibility with other implementations of +@code{make}@dots{} you should avoid using it). Occasionally it is +useful to have the same target invoke multiple recipes which are +defined in different parts of your makefile; you can use +@dfn{double-colon rules} (@pxref{Double-Colon}) for this. + +An extra rule with just prerequisites can be used to give a few extra +prerequisites to many files at once. For example, makefiles often +have a variable, such as @code{objects}, containing a list of all the +compiler output files in the system being made. An easy way to say +that all of them must be recompiled if @file{config.h} changes is to +write the following: + +@example +objects = foo.o bar.o +foo.o : defs.h +bar.o : defs.h test.h +$(objects) : config.h +@end example + +This could be inserted or taken out without changing the rules that really +specify how to make the object files, making it a convenient form to use if +you wish to add the additional prerequisite intermittently. + +Another wrinkle is that the additional prerequisites could be +specified with a variable that you set with a command line argument to +@code{make} (@pxref{Overriding, ,Overriding Variables}). For example, + +@example +@group +extradeps= +$(objects) : $(extradeps) +@end group +@end example + +@noindent +means that the command @samp{make extradeps=foo.h} will consider +@file{foo.h} as a prerequisite of each object file, but plain @samp{make} +will not. + +If none of the explicit rules for a target has a recipe, then @code{make} +searches for an applicable implicit rule to find one +@pxref{Implicit Rules, ,Using Implicit Rules}). + +@node Static Pattern, Double-Colon, Multiple Rules, Rules +@section Static Pattern Rules +@cindex static pattern rule +@cindex rule, static pattern +@cindex pattern rules, static (not implicit) +@cindex varying prerequisites +@cindex prerequisites, varying (static pattern) + +@dfn{Static pattern rules} are rules which specify multiple targets and +construct the prerequisite names for each target based on the target name. +They are more general than ordinary rules with multiple targets because the +targets do not have to have identical prerequisites. Their prerequisites must +be @emph{analogous}, but not necessarily @emph{identical}. + +@menu +* Static Usage:: The syntax of static pattern rules. +* Static versus Implicit:: When are they better than implicit rules? +@end menu + +@node Static Usage, Static versus Implicit, Static Pattern, Static Pattern +@subsection Syntax of Static Pattern Rules +@cindex static pattern rule, syntax of +@cindex pattern rules, static, syntax of + +Here is the syntax of a static pattern rule: + +@example +@var{targets} @dots{}: @var{target-pattern}: @var{prereq-patterns} @dots{} + @var{recipe} + @dots{} +@end example + +@noindent +The @var{targets} list specifies the targets that the rule applies to. +The targets can contain wildcard characters, just like the targets of +ordinary rules (@pxref{Wildcards, ,Using Wildcard Characters in File +Names}). + +@cindex target pattern, static (not implicit) +@cindex stem +The @var{target-pattern} and @var{prereq-patterns} say how to compute the +prerequisites of each target. Each target is matched against the +@var{target-pattern} to extract a part of the target name, called the +@dfn{stem}. This stem is substituted into each of the @var{prereq-patterns} +to make the prerequisite names (one from each @var{prereq-pattern}). + +Each pattern normally contains the character @samp{%} just once. When the +@var{target-pattern} matches a target, the @samp{%} can match any part of +the target name; this part is called the @dfn{stem}. The rest of the +pattern must match exactly. For example, the target @file{foo.o} matches +the pattern @samp{%.o}, with @samp{foo} as the stem. The targets +@file{foo.c} and @file{foo.out} do not match that pattern.@refill + +@cindex prerequisite pattern, static (not implicit) +The prerequisite names for each target are made by substituting the stem +for the @samp{%} in each prerequisite pattern. For example, if one +prerequisite pattern is @file{%.c}, then substitution of the stem +@samp{foo} gives the prerequisite name @file{foo.c}. It is legitimate +to write a prerequisite pattern that does not contain @samp{%}; then this +prerequisite is the same for all targets. + +@cindex @code{%}, quoting in static pattern +@cindex @code{%}, quoting with @code{\} (backslash) +@cindex @code{\} (backslash), to quote @code{%} +@cindex backslash (@code{\}), to quote @code{%} +@cindex quoting @code{%}, in static pattern +@samp{%} characters in pattern rules can be quoted with preceding +backslashes (@samp{\}). Backslashes that would otherwise quote @samp{%} +characters can be quoted with more backslashes. Backslashes that quote +@samp{%} characters or other backslashes are removed from the pattern +before it is compared to file names or has a stem substituted into it. +Backslashes that are not in danger of quoting @samp{%} characters go +unmolested. For example, the pattern @file{the\%weird\\%pattern\\} has +@samp{the%weird\} preceding the operative @samp{%} character, and +@samp{pattern\\} following it. The final two backslashes are left alone +because they cannot affect any @samp{%} character.@refill + +Here is an example, which compiles each of @file{foo.o} and @file{bar.o} +from the corresponding @file{.c} file: + +@example +@group +objects = foo.o bar.o + +all: $(objects) + +$(objects): %.o: %.c + $(CC) -c $(CFLAGS) $< -o $@@ +@end group +@end example + +@noindent +Here @samp{$<} is the automatic variable that holds the name of the +prerequisite and @samp{$@@} is the automatic variable that holds the name +of the target; see @ref{Automatic Variables}. + +Each target specified must match the target pattern; a warning is issued +for each target that does not. If you have a list of files, only some of +which will match the pattern, you can use the @code{filter} function to +remove non-matching file names (@pxref{Text Functions, ,Functions for String Substitution and Analysis}): + +@example +files = foo.elc bar.o lose.o + +$(filter %.o,$(files)): %.o: %.c + $(CC) -c $(CFLAGS) $< -o $@@ +$(filter %.elc,$(files)): %.elc: %.el + emacs -f batch-byte-compile $< +@end example + +@noindent +In this example the result of @samp{$(filter %.o,$(files))} is +@file{bar.o lose.o}, and the first static pattern rule causes each of +these object files to be updated by compiling the corresponding C source +file. The result of @w{@samp{$(filter %.elc,$(files))}} is +@file{foo.elc}, so that file is made from @file{foo.el}.@refill + +Another example shows how to use @code{$*} in static pattern rules: +@vindex $*@r{, and static pattern} + +@example +@group +bigoutput littleoutput : %output : text.g + generate text.g -$* > $@@ +@end group +@end example + +@noindent +When the @code{generate} command is run, @code{$*} will expand to the +stem, either @samp{big} or @samp{little}. + +@node Static versus Implicit, , Static Usage, Static Pattern +@subsection Static Pattern Rules versus Implicit Rules +@cindex rule, static pattern versus implicit +@cindex static pattern rule, versus implicit + +A static pattern rule has much in common with an implicit rule defined as a +pattern rule (@pxref{Pattern Rules, ,Defining and Redefining Pattern Rules}). +Both have a pattern for the target and patterns for constructing the +names of prerequisites. The difference is in how @code{make} decides +@emph{when} the rule applies. + +An implicit rule @emph{can} apply to any target that matches its pattern, +but it @emph{does} apply only when the target has no recipe otherwise +specified, and only when the prerequisites can be found. If more than one +implicit rule appears applicable, only one applies; the choice depends on +the order of rules. + +By contrast, a static pattern rule applies to the precise list of targets +that you specify in the rule. It cannot apply to any other target and it +invariably does apply to each of the targets specified. If two conflicting +rules apply, and both have recipes, that's an error. + +The static pattern rule can be better than an implicit rule for these +reasons: + +@itemize @bullet +@item +You may wish to override the usual implicit rule for a few +files whose names cannot be categorized syntactically but +can be given in an explicit list. + +@item +If you cannot be sure of the precise contents of the directories +you are using, you may not be sure which other irrelevant files +might lead @code{make} to use the wrong implicit rule. The choice +might depend on the order in which the implicit rule search is done. +With static pattern rules, there is no uncertainty: each rule applies +to precisely the targets specified. +@end itemize + +@node Double-Colon, Automatic Prerequisites, Static Pattern, Rules +@section Double-Colon Rules +@cindex double-colon rules +@cindex rule, double-colon (@code{::}) +@cindex multiple rules for one target (@code{::}) +@cindex @code{::} rules (double-colon) + +@dfn{Double-colon} rules are explicit rules written with @samp{::} +instead of @samp{:} after the target names. They are handled +differently from ordinary rules when the same target appears in more +than one rule. Pattern rules with double-colons have an entirely +different meaning (@pxref{Match-Anything Rules}). + +When a target appears in multiple rules, all the rules must be the same +type: all ordinary, or all double-colon. If they are double-colon, each +of them is independent of the others. Each double-colon rule's recipe +is executed if the target is older than any prerequisites of that rule. +If there are no prerequisites for that rule, its recipe is always +executed (even if the target already exists). This can result in +executing none, any, or all of the double-colon rules. + +Double-colon rules with the same target are in fact completely separate +from one another. Each double-colon rule is processed individually, just +as rules with different targets are processed. + +The double-colon rules for a target are executed in the order they appear +in the makefile. However, the cases where double-colon rules really make +sense are those where the order of executing the recipes would not matter. + +Double-colon rules are somewhat obscure and not often very useful; they +provide a mechanism for cases in which the method used to update a target +differs depending on which prerequisite files caused the update, and such +cases are rare. + +Each double-colon rule should specify a recipe; if it does not, an +implicit rule will be used if one applies. +@xref{Implicit Rules, ,Using Implicit Rules}. + +@node Automatic Prerequisites, , Double-Colon, Rules +@section Generating Prerequisites Automatically +@cindex prerequisites, automatic generation +@cindex automatic generation of prerequisites +@cindex generating prerequisites automatically + +In the makefile for a program, many of the rules you need to write often +say only that some object file depends on some header +file. For example, if @file{main.c} uses @file{defs.h} via an +@code{#include}, you would write: + +@example +main.o: defs.h +@end example + +@noindent +You need this rule so that @code{make} knows that it must remake +@file{main.o} whenever @file{defs.h} changes. You can see that for a +large program you would have to write dozens of such rules in your +makefile. And, you must always be very careful to update the makefile +every time you add or remove an @code{#include}. +@cindex @code{#include} + +@cindex @code{-M} (to compiler) +To avoid this hassle, most modern C compilers can write these rules for +you, by looking at the @code{#include} lines in the source files. +Usually this is done with the @samp{-M} option to the compiler. +For example, the command: + +@example +cc -M main.c +@end example + +@noindent +generates the output: + +@example +main.o : main.c defs.h +@end example + +@noindent +Thus you no longer have to write all those rules yourself. +The compiler will do it for you. + +Note that such a rule constitutes mentioning @file{main.o} in a +makefile, so it can never be considered an intermediate file by +implicit rule search. This means that @code{make} won't ever remove +the file after using it; @pxref{Chained Rules, ,Chains of Implicit +Rules}. + +@cindex @code{make depend} +With old @code{make} programs, it was traditional practice to use this +compiler feature to generate prerequisites on demand with a command like +@samp{make depend}. That command would create a file @file{depend} +containing all the automatically-generated prerequisites; then the +makefile could use @code{include} to read them in (@pxref{Include}). + +In GNU @code{make}, the feature of remaking makefiles makes this +practice obsolete---you need never tell @code{make} explicitly to +regenerate the prerequisites, because it always regenerates any makefile +that is out of date. @xref{Remaking Makefiles}. + +The practice we recommend for automatic prerequisite generation is to have +one makefile corresponding to each source file. For each source file +@file{@var{name}.c} there is a makefile @file{@var{name}.d} which lists +what files the object file @file{@var{name}.o} depends on. That way +only the source files that have changed need to be rescanned to produce +the new prerequisites. + +Here is the pattern rule to generate a file of prerequisites (i.e., a makefile) +called @file{@var{name}.d} from a C source file called @file{@var{name}.c}: + +@smallexample +@group +%.d: %.c + @@set -e; rm -f $@@; \ + $(CC) -M $(CPPFLAGS) $< > $@@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@@ : ,g' < $@@.$$$$ > $@@; \ + rm -f $@@.$$$$ +@end group +@end smallexample + +@noindent +@xref{Pattern Rules}, for information on defining pattern rules. The +@samp{-e} flag to the shell causes it to exit immediately if the +@code{$(CC)} command (or any other command) fails (exits with a +nonzero status). +@cindex @code{-e} (shell flag) + +@cindex @code{-MM} (to GNU compiler) +With the GNU C compiler, you may wish to use the @samp{-MM} flag instead +of @samp{-M}. This omits prerequisites on system header files. +@xref{Preprocessor Options, , Options Controlling the Preprocessor, +gcc, Using GNU CC}, for details. + +@cindex @code{sed} (shell command) +The purpose of the @code{sed} command is to translate (for example): + +@example +main.o : main.c defs.h +@end example + +@noindent +into: + +@example +main.o main.d : main.c defs.h +@end example + +@noindent +@cindex @code{.d} +This makes each @samp{.d} file depend on all the source and header files +that the corresponding @samp{.o} file depends on. @code{make} then +knows it must regenerate the prerequisites whenever any of the source or +header files changes. + +Once you've defined the rule to remake the @samp{.d} files, +you then use the @code{include} directive to read them all in. +@xref{Include}. For example: + +@example +@group +sources = foo.c bar.c + +include $(sources:.c=.d) +@end group +@end example + +@noindent +(This example uses a substitution variable reference to translate the +list of source files @samp{foo.c bar.c} into a list of prerequisite +makefiles, @samp{foo.d bar.d}. @xref{Substitution Refs}, for full +information on substitution references.) Since the @samp{.d} files are +makefiles like any others, @code{make} will remake them as necessary +with no further work from you. @xref{Remaking Makefiles}. + +Note that the @samp{.d} files contain target definitions; you should +be sure to place the @code{include} directive @emph{after} the first, +default goal in your makefiles or run the risk of having a random +object file become the default goal. +@xref{How Make Works}. + +@node Recipes, Using Variables, Rules, Top +@chapter Writing Recipes in Rules +@cindex recipes +@cindex recipes, how to write +@cindex writing recipes + +The recipe of a rule consists of one or more shell command lines to +be executed, one at a time, in the order they appear. Typically, the +result of executing these commands is that the target of the rule is +brought up to date. + +Users use many different shell programs, but recipes in makefiles are +always interpreted by @file{/bin/sh} unless the makefile specifies +otherwise. @xref{Execution, ,Recipe Execution}. + +@menu +* Recipe Syntax:: Recipe syntax features and pitfalls. +* Echoing:: How to control when recipes are echoed. +* Execution:: How recipes are executed. +* Parallel:: How recipes can be executed in parallel. +* Errors:: What happens after a recipe execution error. +* Interrupts:: What happens when a recipe is interrupted. +* Recursion:: Invoking @code{make} from makefiles. +* Canned Recipes:: Defining canned recipes. +* Empty Recipes:: Defining useful, do-nothing recipes. +@end menu + +@node Recipe Syntax, Echoing, Recipes, Recipes +@section Recipe Syntax +@cindex recipe syntax +@cindex syntax of recipe + +Makefiles have the unusual property that there are really two distinct +syntaxes in one file. Most of the makefile uses @code{make} syntax +(@pxref{Makefiles, ,Writing Makefiles}). However, recipes are meant +to be interpreted by the shell and so they are written using shell +syntax. The @code{make} program does not try to understand shell +syntax: it performs only a very few specific translations on the +content of the recipe before handing it to the shell. + +Each line in the recipe must start with a tab (or the first character +in the value of the @code{.RECIPEPREFIX} variable; @pxref{Special +Variables}), except that the first recipe line may be attached to the +target-and-prerequisites line with a semicolon in between. @emph{Any} +line in the makefile that begins with a tab and appears in a ``rule +context'' (that is, after a rule has been started until another rule +or variable definition) will be considered part of a recipe for that +rule. Blank lines and lines of just comments may appear among the +recipe lines; they are ignored. + +Some consequences of these rules include: + +@itemize @bullet +@item +A blank line that begins with a tab is not blank: it's an empty +recipe (@pxref{Empty Recipes}). + +@cindex comments, in recipes +@cindex recipes, comments in +@cindex @code{#} (comments), in recipes +@item +A comment in a recipe is not a @code{make} comment; it will be +passed to the shell as-is. Whether the shell treats it as a comment +or not depends on your shell. + +@item +A variable definition in a ``rule context'' which is indented by a tab +as the first character on the line, will be considered part of a +recipe, not a @code{make} variable definition, and passed to the +shell. + +@item +A conditional expression (@code{ifdef}, @code{ifeq}, +etc. @pxref{Conditional Syntax, ,Syntax of Conditionals}) in a ``rule +context'' which is indented by a tab as the first character on the +line, will be considered part of a recipe and be passed to the shell. + +@end itemize + +@menu +* Splitting Recipe Lines:: Breaking long recipe lines for readability. +* Variables in Recipes:: Using @code{make} variables in recipes. +@end menu + +@node Splitting Recipe Lines, Variables in Recipes, Recipe Syntax, Recipe Syntax +@subsection Splitting Recipe Lines +@cindex recipes, splitting +@cindex splitting recipes +@cindex recipes, backslash (@code{\}) in +@cindex recipes, quoting newlines in +@cindex backslash (@code{\}), in recipes +@cindex @code{\} (backslash), in recipes +@cindex quoting newline, in recipes +@cindex newline, quoting, in recipes + +One of the few ways in which @code{make} does interpret recipes is +checking for a backslash just before the newline. As in normal +makefile syntax, a single logical recipe line can be split into +multiple physical lines in the makefile by placing a backslash before +each newline. A sequence of lines like this is considered a single +recipe line, and one instance of the shell will be invoked to run it. + +However, in contrast to how they are treated in other places in a +makefile (@pxref{Splitting Lines, , Splitting Long Lines}), +backslash/newline pairs are @emph{not} removed from the recipe. Both +the backslash and the newline characters are preserved and passed to +the shell. How the backslash/newline is interpreted depends on your +shell. If the first character of the next line after the +backslash/newline is the recipe prefix character (a tab by default; +@pxref{Special Variables}), then that character (and only that +character) is removed. Whitespace is never added to the recipe. + +For example, the recipe for the all target in this makefile: + +@example +@group +all : + @@echo no\ +space + @@echo no\ + space + @@echo one \ + space + @@echo one\ + space +@end group +@end example + +@noindent +consists of four separate shell commands where the output is: + +@example +@group +nospace +nospace +one space +one space +@end group +@end example + +As a more complex example, this makefile: + +@example +@group +all : ; @@echo 'hello \ + world' ; echo "hello \ + world" +@end group +@end example + +@noindent +will invoke one shell with a command of: + +@example +@group +echo 'hello \ +world' ; echo "hello \ + world" +@end group +@end example + +@noindent +which, according to shell quoting rules, will yield the following output: + +@example +@group +hello \ +world +hello world +@end group +@end example + +@noindent +Notice how the backslash/newline pair was removed inside the string +quoted with double quotes (@code{"@dots{}"}), but not from the string +quoted with single quotes (@code{'@dots{}'}). This is the way the +default shell (@file{/bin/sh}) handles backslash/newline pairs. If +you specify a different shell in your makefiles it may treat them +differently. + +Sometimes you want to split a long line inside of single quotes, but +you don't want the backslash/newline to appear in the quoted content. +This is often the case when passing scripts to languages such as Perl, +where extraneous backslashes inside the script can change its meaning +or even be a syntax error. One simple way of handling this is to +place the quoted string, or even the entire command, into a +@code{make} variable then use the variable in the recipe. In this +situation the newline quoting rules for makefiles will be used, and +the backslash/newline will be removed. If we rewrite our example +above using this method: + +@example +@group +HELLO = 'hello \ +world' + +all : ; @@echo $(HELLO) +@end group +@end example + +@noindent +we will get output like this: + +@example +@group +hello world +@end group +@end example + +If you like, you can also use target-specific variables +(@pxref{Target-specific, ,Target-specific Variable Values}) to obtain +a tighter correspondence between the variable and the recipe that +uses it. + +@node Variables in Recipes, , Splitting Recipe Lines, Recipe Syntax +@subsection Using Variables in Recipes +@cindex variable references in recipes +@cindex recipes, using variables in + +The other way in which @code{make} processes recipes is by expanding +any variable references in them (@pxref{Reference,Basics of Variable +References}). This occurs after make has finished reading all the +makefiles and the target is determined to be out of date; so, the +recipes for targets which are not rebuilt are never expanded. + +Variable and function references in recipes have identical syntax and +semantics to references elsewhere in the makefile. They also have the +same quoting rules: if you want a dollar sign to appear in your +recipe, you must double it (@samp{$$}). For shells like the default +shell, that use dollar signs to introduce variables, it's important to +keep clear in your mind whether the variable you want to reference is +a @code{make} variable (use a single dollar sign) or a shell variable +(use two dollar signs). For example: + +@example +@group +LIST = one two three +all: + for i in $(LIST); do \ + echo $$i; \ + done +@end group +@end example + +@noindent +results in the following command being passed to the shell: + +@example +@group +for i in one two three; do \ + echo $i; \ +done +@end group +@end example + +@noindent +which generates the expected result: + +@example +@group +one +two +three +@end group +@end example + +@node Echoing, Execution, Recipe Syntax, Recipes +@section Recipe Echoing +@cindex echoing of recipes +@cindex silent operation +@cindex @code{@@} (in recipes) +@cindex recipes, echoing +@cindex printing of recipes + +Normally @code{make} prints each line of the recipe before it is +executed. We call this @dfn{echoing} because it gives the appearance +that you are typing the lines yourself. + +When a line starts with @samp{@@}, the echoing of that line is suppressed. +The @samp{@@} is discarded before the line is passed to the shell. +Typically you would use this for a command whose only effect is to print +something, such as an @code{echo} command to indicate progress through +the makefile: + +@example +@@echo About to make distribution files +@end example + +@cindex @code{-n} +@cindex @code{--just-print} +@cindex @code{--dry-run} +@cindex @code{--recon} +When @code{make} is given the flag @samp{-n} or @samp{--just-print} it +only echoes most recipes, without executing them. @xref{Options +Summary, ,Summary of Options}. In this case even the recipe lines +starting with @samp{@@} are printed. This flag is useful for finding +out which recipes @code{make} thinks are necessary without actually +doing them. + +@cindex @code{-s} +@cindex @code{--silent} +@cindex @code{--quiet} +@findex .SILENT +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}).@refill + +@node Execution, Parallel, Echoing, Recipes +@section Recipe Execution +@cindex recipe, execution +@cindex execution, of recipes +@vindex @code{SHELL} @r{(recipe execution)} + +When it is time to execute recipes to update a target, they are +executed by invoking a new sub-shell for each line of the recipe, +unless the @code{.ONESHELL} special target is in effect +(@pxref{One Shell, ,Using One Shell}) (In practice, @code{make} may +take shortcuts that do not affect the results.) + +@cindex @code{cd} (shell command) +@cindex shell variables, setting in recipes +@cindex recipes setting shell variables +@strong{Please note:} this implies that setting shell variables and +invoking shell commands such as @code{cd} that set a context local to +each process will not affect the following lines in the recipe.@footnote{On +MS-DOS, the value of current working directory is @strong{global}, so +changing it @emph{will} affect the following recipe lines on those +systems.} If you want to use @code{cd} to affect the next statement, +put both statements in a single recipe line. Then @code{make} will +invoke one shell to run the entire line, and the shell will execute +the statements in sequence. For example: + +@example +foo : bar/lose + cd $( ../$@@ +@end example + +@noindent +Here we use the shell AND operator (@code{&&}) so that if the +@code{cd} command fails, the script will fail without trying to invoke +the @code{gobble} command in the wrong directory, which could cause +problems (in this case it would certainly cause @file{../foo} to be +truncated, at least). + +@menu +* One Shell:: One shell for all lines in a recipe. +* Choosing the Shell:: How @code{make} chooses the shell used + to run recipes. +@end menu + +@node One Shell, Choosing the Shell, Execution, Execution +@subsection Using One Shell +@cindex recipe lines, single shell +@cindex @code{.ONESHELL}, use of +@findex .ONESHELL + +Sometimes you would prefer that all the lines in the recipe be passed +to a single invocation of the shell. There are generally two +situations where this is useful: first, it can improve performance in +makefiles where recipes consist of many command lines, by avoiding +extra processes. Second, you might want newlines to be included in +your recipe command (for example perhaps you are using a very +different interpreter as your @code{SHELL}). If the @code{.ONESHELL} +special target appears anywhere in the makefile then @emph{all} +recipe lines for each target will be provided to a single invocation +of the shell. Newlines between recipe lines will be preserved. For +example: + +@example +.ONESHELL: +foo : bar/lose + cd $(@@D) + gobble $(@@F) > ../$@@ +@end example + +@noindent +would now work as expected even though the commands are on different +recipe lines. + +If @code{.ONESHELL} is provided, then only the first line of the +recipe will be checked for the special prefix characters (@samp{@@}, +@samp{-}, and @samp{+}). Subsequent lines will include the special +characters in the recipe line when the @code{SHELL} is invoked. If +you want your recipe to start with one of these special characters +you'll need to arrange for them to not be the first characters on the +first line, perhaps by adding a comment or similar. For example, this +would be a syntax error in Perl because the first @samp{@@} is removed +by make: + +@example +.ONESHELL: +SHELL = /usr/bin/perl +.SHELLFLAGS = -e +show : + @@f = qw(a b c); + print "@@f\n"; +@end example + +@noindent +However, either of these alternatives would work properly: + +@example +.ONESHELL: +SHELL = /usr/bin/perl +.SHELLFLAGS = -e +show : + # Make sure "@@" is not the first character on the first line + @@f = qw(a b c); + print "@@f\n"; +@end example + +@noindent +or + +@example +.ONESHELL: +SHELL = /usr/bin/perl +.SHELLFLAGS = -e +show : + my @@f = qw(a b c); + print "@@f\n"; +@end example + +As a special feature, if @code{SHELL} is determined to be a +POSIX-style shell, the special prefix characters in ``internal'' +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 +loss in functionality. For example, this works as expected: + +@example +.ONESHELL: +foo : bar/lose + @@cd $(@@D) + @@gobble $(@@F) > ../$@@ +@end example + +Even with this special feature, however, makefiles with +@code{.ONESHELL} will behave differently in ways that could be +noticeable. For example, normally if any line in the recipe fails, +that causes the rule to fail and no more recipe lines are processed. +Under @code{.ONESHELL} a failure of any but the final recipe line will +not be noticed by @code{make}. You can modify @code{.SHELLFLAGS} to +add the @code{-e} option to the shell which will cause any failure +anywhere in the command line to cause the shell to fail, but this +could itself cause your recipe to behave differently. Ultimately you +may need to harden your recipe lines to allow them to work with +@code{.ONESHELL}. + +@node Choosing the Shell, , One Shell, Execution +@subsection Choosing the Shell +@cindex shell, choosing the +@cindex @code{SHELL}, value of +@cindex @code{.SHELLFLAGS}, value of + +@vindex SHELL +@vindex .SHELLFLAGS +The program used as the shell is taken from the variable @code{SHELL}. +If this variable is not set in your makefile, the program +@file{/bin/sh} is used as the shell. The argument(s) passed to the +shell are taken from the variable @code{.SHELLFLAGS}. The default +value of @code{.SHELLFLAGS} is @code{-c} normally, or @code{-ec} in +POSIX-conforming mode. + +@cindex environment, @code{SHELL} in +Unlike most variables, the variable @code{SHELL} is never set from the +environment. This is because the @code{SHELL} environment variable is +used to specify your personal choice of shell program for interactive +use. It would be very bad for personal choices like this to affect the +functioning of makefiles. @xref{Environment, ,Variables from the +Environment}. + +Furthermore, when you do set @code{SHELL} in your makefile that value +is @emph{not} exported in the environment to recipe lines that +@code{make} invokes. Instead, the value inherited from the user's +environment, if any, is exported. You can override this behavior by +explicitly exporting @code{SHELL} (@pxref{Variables/Recursion, +,Communicating Variables to a Sub-@code{make}}), forcing it to be +passed in the environment to recipe lines. + +@vindex @code{MAKESHELL} @r{(MS-DOS alternative to @code{SHELL})} +However, on MS-DOS and MS-Windows the value of @code{SHELL} in the +environment @strong{is} used, since on those systems most users do not +set this variable, and therefore it is most likely set specifically to +be used by @code{make}. On MS-DOS, if the setting of @code{SHELL} is +not suitable for @code{make}, you can set the variable +@code{MAKESHELL} to the shell that @code{make} should use; if set it +will be used as the shell instead of the value of @code{SHELL}. + +@subsubheading Choosing a Shell in DOS and Windows +@cindex shell, in DOS and Windows +@cindex DOS, choosing a shell in +@cindex Windows, choosing a shell in + +Choosing a shell in MS-DOS and MS-Windows is much more complex than on +other systems. + +@vindex COMSPEC +On MS-DOS, if @code{SHELL} is not set, the value of the variable +@code{COMSPEC} (which is always set) is used instead. + +@cindex @code{SHELL}, MS-DOS specifics +The processing of lines that set the variable @code{SHELL} in Makefiles +is different on MS-DOS. The stock shell, @file{command.com}, is +ridiculously limited in its functionality and many users of @code{make} +tend to install a replacement shell. Therefore, on MS-DOS, @code{make} +examines the value of @code{SHELL}, and changes its behavior based on +whether it points to a Unix-style or DOS-style shell. This allows +reasonable functionality even if @code{SHELL} points to +@file{command.com}. + +If @code{SHELL} points to a Unix-style shell, @code{make} on MS-DOS +additionally checks whether that shell can indeed be found; if not, it +ignores the line that sets @code{SHELL}. In MS-DOS, GNU @code{make} +searches for the shell in the following places: + +@enumerate +@item +In the precise place pointed to by the value of @code{SHELL}. For +example, if the makefile specifies @samp{SHELL = /bin/sh}, @code{make} +will look in the directory @file{/bin} on the current drive. + +@item +In the current directory. + +@item +In each of the directories in the @code{PATH} variable, in order. + +@end enumerate + +In every directory it examines, @code{make} will first look for the +specific file (@file{sh} in the example above). If this is not found, +it will also look in that directory for that file with one of the known +extensions which identify executable files. For example @file{.exe}, +@file{.com}, @file{.bat}, @file{.btm}, @file{.sh}, and some others. + +If any of these attempts is successful, the value of @code{SHELL} will +be set to the full pathname of the shell as found. However, if none of +these is found, the value of @code{SHELL} will not be changed, and thus +the line that sets it will be effectively ignored. This is so +@code{make} will only support features specific to a Unix-style shell if +such a shell is actually installed on the system where @code{make} runs. + +Note that this extended search for the shell is limited to the cases +where @code{SHELL} is set from the Makefile; if it is set in the +environment or command line, you are expected to set it to the full +pathname of the shell, exactly as things are on Unix. + +The effect of the above DOS-specific processing is that a Makefile that +contains @samp{SHELL = /bin/sh} (as many Unix makefiles do), will work +on MS-DOS unaltered if you have e.g.@: @file{sh.exe} installed in some +directory along your @code{PATH}. + +@vindex SHELL +@vindex .SHELLFLAGS + +@node Parallel, Errors, Execution, Recipes +@section Parallel Execution +@cindex recipes, execution in parallel +@cindex parallel execution +@cindex execution, in parallel +@cindex job slots +@cindex @code{-j} +@cindex @code{--jobs} + +GNU @code{make} knows how to execute several recipes at once. +Normally, @code{make} will execute only one recipe at a time, waiting +for it to finish before executing the next. However, the @samp{-j} or +@samp{--jobs} option tells @code{make} to execute many recipes +simultaneously. You can inhibit parallelism in a particular makefile +with the @code{.NOTPARALLEL} pseudo-target (@pxref{Special +Targets,Special Built-in Target Names}).@refill + +On MS-DOS, the @samp{-j} option has no effect, since that system doesn't +support multi-processing. + +If the @samp{-j} option is followed by an integer, this is the number of +recipes to execute at once; this is called the number of @dfn{job slots}. +If there is nothing looking like an integer after the @samp{-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). + +Handling recursive @code{make} invocations raises issues for parallel +execution. For more information on this, see @ref{Options/Recursion, +,Communicating Options to a Sub-@code{make}}. + +If a recipe fails (is killed by a signal or exits with a nonzero +status), and errors are not ignored for that recipe (@pxref{Errors, +,Errors in Recipes}), the remaining recipe lines to remake the same +target will not be run. If a recipe fails and the @samp{-k} or +@samp{--keep-going} option was not given (@pxref{Options Summary, +,Summary of Options}), @code{make} aborts execution. If make +terminates for any reason (including a signal) with child processes +running, it waits for them to finish before actually exiting.@refill + +@cindex load average +@cindex limiting jobs based on load +@cindex jobs, limiting based on load +@cindex @code{-l} (load average) +@cindex @code{--max-load} +@cindex @code{--load-average} +When the system is heavily loaded, you will probably want to run fewer jobs +than when it is lightly loaded. You can use the @samp{-l} option to tell +@code{make} to limit the number of jobs to run at once, based on the load +average. The @samp{-l} or @samp{--max-load} +option is followed by a floating-point number. For +example, + +@example +-l 2.5 +@end example + +@noindent +will not let @code{make} start more than one job if the load average is +above 2.5. The @samp{-l} option with no following number removes the +load limit, if one was given with a previous @samp{-l} option.@refill + +More precisely, when @code{make} goes to start up a job, and it already has +at least one job running, it checks the current load average; if it is not +lower than the limit given with @samp{-l}, @code{make} waits until the load +average goes below that limit, or until all the other jobs finish. + +By default, there is no load limit. + +@menu +* Parallel Output:: Handling output during parallel execution +* Parallel Input:: Handling input during parallel execution +@end menu + +@node Parallel Output, Parallel Input, Parallel, Parallel +@subsection Output During Parallel Execution +@cindex output during parallel execution +@cindex parallel execution, output during + +When running several recipes in parallel the output from each +recipe appears as soon as it is generated, with the result that +messages from different recipes may be interspersed, sometimes even +appearing on the same line. This can make reading the output very +difficult. + +@cindex @code{--output-sync} +@cindex @code{-O} +To avoid this you can use the @samp{--output-sync} (@samp{-O}) option. +This option instructs @code{make} to save the output from the commands +it invokes and print it all once the commands are completed. +Additionally, if there are multiple recursive @code{make} invocations +running in parallel, they will communicate so that only one of them is +generating output at a time. + +If working directory printing is enabled (@pxref{-w Option, ,The +@samp{--print-directory} Option}), the enter/leave messages are +printed around each output grouping. If you prefer not to see these +messages add the @samp{--no-print-directory} option to @code{MAKEFLAGS}. + +There are four levels of granularity when synchronizing output, +specified by giving an argument to the option (e.g., @samp{-Oline} or +@samp{--output-sync=recurse}). + +@table @code +@item none +This is the default: all output is sent directly as it is generated and +no synchronization is performed. + +@item line +Output from each individual line of the recipe is grouped and printed +as soon as that line is complete. If a recipe consists of multiple +lines, they may be interspersed with lines from other recipes. + +@item target +Output from the entire recipe for each target is grouped and printed +once the target is complete. This is the default if the +@code{--output-sync} or @code{-O} option is given with no argument. + +@item recurse +Output from each recursive invocation of @code{make} is grouped and +printed once the recursive invocation is complete. + +@end table + +Regardless of the mode chosen, the total build time will be the same. +The only difference is in how the output appears. + +The @samp{target} and @samp{recurse} modes both collect the output of +the entire recipe of a target and display it uninterrupted when the +recipe completes. The difference between them is in how recipes that +contain recursive invocations of @code{make} are treated +(@pxref{Recursion, ,Recursive Use of @code{make}}). For all recipes +which have no recursive lines, the @samp{target} and @samp{recurse} +modes behave identically. + +If the @samp{recurse} mode is chosen, recipes that contain recursive +@code{make} invocations are treated the same as other targets: the +output from the recipe, including the output from the recursive +@code{make}, is saved and printed after the entire recipe is complete. +This ensures output from all the targets built by a given recursive +@code{make} instance are grouped together, which may make the output +easier to understand. However it also leads to long periods of time +during the build where no output is seen, followed by large bursts of +output. If you are not watching the build as it proceeds, but instead +viewing a log of the build after the fact, this may be the best option +for you. + +If you are watching the output, the long gaps of quiet during the +build can be frustrating. The @samp{target} output synchronization +mode detects when @code{make} is going to be invoked recursively, +using the standard methods, and it will not synchronize the output of +those lines. The recursive @code{make} will perform the +synchronization for its targets and the output from each will be +displayed immediately when it completes. Be aware that output from +recursive lines of the recipe are not synchronized (for example if +the recursive line prints a message before running @code{make}, that +message will not be synchronized). + +The @samp{line} mode can be useful for front-ends that are watching +the output of @code{make} to track when recipes are started and +completed. + +Some programs invoked by @code{make} may behave differently if they +determine they're writing output to a terminal versus a file (often +described as ``interactive'' vs. ``non-interactive'' modes). For +example, many programs that can display colorized output will not do +so if they determine they are not writing to a terminal. If your +makefile invokes a program like this then using the output +synchronization options will cause the program to believe it's running +in ``non-interactive'' mode even though the output will ultimately go +to the terminal. + +@node Parallel Input, , Parallel Output, Parallel +@subsection Input During Parallel Execution +@cindex input during parallel execution +@cindex parallel execution, input during +@cindex standard input + +Two processes cannot both take input from the same device at the same +time. To make sure that only one recipe tries to take input from the +terminal at once, @code{make} will invalidate the standard input +streams of all but one running recipe. If another recipe attempts to +read from standard input it will usually incur a fatal error (a +@samp{Broken pipe} signal). +@cindex broken pipe + +It is unpredictable which recipe will have a valid standard input stream +(which will come from the terminal, or wherever you redirect the standard +input of @code{make}). The first recipe run will always get it first, and +the first recipe started after that one finishes will get it next, and so +on. + +We will change how this aspect of @code{make} works if we find a better +alternative. In the mean time, you should not rely on any recipe using +standard input at all if you are using the parallel execution feature; but +if you are not using this feature, then standard input works normally in +all recipes. + +@node Errors, Interrupts, Parallel, Recipes +@section Errors in Recipes +@cindex errors (in recipes) +@cindex recipes, errors in +@cindex exit status (errors) + +After each shell invocation returns, @code{make} looks at its exit +status. If the shell completed successfully (the exit status is +zero), the next line in the recipe is executed in a new shell; after +the last line is finished, the rule is finished. + +If there is an error (the exit status is nonzero), @code{make} gives up on +the current rule, and perhaps on all rules. + +Sometimes the failure of a certain recipe line does not indicate a problem. +For example, you may use the @code{mkdir} command to ensure that a +directory exists. If the directory already exists, @code{mkdir} will +report an error, but you probably want @code{make} to continue regardless. + +@cindex @code{-} (in recipes) +To ignore errors in a recipe line, write a @samp{-} at the beginning +of the line's text (after the initial tab). The @samp{-} is discarded +before the line is passed to the shell for execution. + +For example, + +@example +@group +clean: + -rm -f *.o +@end group +@end example +@cindex @code{rm} (shell command) + +@noindent +This causes @code{make} to continue even if @code{rm} is unable to +remove a file. + +@cindex @code{-i} +@cindex @code{--ignore-errors} +@findex .IGNORE +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. 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, +except that it prints out a message that tells you the status code +the shell exited with, and says that the error has been ignored. + +When an error happens that @code{make} has not been told to ignore, +it implies that the current target cannot be correctly remade, and neither +can any other that depends on it either directly or indirectly. No further +recipes will be executed for these targets, since their preconditions +have not been achieved. + + +@cindex @code{-k} +@cindex @code{--keep-going} +Normally @code{make} gives up immediately in this circumstance, returning a +nonzero status. However, if the @samp{-k} or @samp{--keep-going} +flag is specified, @code{make} +continues 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, @samp{make -k} +will continue compiling other object files even though it already knows +that linking them will be impossible. @xref{Options Summary, ,Summary of Options}. + +The usual behavior assumes that your purpose is to get the specified +targets up to date; once @code{make} learns that this is impossible, it +might as well report the failure immediately. The @samp{-k} option says +that the real purpose is to test as many of the changes made in the +program as possible, perhaps to find several independent problems so +that you can correct them all before the next attempt to compile. This +is why Emacs' @code{compile} command passes the @samp{-k} flag by +default. +@cindex Emacs (@code{M-x compile}) + +@findex .DELETE_ON_ERROR +@cindex deletion of target files +@cindex removal of target files +@cindex target, deleting on error +Usually when a recipe line fails, if it has changed the target file at all, +the file is corrupted and cannot be used---or at least it is not +completely updated. Yet the file's time stamp says that it is now up to +date, so the next time @code{make} runs, it will not try to update that +file. The situation is just the same as when the shell is killed by a +signal; @pxref{Interrupts}. So generally the right thing to do is to +delete the target file if the recipe fails after beginning to change +the file. @code{make} will do this if @code{.DELETE_ON_ERROR} appears +as a target. This is almost always what you want @code{make} to do, but +it is not historical practice; so for compatibility, you must explicitly +request it. + +@node Interrupts, Recursion, Errors, Recipes +@section Interrupting or Killing @code{make} +@cindex interrupt +@cindex signal +@cindex deletion of target files +@cindex removal of target files +@cindex target, deleting on interrupt +@cindex killing (interruption) + +If @code{make} gets a fatal signal while a shell is executing, it may +delete the target file that the recipe was supposed to update. This is +done if the target file's last-modification time has changed since +@code{make} first checked it. + +The purpose of deleting the target is to make sure that it is remade from +scratch when @code{make} is next run. Why is this? Suppose you type +@kbd{Ctrl-c} while a compiler is running, and it has begun to write an +object file @file{foo.o}. The @kbd{Ctrl-c} kills the compiler, resulting +in an incomplete file whose last-modification time is newer than the source +file @file{foo.c}. But @code{make} also receives the @kbd{Ctrl-c} signal +and deletes this incomplete file. If @code{make} did not do this, the next +invocation of @code{make} would think that @file{foo.o} did not require +updating---resulting in a strange error message from the linker when it +tries to link an object file half of which is missing. + +@findex .PRECIOUS +You can prevent the deletion of a target file in this way by making the +special target @code{.PRECIOUS} depend on it. Before remaking a target, +@code{make} checks to see whether it appears on the prerequisites of +@code{.PRECIOUS}, and thereby decides whether the target should be deleted +if a signal happens. Some reasons why you might do this are that the +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 +@cindex subdirectories, recursion for + +Recursive use of @code{make} means using @code{make} as a command in a +makefile. This technique is useful when you want separate makefiles for +various subsystems that compose a larger system. For example, suppose you +have a sub-directory @file{subdir} which has its own makefile, and you would +like the containing directory's makefile to run @code{make} on the +sub-directory. You can do it by writing this: + +@example +subsystem: + cd subdir && $(MAKE) +@end example + +@noindent +or, equivalently, this (@pxref{Options Summary, ,Summary of Options}): + +@example +subsystem: + $(MAKE) -C subdir +@end example +@cindex @code{-C} +@cindex @code{--directory} + +You can write recursive @code{make} commands just by copying this example, +but there are many things to know about how they work and why, and about +how the sub-@code{make} relates to the top-level @code{make}. You may +also find it useful to declare targets that invoke recursive +@code{make} commands as @samp{.PHONY} (for more discussion on when +this is useful, see @ref{Phony Targets}). + +@vindex @code{CURDIR} +For your convenience, when GNU @code{make} starts (after it has +processed any @code{-C} options) it sets the variable @code{CURDIR} to +the pathname of the current working directory. This value is never +touched by @code{make} again: in particular note that if you include +files from other directories the value of @code{CURDIR} does not +change. The value has the same precedence it would have if it were +set in the makefile (by default, an environment variable @code{CURDIR} +will not override this value). Note that setting this variable has no +impact on the operation of @code{make} (it does not cause @code{make} +to change its working directory, for example). + +@menu +* MAKE Variable:: The special effects of using @samp{$(MAKE)}. +* Variables/Recursion:: How to communicate variables to a sub-@code{make}. +* Options/Recursion:: How to communicate options to a sub-@code{make}. +* -w Option:: How the @samp{-w} or @samp{--print-directory} option + helps debug use of recursive @code{make} commands. +@end menu + +@node MAKE Variable, Variables/Recursion, Recursion, Recursion +@subsection How the @code{MAKE} Variable Works +@vindex MAKE +@cindex recursion, and @code{MAKE} variable + +Recursive @code{make} commands should always use the variable @code{MAKE}, +not the explicit command name @samp{make}, as shown here: + +@example +@group +subsystem: + cd subdir && $(MAKE) +@end group +@end example + +The value of this variable is the file name with which @code{make} was +invoked. If this file name was @file{/bin/make}, then the recipe executed +is @samp{cd subdir && /bin/make}. If you use a special version of +@code{make} to run the top-level makefile, the same special version will be +executed for recursive invocations. +@cindex @code{cd} (shell command) + +@cindex +, and recipes +As a special feature, using the variable @code{MAKE} in the recipe of +a rule alters the effects of the @samp{-t} (@samp{--touch}), @samp{-n} +(@samp{--just-print}), or @samp{-q} (@w{@samp{--question}}) option. +Using the @code{MAKE} variable has the same effect as using a @samp{+} +character at the beginning of the recipe line. @xref{Instead of +Execution, ,Instead of Executing the Recipes}. This special feature +is only enabled if the @code{MAKE} variable appears directly in the +recipe: it does not apply if the @code{MAKE} variable is referenced +through expansion of another variable. In the latter case you must +use the @samp{+} token to get these special effects.@refill + +Consider the command @samp{make -t} in the above example. (The +@samp{-t} option marks targets as up to date without actually running +any recipes; see @ref{Instead of Execution}.) Following the usual +definition of @samp{-t}, a @samp{make -t} command in the example would +create a file named @file{subsystem} and do nothing else. What you +really want it to do is run @samp{@w{cd subdir &&} @w{make -t}}; but +that would require executing the recipe, and @samp{-t} says not to +execute recipes.@refill +@cindex @code{-t}, and recursion +@cindex recursion, and @code{-t} +@cindex @code{--touch}, and recursion + +The special feature makes this do what you want: whenever a recipe +line of a rule contains the variable @code{MAKE}, the flags @samp{-t}, +@samp{-n} and @samp{-q} do not apply to that line. Recipe lines +containing @code{MAKE} are executed normally despite the presence of a +flag that causes most recipes not to be run. The usual +@code{MAKEFLAGS} mechanism passes the flags to the sub-@code{make} +(@pxref{Options/Recursion, ,Communicating Options to a +Sub-@code{make}}), so your request to touch the files, or print the +recipes, is propagated to the subsystem.@refill + +@node Variables/Recursion, Options/Recursion, MAKE Variable, Recursion +@subsection Communicating Variables to a Sub-@code{make} +@cindex sub-@code{make} +@cindex environment, and recursion +@cindex exporting variables +@cindex variables, environment +@cindex variables, exporting +@cindex recursion, and environment +@cindex recursion, and variables + +Variable values of the top-level @code{make} can be passed to the +sub-@code{make} through the environment by explicit request. These +variables are defined in the sub-@code{make} as defaults, but they do +not override variables defined in the makefile used by +the sub-@code{make} unless you use the @samp{-e} switch (@pxref{Options +Summary, ,Summary of Options}).@refill + +To pass down, or @dfn{export}, a variable, @code{make} adds the +variable and its value to the environment for running each line of the +recipe. The sub-@code{make}, in turn, uses the environment to +initialize its table of variable values. @xref{Environment, +,Variables from the Environment}. + +Except by explicit request, @code{make} exports a variable only if it +is either defined in the environment initially or set on the command +line, and if its name consists only of letters, numbers, and underscores. +Some shells cannot cope with environment variable names consisting of +characters other than letters, numbers, and underscores. + +@cindex SHELL, exported value +The value of the @code{make} variable @code{SHELL} is not exported. +Instead, the value of the @code{SHELL} variable from the invoking +environment is passed to the sub-@code{make}. You can force +@code{make} to export its value for @code{SHELL} by using the +@code{export} directive, described below. @xref{Choosing the Shell}. + +The special variable @code{MAKEFLAGS} is always exported (unless you +unexport it). @code{MAKEFILES} is exported if you set it to anything. + +@code{make} automatically passes down variable values that were defined +on the command line, by putting them in the @code{MAKEFLAGS} variable. +@iftex +See the next section. +@end iftex +@ifnottex +@xref{Options/Recursion}. +@end ifnottex + +Variables are @emph{not} normally passed down if they were created by +default by @code{make} (@pxref{Implicit Variables, ,Variables Used by +Implicit Rules}). The sub-@code{make} will define these for +itself.@refill + +@findex export +If you want to export specific variables to a sub-@code{make}, use the +@code{export} directive, like this: + +@example +export @var{variable} @dots{} +@end example + +@noindent +@findex unexport +If you want to @emph{prevent} a variable from being exported, use the +@code{unexport} directive, like this: + +@example +unexport @var{variable} @dots{} +@end example + +@noindent +In both of these forms, the arguments to @code{export} and +@code{unexport} are expanded, and so could be variables or functions +which expand to a (list of) variable names to be (un)exported. + +As a convenience, you can define a variable and export it at the same +time by doing: + +@example +export @var{variable} = value +@end example + +@noindent +has the same result as: + +@example +@var{variable} = value +export @var{variable} +@end example + +@noindent +and + +@example +export @var{variable} := value +@end example + +@noindent +has the same result as: + +@example +@var{variable} := value +export @var{variable} +@end example + +Likewise, + +@example +export @var{variable} += value +@end example + +@noindent +is just like: + +@example +@var{variable} += value +export @var{variable} +@end example + +@noindent +@xref{Appending, ,Appending More Text to Variables}. + +You may notice that the @code{export} and @code{unexport} directives +work in @code{make} in the same way they work in the shell, @code{sh}. + +If you want all variables to be exported by default, you can use +@code{export} by itself: + +@example +export +@end example + +@noindent +This tells @code{make} that variables which are not explicitly mentioned +in an @code{export} or @code{unexport} directive should be exported. +Any variable given in an @code{unexport} directive will still @emph{not} +be exported. If you use @code{export} by itself to export variables by +default, variables whose names contain characters other than +alphanumerics and underscores will not be exported unless specifically +mentioned in an @code{export} directive.@refill + +@findex .EXPORT_ALL_VARIABLES +The behavior elicited by an @code{export} directive by itself was the +default in older versions of GNU @code{make}. If your makefiles depend +on this behavior and you want to be compatible with old versions of +@code{make}, you can write a rule for the special target +@code{.EXPORT_ALL_VARIABLES} instead of using the @code{export} directive. +This will be ignored by old @code{make}s, while the @code{export} +directive will cause a syntax error.@refill +@cindex compatibility in exporting + +Likewise, you can use @code{unexport} by itself to tell @code{make} +@emph{not} to export variables by default. Since this is the default +behavior, you would only need to do this if @code{export} had been used +by itself earlier (in an included makefile, perhaps). You +@strong{cannot} use @code{export} and @code{unexport} by themselves to +have variables exported for some recipes and not for others. The last +@code{export} or @code{unexport} directive that appears by itself +determines the behavior for the entire run of @code{make}.@refill + +@vindex MAKELEVEL +@cindex recursion, level of +As a special feature, the variable @code{MAKELEVEL} is changed when it +is passed down from level to level. This variable's value is a string +which is the depth of the level as a decimal number. The value is +@samp{0} for the top-level @code{make}; @samp{1} for a sub-@code{make}, +@samp{2} for a sub-sub-@code{make}, and so on. The incrementation +happens when @code{make} sets up the environment for a recipe.@refill + +The main use of @code{MAKELEVEL} is to test it in a conditional +directive (@pxref{Conditionals, ,Conditional Parts of Makefiles}); this +way you can write a makefile that behaves one way if run recursively and +another way if run directly by you.@refill + +@vindex MAKEFILES +You can use the variable @code{MAKEFILES} to cause all sub-@code{make} +commands to use additional makefiles. The value of @code{MAKEFILES} is +a whitespace-separated list of file names. This variable, if defined in +the outer-level makefile, is passed down through the environment; then +it serves as a list of extra makefiles for the sub-@code{make} to read +before the usual or specified ones. @xref{MAKEFILES Variable, ,The +Variable @code{MAKEFILES}}.@refill + +@node Options/Recursion, -w Option, Variables/Recursion, Recursion +@subsection Communicating Options to a Sub-@code{make} +@cindex options, and recursion +@cindex recursion, and options + +@vindex MAKEFLAGS +Flags such as @samp{-s} and @samp{-k} are passed automatically to the +sub-@code{make} through the variable @code{MAKEFLAGS}. This variable is +set up automatically by @code{make} to contain the flag letters that +@code{make} received. Thus, if you do @w{@samp{make -ks}} then +@code{MAKEFLAGS} gets the value @samp{ks}.@refill + +As a consequence, every sub-@code{make} gets a value for @code{MAKEFLAGS} +in its environment. In response, it takes the flags from that value and +processes them as if they had been given as arguments. +@xref{Options Summary, ,Summary of Options}. + +@cindex command line variable definitions, and recursion +@cindex variables, command line, and recursion +@cindex recursion, and command line variable definitions +Likewise variables defined on the command line are passed to the +sub-@code{make} through @code{MAKEFLAGS}. Words in the value of +@code{MAKEFLAGS} that contain @samp{=}, @code{make} treats as variable +definitions just as if they appeared on the command line. +@xref{Overriding, ,Overriding Variables}. + +@cindex @code{-C}, and recursion +@cindex @code{-f}, and recursion +@cindex @code{-o}, and recursion +@cindex @code{-W}, and recursion +@cindex @code{--directory}, and recursion +@cindex @code{--file}, and recursion +@cindex @code{--old-file}, and recursion +@cindex @code{--assume-old}, and recursion +@cindex @code{--assume-new}, and recursion +@cindex @code{--new-file}, and recursion +@cindex recursion, and @code{-C} +@cindex recursion, and @code{-f} +@cindex recursion, and @code{-o} +@cindex recursion, and @code{-W} +The options @samp{-C}, @samp{-f}, @samp{-o}, and @samp{-W} are not put +into @code{MAKEFLAGS}; these options are not passed down.@refill + +@cindex @code{-j}, and recursion +@cindex @code{--jobs}, and recursion +@cindex recursion, and @code{-j} +@cindex job slots, and recursion +The @samp{-j} option is a special case (@pxref{Parallel, ,Parallel Execution}). +If you set it to some numeric value @samp{N} and your operating system +supports it (most any UNIX system will; others typically won't), the +parent @code{make} and all the sub-@code{make}s will communicate to +ensure that there are only @samp{N} jobs running at the same time +between them all. Note that any job that is marked recursive +(@pxref{Instead of Execution, ,Instead of Executing Recipes}) +doesn't count against the total jobs (otherwise we could get @samp{N} +sub-@code{make}s running and have no slots left over for any real work!) + +If your operating system doesn't support the above communication, then +no @samp{-j} is added to @code{MAKEFLAGS}, so that sub-@code{make}s +run in non-parallel mode. If the @w{@samp{-j}} option were passed down +to sub-@code{make}s you would get many more jobs running in parallel +than you asked for. If you give @samp{-j} with no numeric argument, +meaning to run as many jobs as possible in parallel, this is passed +down, since multiple infinities are no more than one.@refill + +If you do not want to pass the other flags down, you must change the +value of @code{MAKEFLAGS}, like this: + +@example +subsystem: + cd subdir && $(MAKE) MAKEFLAGS= +@end example + +@vindex MAKEOVERRIDES +The command line variable definitions really appear in the variable +@code{MAKEOVERRIDES}, and @code{MAKEFLAGS} contains a reference to this +variable. If you do want to pass flags down normally, but don't want to +pass down the command line variable definitions, you can reset +@code{MAKEOVERRIDES} to empty, like this: + +@example +MAKEOVERRIDES = +@end example + +@noindent +@cindex Arg list too long +@cindex E2BIG +This is not usually useful to do. However, some systems have a small +fixed limit on the size of the environment, and putting so much +information into the value of @code{MAKEFLAGS} can exceed it. If you +see the error message @samp{Arg list too long}, this may be the problem. +@findex .POSIX +@cindex POSIX +(For strict compliance with POSIX.2, changing @code{MAKEOVERRIDES} does +not affect @code{MAKEFLAGS} if the special target @samp{.POSIX} appears +in the makefile. You probably do not care about this.) + +@vindex MFLAGS +A similar variable @code{MFLAGS} exists also, for historical +compatibility. It has the same value as @code{MAKEFLAGS} except that it +does not contain the command line variable definitions, and it always +begins with a hyphen unless it is empty (@code{MAKEFLAGS} begins with a +hyphen only when it begins with an option that has no single-letter +version, such as @samp{--warn-undefined-variables}). @code{MFLAGS} was +traditionally used explicitly in the recursive @code{make} command, like +this: + +@example +subsystem: + cd subdir && $(MAKE) $(MFLAGS) +@end example + +@noindent +but now @code{MAKEFLAGS} makes this usage redundant. If you want your +makefiles to be compatible with old @code{make} programs, use this +technique; it will work fine with more modern @code{make} versions too. + +@cindex setting options from environment +@cindex options, setting from environment +@cindex setting options in makefiles +@cindex options, setting in makefiles +The @code{MAKEFLAGS} variable can also be useful if you want to have +certain options, such as @samp{-k} (@pxref{Options Summary, ,Summary of +Options}), set each time you run @code{make}. You simply put a value for +@code{MAKEFLAGS} in your environment. You can also set @code{MAKEFLAGS} in +a makefile, to specify additional flags that should also be in effect for +that makefile. (Note that you cannot use @code{MFLAGS} this way. That +variable is set only for compatibility; @code{make} does not interpret a +value you set for it in any way.) + +When @code{make} interprets the value of @code{MAKEFLAGS} (either from the +environment or from a makefile), it first prepends a hyphen if the value +does not already begin with one. Then it chops the value into words +separated by blanks, and parses these words as if they were options given +on the command line (except that @samp{-C}, @samp{-f}, @samp{-h}, +@samp{-o}, @samp{-W}, and their long-named versions are ignored; and there +is no error for an invalid option). + +If you do put @code{MAKEFLAGS} in your environment, you should be sure not +to include any options that will drastically affect the actions of +@code{make} and undermine the purpose of makefiles and of @code{make} +itself. For instance, the @samp{-t}, @samp{-n}, and @samp{-q} options, if +put in one of these variables, could have disastrous consequences and would +certainly have at least surprising and probably annoying effects.@refill + +If you'd like to run other implementations of @code{make} in addition +to GNU @code{make}, and hence do not want to add GNU +@code{make}-specific flags to the @code{MAKEFLAGS} variable, you can +add them to the @code{GNUMAKEFLAGS} variable instead. This variable +is parsed just before @code{MAKEFLAGS}, in the same way as +@code{MAKEFLAGS}. When @code{make} constructs @code{MAKEFLAGS} to +pass to a recursive @code{make} it will include all flags, even those +taken from @code{GNUMAKEFLAGS}. As a result, after parsing +@code{GNUMAKEFLAGS} GNU @code{make} sets this variable to the empty +string to avoid duplicating flags during recursion. + +It's best to use @code{GNUMAKEFLAGS} only with flags which won't +materially change the behavior of your makefiles. If your makefiles +require GNU make anyway then simply use @code{MAKEFLAGS}. Flags such +as @samp{--no-print-directory} or @samp{--output-sync} may be +appropriate for @code{GNUMAKEFLAGS}. + +@node -w Option, , Options/Recursion, Recursion +@subsection The @samp{--print-directory} Option +@cindex directories, printing them +@cindex printing directories +@cindex recursion, and printing directories + +If you use several levels of recursive @code{make} invocations, the +@samp{-w} or @w{@samp{--print-directory}} option can make the output a +lot easier to understand by showing each directory as @code{make} +starts processing it and as @code{make} finishes processing it. For +example, if @samp{make -w} is run in the directory @file{/u/gnu/make}, +@code{make} will print a line of the form:@refill + +@example +make: Entering directory `/u/gnu/make'. +@end example + +@noindent +before doing anything else, and a line of the form: + +@example +make: Leaving directory `/u/gnu/make'. +@end example + +@noindent +when processing is completed. + +@cindex @code{-C}, and @code{-w} +@cindex @code{--directory}, and @code{--print-directory} +@cindex recursion, and @code{-w} +@cindex @code{-w}, and @code{-C} +@cindex @code{-w}, and recursion +@cindex @code{--print-directory}, and @code{--directory} +@cindex @code{--print-directory}, and recursion +@cindex @code{--no-print-directory} +@cindex @code{--print-directory}, disabling +@cindex @code{-w}, disabling +Normally, you do not need to specify this option because @samp{make} +does it for you: @samp{-w} is turned on automatically when you use the +@samp{-C} option, and in sub-@code{make}s. @code{make} will not +automatically turn on @samp{-w} if you also use @samp{-s}, which says to +be silent, or if you use @samp{--no-print-directory} to explicitly +disable it. + +@node Canned Recipes, Empty Recipes, Recursion, Recipes +@section Defining Canned Recipes +@cindex canned recipes +@cindex recipes, canned +@cindex sequences of commands +@cindex commands, sequences of + +When the same sequence of commands is useful in making various +targets, you can define it as a canned sequence with the @code{define} +directive, and refer to the canned sequence from the recipes for those +targets. The canned sequence is actually a variable, so the name must +not conflict with other variable names. + +Here is an example of defining a canned recipe: + +@example +define run-yacc = +yacc $(firstword $^) +mv y.tab.c $@@ +endef +@end example +@cindex @code{yacc} + +@noindent +Here @code{run-yacc} is the name of the variable being defined; +@code{endef} marks the end of the definition; the lines in between are the +commands. The @code{define} directive does not expand variable references +and function calls in the canned sequence; the @samp{$} characters, +parentheses, variable names, and so on, all become part of the value of the +variable you are defining. +@xref{Multi-Line, ,Defining Multi-Line Variables}, +for a complete explanation of @code{define}. + +The first command in this example runs Yacc on the first prerequisite of +whichever rule uses the canned sequence. The output file from Yacc is +always named @file{y.tab.c}. The second command moves the output to the +rule's target file name. + +To use the canned sequence, substitute the variable into the recipe of a +rule. You can substitute it like any other variable +(@pxref{Reference, ,Basics of Variable References}). +Because variables defined by @code{define} are recursively expanded +variables, all the variable references you wrote inside the @code{define} +are expanded now. For example: + +@example +foo.c : foo.y + $(run-yacc) +@end example + +@noindent +@samp{foo.y} will be substituted for the variable @samp{$^} when it occurs in +@code{run-yacc}'s value, and @samp{foo.c} for @samp{$@@}.@refill + +This is a realistic example, but this particular one is not needed in +practice because @code{make} has an implicit rule to figure out these +commands based on the file names involved +(@pxref{Implicit Rules, ,Using Implicit Rules}). + +@cindex @@, and @code{define} +@cindex -, and @code{define} +@cindex +, and @code{define} +In recipe execution, each line of a canned sequence is treated just as +if the line appeared on its own in the rule, preceded by a tab. In +particular, @code{make} invokes a separate sub-shell for each line. You +can use the special prefix characters that affect command lines +(@samp{@@}, @samp{-}, and @samp{+}) on each line of a canned sequence. +@xref{Recipes, ,Writing Recipes in Rules}. +For example, using this canned sequence: + +@example +define frobnicate = +@@echo "frobnicating target $@@" +frob-step-1 $< -o $@@-step-1 +frob-step-2 $@@-step-1 -o $@@ +endef +@end example + +@noindent +@code{make} will not echo the first line, the @code{echo} command. +But it @emph{will} echo the following two recipe lines. + +On the other hand, prefix characters on the recipe line that refers to +a canned sequence apply to every line in the sequence. So the rule: + +@example +frob.out: frob.in + @@$(frobnicate) +@end example + +@noindent +does not echo @emph{any} recipe lines. +(@xref{Echoing, ,Recipe Echoing}, for a full explanation of @samp{@@}.) + +@node Empty Recipes, , Canned Recipes, Recipes +@section Using Empty Recipes +@cindex empty recipes +@cindex recipes, empty + +It is sometimes useful to define recipes which do nothing. This is done +simply by giving a recipe that consists of nothing but whitespace. For +example: + +@example +target: ; +@end example + +@noindent +defines an empty recipe for @file{target}. You could also use a line +beginning with a recipe prefix character to define an empty recipe, +but this would be confusing because such a line looks empty. + +@findex .DEFAULT@r{, and empty recipes} +You may be wondering why you would want to define a recipe that does +nothing. One reason this is useful is to prevent a target from +getting implicit recipes (from implicit rules or the @code{.DEFAULT} +special target; @pxref{Implicit Rules} and @pxref{Last Resort, +,Defining Last-Resort Default Rules}).@refill + +Empty recipes can also be used to avoid errors for targets that will +be created as a side-effect of another recipe: if the target does not +exist the empty recipe ensures that @code{make} won't complain that it +doesn't know how to build the target, and @code{make} will assume the +target is out of date. + +You may be inclined to define empty recipes for targets that are not +actual files, but only exist so that their prerequisites can be +remade. However, this is not the best way to do that, because the +prerequisites may not be remade properly if the target file actually +does exist. @xref{Phony Targets, ,Phony Targets}, for a better way to +do this. + +@node Using Variables, Conditionals, Recipes, Top +@chapter How to Use Variables +@cindex variable +@cindex value +@cindex recursive variable expansion +@cindex simple variable expansion + +A @dfn{variable} is a name defined in a makefile to represent a string +of text, called the variable's @dfn{value}. These values are +substituted by explicit request into targets, prerequisites, recipes, +and other parts of the makefile. (In some other versions of @code{make}, +variables are called @dfn{macros}.) +@cindex macro + +Variables and functions in all parts of a makefile are expanded when +read, except for in recipes, the right-hand sides of variable +definitions using @samp{=}, and the bodies of variable definitions +using the @code{define} directive.@refill + +Variables can represent lists of file names, options to pass to compilers, +programs to run, directories to look in for source files, directories to +write output in, or anything else you can imagine. + +A variable name may be any sequence of characters not containing +@samp{:}, @samp{#}, @samp{=}, or whitespace. However, variable names +containing characters other than letters, numbers, and underscores +should be considered carefully, as in some shells they cannot be +passed through the environment to a sub-@code{make} +(@pxref{Variables/Recursion, ,Communicating Variables to a +Sub-@code{make}}). Variable names beginning with @samp{.} and an +uppercase letter may be given special meaning in future versions of +@code{make}. + +Variable names are case-sensitive. The names @samp{foo}, @samp{FOO}, +and @samp{Foo} all refer to different variables. + +It is traditional to use upper case letters in variable names, but we +recommend using lower case letters for variable names that serve internal +purposes in the makefile, and reserving upper case for parameters that +control implicit rules or for parameters that the user should override with +command options (@pxref{Overriding, ,Overriding Variables}). + +A few variables have names that are a single punctuation character or +just a few characters. These are the @dfn{automatic variables}, and +they have particular specialized uses. @xref{Automatic Variables}. + +@menu +* Reference:: How to use the value of a variable. +* Flavors:: Variables come in two flavors. +* Advanced:: Advanced features for referencing a variable. +* Values:: All the ways variables get their values. +* Setting:: How to set a variable in the makefile. +* Appending:: How to append more text to the old value + of a variable. +* Override Directive:: How to set a variable in the makefile even if + the user has set it with a command argument. +* Multi-Line:: An alternate way to set a variable + to a multi-line string. +* Undefine Directive:: How to undefine a variable so that it appears + as if it was never set. +* Environment:: Variable values can come from the environment. +* Target-specific:: Variable values can be defined on a per-target + basis. +* Pattern-specific:: Target-specific variable values can be applied + to a group of targets that match a pattern. +* Suppressing Inheritance:: Suppress inheritance of variables. +* Special Variables:: Variables with special meaning or behavior. +@end menu + +@node Reference, Flavors, Using Variables, Using Variables +@section Basics of Variable References +@cindex variables, how to reference +@cindex reference to variables +@cindex @code{$}, in variable reference +@cindex dollar sign (@code{$}), in variable reference + +To substitute a variable's value, write a dollar sign followed by the name +of the variable in parentheses or braces: either @samp{$(foo)} or +@samp{$@{foo@}} is a valid reference to the variable @code{foo}. This +special significance of @samp{$} is why you must write @samp{$$} to have +the effect of a single dollar sign in a file name or recipe. + +Variable references can be used in any context: targets, prerequisites, +recipes, most directives, and new variable values. Here is an +example of a common case, where a variable holds the names of all the +object files in a program: + +@example +@group +objects = program.o foo.o utils.o +program : $(objects) + cc -o program $(objects) + +$(objects) : defs.h +@end group +@end example + +Variable references work by strict textual substitution. Thus, the rule + +@example +@group +foo = c +prog.o : prog.$(foo) + $(foo)$(foo) -$(foo) prog.$(foo) +@end group +@end example + +@noindent +could be used to compile a C program @file{prog.c}. Since spaces before +the variable value are ignored in variable assignments, the value of +@code{foo} is precisely @samp{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 @code{x} with +@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 +@cindex flavors of variables +@cindex recursive variable expansion +@cindex variables, flavors +@cindex recursively expanded variables +@cindex variables, recursively expanded + +There are two ways that a variable in GNU @code{make} can have a value; +we call them the two @dfn{flavors} of variables. The two flavors are +distinguished in how they are defined and in what they do when expanded. + +@cindex = +The first flavor of variable is a @dfn{recursively expanded} variable. +Variables of this sort are defined by lines using @samp{=} +(@pxref{Setting, ,Setting Variables}) or by the @code{define} directive +(@pxref{Multi-Line, ,Defining Multi-Line Variables}). The value you specify +is installed verbatim; if it contains references to other variables, +these references are expanded whenever this variable is substituted (in +the course of expanding some other string). When this happens, it is +called @dfn{recursive expansion}.@refill + +For example, + +@example +foo = $(bar) +bar = $(ugh) +ugh = Huh? + +all:;echo $(foo) +@end example + +@noindent +will echo @samp{Huh?}: @samp{$(foo)} expands to @samp{$(bar)} which +expands to @samp{$(ugh)} which finally expands to @samp{Huh?}.@refill + +This flavor of variable is the only sort supported by most other +versions of @code{make}. It has its advantages and its disadvantages. +An advantage (most would say) is that: + +@example +CFLAGS = $(include_dirs) -O +include_dirs = -Ifoo -Ibar +@end example + +@noindent +will do what was intended: when @samp{CFLAGS} is expanded in a recipe, +it will expand to @samp{-Ifoo -Ibar -O}. A major disadvantage is that you +cannot append something on the end of a variable, as in + +@example +CFLAGS = $(CFLAGS) -O +@end example + +@noindent +because it will cause an infinite loop in the variable expansion. +(Actually @code{make} detects the infinite loop and reports an error.) +@cindex loops in variable expansion +@cindex variables, loops in expansion + +Another disadvantage is that any functions +(@pxref{Functions, ,Functions for Transforming Text}) +referenced in the definition will be executed every time the variable is +expanded. This makes @code{make} run slower; worse, it causes the +@code{wildcard} and @code{shell} functions to give unpredictable results +because you cannot easily control when they are called, or even how many +times. + +To avoid all the problems and inconveniences of recursively expanded +variables, there is another flavor: simply expanded variables. + +@cindex simply expanded variables +@cindex variables, simply expanded +@cindex := +@cindex ::= +@dfn{Simply expanded variables} are defined by lines using @samp{:=} +or @samp{::=} (@pxref{Setting, ,Setting Variables}). Both forms are +equivalent in GNU @code{make}; however only the @samp{::=} form is +described by the POSIX standard (support for @samp{::=} was added to +the POSIX standard in 2012, so older versions of @code{make} won't +accept this form either). + +The value of a simply expanded variable is scanned +once and for all, expanding any references to other variables and +functions, when the variable is defined. The actual value of the simply +expanded variable is the result of expanding the text that you write. +It does not contain any references to other variables; it contains their +values @emph{as of the time this variable was defined}. Therefore, + +@example +x := foo +y := $(x) bar +x := later +@end example + +@noindent +is equivalent to + +@example +y := foo bar +x := later +@end example + +When a simply expanded variable is referenced, its value is substituted +verbatim. + +Here is a somewhat more complicated example, illustrating the use of +@samp{:=} in conjunction with the @code{shell} function. +(@xref{Shell Function, , The @code{shell} Function}.) This example +also shows use of the variable @code{MAKELEVEL}, which is changed +when it is passed down from level to level. +(@xref{Variables/Recursion, , Communicating Variables to a +Sub-@code{make}}, for information about @code{MAKELEVEL}.) + +@vindex MAKELEVEL +@vindex MAKE +@example +@group +ifeq (0,$@{MAKELEVEL@}) +whoami := $(shell whoami) +host-type := $(shell arch) +MAKE := $@{MAKE@} host-type=$@{host-type@} whoami=$@{whoami@} +endif +@end group +@end example + +@noindent +An advantage of this use of @samp{:=} is that a typical +`descend into a directory' recipe then looks like this: + +@example +@group +$@{subdirs@}: + $@{MAKE@} -C $@@ all +@end group +@end example + +Simply expanded variables generally make complicated makefile programming +more predictable because they work like variables in most programming +languages. They allow you to redefine a variable using its own value (or +its value processed in some way by one of the expansion functions) and to +use the expansion functions much more efficiently +(@pxref{Functions, ,Functions for Transforming Text}). + +@cindex spaces, in variable values +@cindex whitespace, in variable values +@cindex variables, spaces in values +You can also use them to introduce controlled leading whitespace into +variable values. Leading whitespace characters are discarded from your +input before substitution of variable references and function calls; +this means you can include leading spaces in a variable value by +protecting them with variable references, like this: + +@example +nullstring := +space := $(nullstring) # end of the line +@end example + +@noindent +Here the value of the variable @code{space} is precisely one space. The +comment @w{@samp{# end of the line}} is included here just for clarity. +Since trailing space characters are @emph{not} stripped from variable +values, just a space at the end of the line would have the same effect +(but be rather hard to read). If you put whitespace at the end of a +variable value, it is a good idea to put a comment like that at the end +of the line to make your intent clear. Conversely, if you do @emph{not} +want any whitespace characters at the end of your variable value, you +must remember not to put a random comment on the end of the line after +some whitespace, such as this: + +@example +dir := /foo/bar # directory to put the frobs in +@end example + +@noindent +Here the value of the variable @code{dir} is @w{@samp{/foo/bar }} +(with four trailing spaces), which was probably not the intention. +(Imagine something like @w{@samp{$(dir)/file}} with this definition!) + +@cindex conditional variable assignment +@cindex variables, conditional assignment +@cindex ?= +There is another assignment operator for variables, @samp{?=}. This +is called a conditional variable assignment operator, because it only +has an effect if the variable is not yet defined. This statement: + +@example +FOO ?= bar +@end example + +@noindent +is exactly equivalent to this +(@pxref{Origin Function, ,The @code{origin} Function}): + +@example +ifeq ($(origin FOO), undefined) + FOO = bar +endif +@end example + +Note that a variable set to an empty value is still defined, so +@samp{?=} will not set that variable. + +@node Advanced, Values, Flavors, Using Variables +@section Advanced Features for Reference to Variables +@cindex reference to variables + +This section describes some advanced features you can use to reference +variables in more flexible ways. + +@menu +* Substitution Refs:: Referencing a variable with + substitutions on the value. +* Computed Names:: Computing the name of the variable to refer to. +@end menu + +@node Substitution Refs, Computed Names, Advanced, Advanced +@subsection Substitution References +@cindex modified variable reference +@cindex substitution variable reference +@cindex variables, modified reference +@cindex variables, substitution reference + +@cindex variables, substituting suffix in +@cindex suffix, substituting in variables +A @dfn{substitution reference} substitutes the value of a variable with +alterations that you specify. It has the form +@samp{$(@var{var}:@var{a}=@var{b})} (or +@samp{$@{@var{var}:@var{a}=@var{b}@}}) and its meaning is to take the value +of the variable @var{var}, replace every @var{a} at the end of a word with +@var{b} in that value, and substitute the resulting string. + +When we say ``at the end of a word'', we mean that @var{a} must appear +either followed by whitespace or at the end of the value in order to be +replaced; other occurrences of @var{a} in the value are unaltered. For +example:@refill + +@example +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 l.a c.c}. @xref{Setting, ,Setting Variables}. + +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 +the @code{patsubst} function. It has the same form +@samp{$(@var{var}:@var{a}=@var{b})} described above, except that now +@var{a} must contain a single @samp{%} character. This case is +equivalent to @samp{$(patsubst @var{a},@var{b},$(@var{var}))}. +@xref{Text Functions, ,Functions for String Substitution and Analysis}, +for a description of the @code{patsubst} function.@refill + +@example +@group +@exdent For example: + +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 l.a c.c}. + +@node Computed Names, , Substitution Refs, Advanced +@subsection Computed Variable Names +@cindex nested variable reference +@cindex computed variable name +@cindex variables, computed names +@cindex variables, nested references +@cindex variables, @samp{$} in name +@cindex @code{$}, in variable name +@cindex dollar sign (@code{$}), in variable name + +Computed variable names are a complicated concept needed only for +sophisticated makefile programming. For most purposes you need not +consider them, except to know that making a variable with a dollar sign +in its name might have strange results. However, if you are the type +that wants to understand everything, or you are actually interested in +what they do, read on. + +Variables may be referenced inside the name of a variable. This is +called a @dfn{computed variable name} or a @dfn{nested variable +reference}. For example, + +@example +x = y +y = z +a := $($(x)) +@end example + +@noindent +defines @code{a} as @samp{z}: the @samp{$(x)} inside @samp{$($(x))} expands +to @samp{y}, so @samp{$($(x))} expands to @samp{$(y)} which in turn expands +to @samp{z}. Here the name of the variable to reference is not stated +explicitly; it is computed by expansion of @samp{$(x)}. The reference +@samp{$(x)} here is nested within the outer variable reference. + +The previous example shows two levels of nesting, but any number of levels +is possible. For example, here are three levels: + +@example +x = y +y = z +z = u +a := $($($(x))) +@end example + +@noindent +Here the innermost @samp{$(x)} expands to @samp{y}, so @samp{$($(x))} +expands to @samp{$(y)} which in turn expands to @samp{z}; now we have +@samp{$(z)}, which becomes @samp{u}. + +References to recursively-expanded variables within a variable name are +re-expanded in the usual fashion. For example: + +@example +x = $(y) +y = z +z = Hello +a := $($(x)) +@end example + +@noindent +defines @code{a} as @samp{Hello}: @samp{$($(x))} becomes @samp{$($(y))} +which becomes @samp{$(z)} which becomes @samp{Hello}. + +Nested variable references can also contain modified references and +function invocations (@pxref{Functions, ,Functions for Transforming Text}), +just like any other reference. +For example, using the @code{subst} function +(@pxref{Text Functions, ,Functions for String Substitution and Analysis}): + +@example +@group +x = variable1 +variable2 := Hello +y = $(subst 1,2,$(x)) +z = y +a := $($($(z))) +@end group +@end example + +@noindent +eventually defines @code{a} as @samp{Hello}. It is doubtful that anyone +would ever want to write a nested reference as convoluted as this one, but +it works: @samp{$($($(z)))} expands to @samp{$($(y))} which becomes +@samp{$($(subst 1,2,$(x)))}. This gets the value @samp{variable1} from +@code{x} and changes it by substitution to @samp{variable2}, so that the +entire string becomes @samp{$(variable2)}, a simple variable reference +whose value is @samp{Hello}.@refill + +A computed variable name need not consist entirely of a single variable +reference. It can contain several variable references, as well as some +invariant text. For example, + +@example +@group +a_dirs := dira dirb +1_dirs := dir1 dir2 +@end group + +@group +a_files := filea fileb +1_files := file1 file2 +@end group + +@group +ifeq "$(use_a)" "yes" +a1 := a +else +a1 := 1 +endif +@end group + +@group +ifeq "$(use_dirs)" "yes" +df := dirs +else +df := files +endif + +dirs := $($(a1)_$(df)) +@end group +@end example + +@noindent +will give @code{dirs} the same value as @code{a_dirs}, @code{1_dirs}, +@code{a_files} or @code{1_files} depending on the settings of @code{use_a} +and @code{use_dirs}.@refill + +Computed variable names can also be used in substitution references: + +@example +@group +a_objects := a.o b.o c.o +1_objects := 1.o 2.o 3.o + +sources := $($(a1)_objects:.o=.c) +@end group +@end example + +@noindent +defines @code{sources} as either @samp{a.c b.c c.c} or @samp{1.c 2.c 3.c}, +depending on the value of @code{a1}. + +The only restriction on this sort of use of nested variable references +is that they cannot specify part of the name of a function to be called. +This is because the test for a recognized function name is done before +the expansion of nested references. For example, + +@example +@group +ifdef do_sort +func := sort +else +func := strip +endif +@end group + +@group +bar := a d b g q c +@end group + +@group +foo := $($(func) $(bar)) +@end group +@end example + +@noindent +attempts to give @samp{foo} the value of the variable @samp{sort a d b g +q c} or @samp{strip a d b g q c}, rather than giving @samp{a d b g q c} +as the argument to either the @code{sort} or the @code{strip} function. +This restriction could be removed in the future if that change is shown +to be a good idea. + +You can also use computed variable names in the left-hand side of a +variable assignment, or in a @code{define} directive, as in: + +@example +dir = foo +$(dir)_sources := $(wildcard $(dir)/*.c) +define $(dir)_print = +lpr $($(dir)_sources) +endef +@end example + +@noindent +This example defines the variables @samp{dir}, @samp{foo_sources}, and +@samp{foo_print}. + +Note that @dfn{nested variable references} are quite different from +@dfn{recursively expanded variables} +(@pxref{Flavors, ,The Two Flavors of Variables}), though both are +used together in complex ways when doing makefile programming.@refill + +@node Values, Setting, Advanced, Using Variables +@section How Variables Get Their Values +@cindex variables, how they get their values +@cindex value, how a variable gets it + +Variables can get values in several different ways: + +@itemize @bullet +@item +You can specify an overriding value when you run @code{make}. +@xref{Overriding, ,Overriding Variables}. + +@item +You can specify a value in the makefile, either +with an assignment (@pxref{Setting, ,Setting Variables}) or with a +verbatim definition (@pxref{Multi-Line, ,Defining Multi-Line Variables}).@refill + +@item +Variables in the environment become @code{make} variables. +@xref{Environment, ,Variables from the Environment}. + +@item +Several @dfn{automatic} variables are given new values for each rule. +Each of these has a single conventional use. +@xref{Automatic Variables}. + +@item +Several variables have constant initial values. +@xref{Implicit Variables, ,Variables Used by Implicit Rules}. +@end itemize + +@node Setting, Appending, Values, Using Variables +@section Setting Variables +@cindex setting variables +@cindex variables, setting +@cindex = +@cindex := +@cindex ::= +@cindex ?= +@cindex != + +To set a variable from the makefile, write a line starting with the +variable name followed by @samp{=}, @samp{:=}, or @samp{::=}. Whatever +follows the @samp{=}, @samp{:=}, or @samp{::=} on the line becomes the +value. For example, + +@example +objects = main.o foo.o bar.o utils.o +@end example + +@noindent +defines a variable named @code{objects}. Whitespace around the variable +name and immediately after the @samp{=} is ignored. + +Variables defined with @samp{=} are @dfn{recursively expanded} +variables. Variables defined with @samp{:=} or @samp{::=} are +@dfn{simply expanded} variables; these definitions can contain +variable references which will be expanded before the definition is +made. @xref{Flavors, ,The Two Flavors of Variables}. + +The variable name may contain function and variable references, which +are expanded when the line is read to find the actual variable name to use. + +There is no limit on the length of the value of a variable except the +amount of memory on the computer. You can split the value of a +variable into multiple physical lines for readability +(@pxref{Splitting Lines, ,Splitting Long Lines}). + +Most variable names are considered to have the empty string as a value if +you have never set them. Several variables have built-in initial values +that are not empty, but you can set them in the usual ways +(@pxref{Implicit Variables, ,Variables Used by Implicit Rules}). +Several special variables are set +automatically to a new value for each rule; these are called the +@dfn{automatic} variables (@pxref{Automatic Variables}). + +If you'd like a variable to be set to a value only if it's not already +set, then you can use the shorthand operator @samp{?=} instead of +@samp{=}. These two settings of the variable @samp{FOO} are identical +(@pxref{Origin Function, ,The @code{origin} Function}): + +@example +FOO ?= bar +@end example + +@noindent +and + +@example +ifeq ($(origin FOO), undefined) +FOO = bar +endif +@end example + +The shell assignment operator @samp{!=} can be used to execute a +shell script and set a variable to its output. This operator first +evaluates the right-hand side, then passes that result to the shell +for execution. If the result of the execution ends in a newline, that +one newline is removed; all other newlines are replaced by spaces. +The resulting string is then placed into the named +recursively-expanded variable. For example: + +@example +hash != printf '\043' +file_list != find . -name '*.c' +@end example + +If the result of the execution could produce a @code{$}, and you don't +intend what follows that to be interpreted as a make variable or +function reference, then you must replace every @code{$} with +@code{$$} as part of the execution. Alternatively, you can set a +simply expanded variable to the result of running a program using the +@code{shell} function call. @xref{Shell Function, , The @code{shell} +Function}. For example: + +@example +hash := $(shell printf '\043') +var := $(shell find . -name "*.c") +@end example + +As with the @code{shell} function, the exit status of the just-invoked +shell script is stored in the @code{.SHELLSTATUS} variable. + + +@node Appending, Override Directive, Setting, Using Variables +@section Appending More Text to Variables +@cindex += +@cindex appending to variables +@cindex variables, appending to + +Often it is useful to add more text to the value of a variable already defined. +You do this with a line containing @samp{+=}, like this: + +@example +objects += another.o +@end example + +@noindent +This takes the value of the variable @code{objects}, and adds the text +@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 +objects += another.o +@end example + +@noindent +sets @code{objects} to @samp{main.o foo.o bar.o utils.o another.o}. + +Using @samp{+=} is similar to: + +@example +objects = main.o foo.o bar.o utils.o +objects := $(objects) another.o +@end example + +@noindent +but differs in ways that become important when you use more complex values. + +When the variable in question has not been defined before, @samp{+=} +acts just like normal @samp{=}: it defines a recursively-expanded +variable. However, when there @emph{is} a previous definition, exactly +what @samp{+=} does depends on what flavor of variable you defined +originally. @xref{Flavors, ,The Two Flavors of Variables}, for an +explanation of the two flavors of variables. + +When you add to a variable's value with @samp{+=}, @code{make} acts +essentially as if you had included the extra text in the initial +definition of the variable. If you defined it first with @samp{:=} or +@samp{::=}, making it a simply-expanded variable, @samp{+=} adds to +that simply-expanded definition, and expands the new text before +appending it to the old value just as @samp{:=} does (see +@ref{Setting, ,Setting Variables}, for a full explanation of +@samp{:=} or @samp{::=}). In fact, + +@example +variable := value +variable += more +@end example + +@noindent +is exactly equivalent to: + +@noindent +@example +variable := value +variable := $(variable) more +@end example + +On the other hand, when you use @samp{+=} with a variable that you defined +first to be recursively-expanded using plain @samp{=}, @code{make} does +something a bit different. Recall that when you define a +recursively-expanded variable, @code{make} does not expand the value you set +for variable and function references immediately. Instead it stores the text +verbatim, and saves these variable and function references to be expanded +later, when you refer to the new variable (@pxref{Flavors, ,The Two Flavors +of Variables}). When you use @samp{+=} on a recursively-expanded variable, +it is this unexpanded text to which @code{make} appends the new text you +specify. + +@example +@group +variable = value +variable += more +@end group +@end example + +@noindent +is roughly equivalent to: + +@example +@group +temp = value +variable = $(temp) more +@end group +@end example + +@noindent +except that of course it never defines a variable called @code{temp}. +The importance of this comes when the variable's old value contains +variable references. Take this common example: + +@example +CFLAGS = $(includes) -O +@dots{} +CFLAGS += -pg # enable profiling +@end example + +@noindent +The first line defines the @code{CFLAGS} variable with a reference to another +variable, @code{includes}. (@code{CFLAGS} is used by the rules for C +compilation; @pxref{Catalogue of Rules, ,Catalogue of Built-In Rules}.) +Using @samp{=} for the definition makes @code{CFLAGS} a recursively-expanded +variable, meaning @w{@samp{$(includes) -O}} is @emph{not} expanded when +@code{make} processes the definition of @code{CFLAGS}. Thus, @code{includes} +need not be defined yet for its value to take effect. It only has to be +defined before any reference to @code{CFLAGS}. If we tried to append to the +value of @code{CFLAGS} without using @samp{+=}, we might do it like this: + +@example +CFLAGS := $(CFLAGS) -pg # enable profiling +@end example + +@noindent +This is pretty close, but not quite what we want. Using @samp{:=} +redefines @code{CFLAGS} as a simply-expanded variable; this means +@code{make} expands the text @w{@samp{$(CFLAGS) -pg}} before setting the +variable. If @code{includes} is not yet defined, we get @w{@samp{ -O +-pg}}, and a later definition of @code{includes} will have no effect. +Conversely, by using @samp{+=} we set @code{CFLAGS} to the +@emph{unexpanded} value @w{@samp{$(includes) -O -pg}}. Thus we preserve +the reference to @code{includes}, so if that variable gets defined at +any later point, a reference like @samp{$(CFLAGS)} still uses its +value. + +@node Override Directive, Multi-Line, Appending, Using Variables +@section The @code{override} Directive +@findex override +@cindex overriding with @code{override} +@cindex variables, overriding + +If a variable has been set with a command argument +(@pxref{Overriding, ,Overriding Variables}), +then ordinary assignments in the makefile are ignored. If you want to set +the variable in the makefile even though it was set with a command +argument, you can use an @code{override} directive, which is a line that +looks like this:@refill + +@example +override @var{variable} = @var{value} +@end example + +@noindent +or + +@example +override @var{variable} := @var{value} +@end example + +To append more text to a variable defined on the command line, use: + +@example +override @var{variable} += @var{more text} +@end example + +@noindent +@xref{Appending, ,Appending More Text to Variables}. + +Variable assignments marked with the @code{override} flag have a +higher priority than all other assignments, except another +@code{override}. Subsequent assignments or appends to this variable +which are not marked @code{override} will be ignored. + +The @code{override} directive was not invented for escalation in the war +between makefiles and command arguments. It was invented so you can alter +and add to values that the user specifies with command arguments. + +For example, suppose you always want the @samp{-g} switch when you run the +C compiler, but you would like to allow the user to specify the other +switches with a command argument just as usual. You could use this +@code{override} directive: + +@example +override CFLAGS += -g +@end example + +You can also use @code{override} directives with @code{define} directives. +This is done as you might expect: + +@example +override define foo = +bar +endef +@end example + +@noindent +@iftex +See the next section for information about @code{define}. +@end iftex +@ifnottex +@xref{Multi-Line, ,Defining Multi-Line Variables}. +@end ifnottex + +@node Multi-Line, Undefine Directive, Override Directive, Using Variables +@section Defining Multi-Line Variables +@findex define +@findex endef +@cindex multi-line variable definition +@cindex variables, multi-line +@cindex verbatim variable definition +@cindex defining variables verbatim +@cindex variables, defining verbatim + +Another way to set the value of a variable is to use the @code{define} +directive. This directive has an unusual syntax which allows newline +characters to be included in the value, which is convenient for +defining both canned sequences of commands (@pxref{Canned Recipes, +,Defining Canned Recipes}), and also sections of makefile syntax to +use with @code{eval} (@pxref{Eval Function}).@refill + +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. + +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 +recursively-expanded variable (@pxref{Flavors, ,The Two Flavors of Variables}). +When using a @samp{+=} operator, the value is appended to the previous +value as with any other append operation: with a single space +separating the old and new values. + +You may nest @code{define} directives: @code{make} will keep track of +nested directives and report an error if they are not all properly +closed with @code{endef}. Note that lines beginning with the recipe +prefix character are considered part of a recipe, so any @code{define} +or @code{endef} strings appearing on such a line will not be +considered @code{make} directives. + +@example +define two-lines +echo foo +echo $(bar) +endef +@end example + +@need 800 +When used in a recipe, the previous example is functionally equivalent +to this: + +@example +two-lines = echo foo; echo $(bar) +@end example + +@noindent +since two commands separated by semicolon behave much like two separate +shell commands. However, note that using two separate lines means +@code{make} will invoke the shell twice, running an independent sub-shell +for each line. @xref{Execution, ,Recipe Execution}. + +If you want variable definitions made with @code{define} to take +precedence over command-line variable definitions, you can use the +@code{override} directive together with @code{define}: + +@example +override define two-lines = +foo +$(bar) +endef +@end example + +@noindent +@xref{Override Directive, ,The @code{override} Directive}. + +@node Undefine Directive, Environment, Multi-Line, Using Variables +@section Undefining Variables +@findex undefine +@cindex undefining variable + +If you want to clear a variable, setting its value to empty is usually +sufficient. Expanding such a variable will yield the same result (empty +string) regardless of whether it was set or not. However, if you are +using the @code{flavor} (@pxref{Flavor Function}) and +@code{origin} (@pxref{Origin Function}) functions, there is a difference +between a variable that was never set and a variable with an empty value. +In such situations you may want to use the @code{undefine} directive to +make a variable appear as if it was never set. For example: + +@example +foo := foo +bar = bar + +undefine foo +undefine bar + +$(info $(origin foo)) +$(info $(flavor bar)) +@end example + +This example will print ``undefined'' for both variables. + +If you want to undefine a command-line variable definition, you can use +the @code{override} directive together with @code{undefine}, similar to +how this is done for variable definitions: + +@example +override undefine CFLAGS +@end example + +@node Environment, Target-specific, Undefine Directive, Using Variables +@section Variables from the Environment + +@cindex variables, environment +@cindex environment +Variables in @code{make} can come from the environment in which +@code{make} is run. Every environment variable that @code{make} sees +when it starts up is transformed into a @code{make} variable with the +same name and value. However, an explicit assignment in the makefile, +or with a command argument, overrides the environment. (If the +@samp{-e} flag is specified, then values from the environment override +assignments in the makefile. @xref{Options Summary, ,Summary of +Options}. But this is not recommended practice.) + +Thus, by setting the variable @code{CFLAGS} in your environment, you can +cause all C compilations in most makefiles to use the compiler switches you +prefer. This is safe for variables with standard or conventional meanings +because you know that no makefile will use them for other things. (Note +this is not totally reliable; some makefiles set @code{CFLAGS} explicitly +and therefore are not affected by the value in the environment.) + +When @code{make} runs a recipe, variables defined in the +makefile are placed into the environment of each shell. This allows +you to pass values to sub-@code{make} invocations (@pxref{Recursion, +,Recursive Use of @code{make}}). By default, only variables that came +from the environment or the command line are passed to recursive +invocations. You can use the @code{export} directive to pass other +variables. @xref{Variables/Recursion, , Communicating Variables to a +Sub-@code{make}}, for full details. + +Other use of variables from the environment is not recommended. It is not +wise for makefiles to depend for their functioning on environment variables +set up outside their control, since this would cause different users to get +different results from the same makefile. This is against the whole +purpose of most makefiles. + +@cindex SHELL, import from environment +Such problems would be especially likely with the variable +@code{SHELL}, which is normally present in the environment to specify +the user's choice of interactive shell. It would be very undesirable +for this choice to affect @code{make}; so, @code{make} handles the +@code{SHELL} environment variable in a special way; see @ref{Choosing +the Shell}.@refill + +@node Target-specific, Pattern-specific, Environment, Using Variables +@section Target-specific Variable Values +@cindex target-specific variables +@cindex variables, target-specific + +Variable values in @code{make} are usually global; that is, they are the +same regardless of where they are evaluated (unless they're reset, of +course). One exception to that is automatic variables +(@pxref{Automatic Variables}). + +The other exception is @dfn{target-specific variable values}. This +feature allows you to define different values for the same variable, +based on the target that @code{make} is currently building. As with +automatic variables, these values are only available within the context +of a target's recipe (and in other target-specific assignments). + +Set a target-specific variable value like this: + +@example +@var{target} @dots{} : @var{variable-assignment} +@end example + +Target-specific variable assignments can be prefixed with any or all of the +special keywords @code{export}, @code{override}, or @code{private}; +these apply their normal behavior to this instance of the variable only. + +Multiple @var{target} values create a target-specific variable value for +each member of the target list individually. + +The @var{variable-assignment} can be any valid form of assignment; +recursive (@samp{=}), simple (@samp{:=} or @samp{::=}), appending +(@samp{+=}), or conditional (@samp{?=}). All variables that appear +within the @var{variable-assignment} are evaluated within the context +of the target: thus, any previously-defined target-specific variable +values will be in effect. Note that this variable is actually +distinct from any ``global'' value: the two variables do not have to +have the same flavor (recursive vs.@: simple). + +Target-specific variables have the same priority as any other makefile +variable. Variables provided on the command line (and in the +environment if the @samp{-e} option is in force) will take precedence. +Specifying the @code{override} directive will allow the target-specific +variable value to be preferred. + +There is one more special feature of target-specific variables: when +you define a target-specific variable that variable value is also in +effect for all prerequisites of this target, and all their +prerequisites, etc.@: (unless those prerequisites override that variable +with their own target-specific variable value). So, for example, a +statement like this: + +@example +prog : CFLAGS = -g +prog : prog.o foo.o bar.o +@end example + +@noindent +will set @code{CFLAGS} to @samp{-g} in the recipe for @file{prog}, but +it will also set @code{CFLAGS} to @samp{-g} in the recipes that create +@file{prog.o}, @file{foo.o}, and @file{bar.o}, and any recipes which +create their prerequisites. + +Be aware that a given prerequisite will only be built once per +invocation of make, at most. If the same file is a prerequisite of +multiple targets, and each of those targets has a different value for +the same target-specific variable, then the first target to be built +will cause that prerequisite to be built and the prerequisite will +inherit the target-specific value from the first target. It will +ignore the target-specific values from any other targets. + +@node Pattern-specific, Suppressing Inheritance, Target-specific, Using Variables +@section Pattern-specific Variable Values +@cindex pattern-specific variables +@cindex variables, pattern-specific + +In addition to target-specific variable values +(@pxref{Target-specific, ,Target-specific Variable Values}), GNU +@code{make} supports pattern-specific variable values. In this form, +the variable is defined for any target that matches the pattern +specified. + +Set a pattern-specific variable value like this: + +@example +@var{pattern} @dots{} : @var{variable-assignment} +@end example +where @var{pattern} is a %-pattern. As with target-specific variable +values, multiple @var{pattern} values create a pattern-specific variable +value for each pattern individually. The @var{variable-assignment} can +be any valid form of assignment. Any command line variable setting will +take precedence, unless @code{override} is specified. + +For example: + +@example +%.o : CFLAGS = -O +@end example + +@noindent +will assign @code{CFLAGS} the value of @samp{-O} for all targets +matching the pattern @code{%.o}. + +If a target matches more than one pattern, the matching pattern-specific +variables with longer stems are interpreted first. This results in more +specific variables taking precedence over the more generic ones, for +example: + +@example +%.o: %.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@@ + +lib/%.o: CFLAGS := -fPIC -g +%.o: CFLAGS := -g + +all: foo.o lib/bar.o +@end example + +In this example the first definition of the @code{CFLAGS} variable +will be used to update @file{lib/bar.o} even though the second one +also applies to this target. Pattern-specific variables which result +in the same stem length are considered in the order in which they +were defined in the makefile. + +Pattern-specific variables are searched after any target-specific +variables defined explicitly for that target, and before target-specific +variables defined for the parent target. + +@node Suppressing Inheritance, Special Variables, Pattern-specific, Using Variables +@section Suppressing Inheritance +@findex private +@cindex suppressing inheritance +@cindex inheritance, suppressing + +As described in previous sections, @code{make} variables are inherited +by prerequisites. This capability allows you to modify the behavior +of a prerequisite based on which targets caused it to be rebuilt. For +example, you might set a target-specific variable on a @code{debug} +target, then running @samp{make debug} will cause that variable to be +inherited by all prerequisites of @code{debug}, while just running +@samp{make all} (for example) would not have that assignment. + +Sometimes, however, you may not want a variable to be inherited. For +these situations, @code{make} provides the @code{private} modifier. +Although this modifier can be used with any variable assignment, it +makes the most sense with target- and pattern-specific variables. Any +variable marked @code{private} will be visible to its local target but +will not be inherited by prerequisites of that target. A global +variable marked @code{private} will be visible in the global scope but +will not be inherited by any target, and hence will not be visible +in any recipe. + +As an example, consider this makefile: +@example +EXTRA_CFLAGS = + +prog: private EXTRA_CFLAGS = -L/usr/local/lib +prog: a.o b.o +@end example + +Due to the @code{private} modifier, @code{a.o} and @code{b.o} will not +inherit the @code{EXTRA_CFLAGS} variable assignment from the +@code{prog} target. + +@node Special Variables, , Suppressing Inheritance, Using Variables +@comment node-name, next, previous, up +@section Other Special Variables +@cindex makefiles, and special variables +@cindex special variables + +GNU @code{make} supports some variables that have special properties. + +@table @code + +@vindex MAKEFILE_LIST @r{(list of parsed makefiles)} +@cindex makefiles, and @code{MAKEFILE_LIST} variable +@cindex including (@code{MAKEFILE_LIST} variable) +@item MAKEFILE_LIST +Contains the name of each makefile that is parsed by @code{make}, in +the order in which it was parsed. The name is appended just +before @code{make} begins to parse the makefile. Thus, if the first +thing a makefile does is examine the last word in this variable, it +will be the name of the current makefile. Once the current makefile +has used @code{include}, however, the last word will be the +just-included makefile. + +If a makefile named @code{Makefile} has this content: + +@example +@group +name1 := $(lastword $(MAKEFILE_LIST)) + +include inc.mk + +name2 := $(lastword $(MAKEFILE_LIST)) + +all: + @@echo name1 = $(name1) + @@echo name2 = $(name2) +@end group +@end example + +@noindent +then you would expect to see this output: + +@example +@group +name1 = Makefile +name2 = inc.mk +@end group +@end example + +@vindex .DEFAULT_GOAL @r{(define default goal)} +@item .DEFAULT_GOAL +Sets the default goal to be used if no targets were specified on the +command line (@pxref{Goals, , Arguments to Specify the Goals}). The +@code{.DEFAULT_GOAL} variable allows you to discover the current +default goal, restart the default goal selection algorithm by clearing +its value, or to explicitly set the default goal. The following +example illustrates these cases: + +@example +@group +# Query the default goal. +ifeq ($(.DEFAULT_GOAL),) + $(warning no default goal is set) +endif + +.PHONY: foo +foo: ; @@echo $@@ + +$(warning default goal is $(.DEFAULT_GOAL)) + +# Reset the default goal. +.DEFAULT_GOAL := + +.PHONY: bar +bar: ; @@echo $@@ + +$(warning default goal is $(.DEFAULT_GOAL)) + +# Set our own. +.DEFAULT_GOAL := foo +@end group +@end example + +This makefile prints: + +@example +@group +no default goal is set +default goal is foo +default goal is bar +foo +@end group +@end example + +Note that assigning more than one target name to @code{.DEFAULT_GOAL} is +invalid and will result in an error. + +@vindex MAKE_RESTARTS @r{(number of times @code{make} has restarted)} +@item MAKE_RESTARTS +This variable is set only if this instance of @code{make} has +restarted (@pxref{Remaking Makefiles, , How Makefiles Are Remade}): it +will contain the number of times this instance has restarted. Note +this is not the same as recursion (counted by the @code{MAKELEVEL} +variable). You should not set, modify, or export this variable. + +@vindex MAKE_TERMOUT @r{(whether stdout is a terminal)} +@vindex MAKE_TERMERR @r{(whether stderr is a terminal)} +@item MAKE_TERMOUT +@itemx MAKE_TERMERR +When @code{make} starts it will check whether stdout and stderr will +show their output on a terminal. If so, it will set +@code{MAKE_TERMOUT} and @code{MAKE_TERMERR}, respectively, to the name +of the terminal device (or @code{true} if this cannot be determined). +If set these variables will be marked for export. These variables +will not be changed by @code{make} and they will not be modified if +already set. + +These values can be used (particularly in combination with output +synchronization (@pxref{Parallel Output, ,Output During Parallel +Execution}) to determine whether @code{make} itself is writing to a +terminal; they can be tested to decide whether to force recipe +commands to generate colorized output for example. + +If you invoke a sub-@code{make} and redirect its stdout or stderr it +is your responsibility to reset or unexport these variables as well, +if your makefiles rely on them. + +@vindex .RECIPEPREFIX @r{(change the recipe prefix character)} +@item .RECIPEPREFIX +The first character of the value of this variable is used as the +character make assumes is introducing a recipe line. If the variable +is empty (as it is by default) that character is the standard tab +character. For example, this is a valid makefile: + +@example +@group +.RECIPEPREFIX = > +all: +> @@echo Hello, world +@end group +@end example + +The value of @code{.RECIPEPREFIX} can be changed multiple times; once set +it stays in effect for all rules parsed until it is modified. + +@vindex .VARIABLES @r{(list of variables)} +@item .VARIABLES +Expands to a list of the @emph{names} of all global variables defined +so far. This includes variables which have empty values, as well as +built-in variables (@pxref{Implicit Variables, , Variables Used by +Implicit Rules}), but does not include any variables which are only +defined in a target-specific context. Note that any value you assign +to this variable will be ignored; it will always return its special +value. + +@c @vindex .TARGETS @r{(list of targets)} +@c @item .TARGETS +@c The second special variable is @code{.TARGETS}. When expanded, the +@c value consists of a list of all targets defined in all makefiles read +@c up until that point. Note it's not enough for a file to be simply +@c mentioned in the makefile to be listed in this variable, even if it +@c would match an implicit rule and become an ``implicit target''. The +@c file must appear as a target, on the left-hand side of a ``:'', to be +@c considered a target for the purposes of this variable. + +@vindex .FEATURES @r{(list of supported features)} +@item .FEATURES +Expands to a list of special features supported by this version of +@code{make}. Possible values include, but are not limited to: + +@table @samp + +@item archives +Supports @code{ar} (archive) files using special file name syntax. +@xref{Archives, ,Using @code{make} to Update Archive Files}. + +@item check-symlink +Supports the @code{-L} (@code{--check-symlink-times}) flag. +@xref{Options Summary, ,Summary of Options}. + +@item else-if +Supports ``else if'' non-nested conditionals. @xref{Conditional +Syntax, ,Syntax of Conditionals}. + +@item jobserver +Supports ``job server'' enhanced parallel builds. @xref{Parallel, +,Parallel Execution}. + +@item oneshell +Supports the @code{.ONESHELL} special target. @xref{One Shell, ,Using +One Shell}. + +@item order-only +Supports order-only prerequisites. @xref{Prerequisite Types, ,Types +of Prerequisites}. + +@item second-expansion +Supports secondary expansion of prerequisite lists. + +@item shortest-stem +Uses the ``shortest stem'' method of choosing which pattern, of +multiple applicable options, will be used. @xref{Pattern Match, ,How +Patterns Match}. + +@item target-specific +Supports target-specific and pattern-specific variable assignments. +@xref{Target-specific, ,Target-specific Variable Values}. + +@item undefine +Supports the @code{undefine} directive. @xref{Undefine Directive}. + +@item guile +Has GNU Guile available as an embedded extension language. +@xref{Guile Integration, ,GNU Guile Integration}. + +@item load +Supports dynamically loadable objects for creating custom extensions. +@xref{Loading Objects, ,Loading Dynamic Objects}. +@end table + +@vindex .INCLUDE_DIRS @r{(list of include directories)} +@item .INCLUDE_DIRS +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 +@chapter Conditional Parts of Makefiles + +@cindex conditionals +A @dfn{conditional} directive causes part of a makefile to be obeyed +or ignored depending on the values of variables. Conditionals can +compare the value of one variable to another, or the value of a +variable to a constant string. Conditionals control what @code{make} +actually ``sees'' in the makefile, so they @emph{cannot} be used to +control recipes at the time of execution.@refill + +@menu +* Conditional Example:: Example of a conditional +* Conditional Syntax:: The syntax of conditionals. +* Testing Flags:: Conditionals that test flags. +@end menu + +@node Conditional Example, Conditional Syntax, Conditionals, Conditionals +@section Example of a Conditional + +The following example of a conditional tells @code{make} to use one +set of libraries if the @code{CC} variable is @samp{gcc}, and a +different set of libraries otherwise. It works by controlling which +of two recipe lines will be used for the rule. The result is that +@samp{CC=gcc} as an argument to @code{make} changes not only which +compiler is used but also which libraries are linked. + +@example +libs_for_gcc = -lgnu +normal_libs = + +foo: $(objects) +ifeq ($(CC),gcc) + $(CC) -o foo $(objects) $(libs_for_gcc) +else + $(CC) -o foo $(objects) $(normal_libs) +endif +@end example + +This conditional uses three directives: one @code{ifeq}, one @code{else} +and one @code{endif}. + +The @code{ifeq} directive begins the conditional, and specifies the +condition. It contains two arguments, separated by a comma and surrounded +by parentheses. Variable substitution is performed on both arguments and +then they are compared. The lines of the makefile following the +@code{ifeq} are obeyed if the two arguments match; otherwise they are +ignored. + +The @code{else} directive causes the following lines to be obeyed if the +previous conditional failed. In the example above, this means that the +second alternative linking command is used whenever the first alternative +is not used. It is optional to have an @code{else} in a conditional. + +The @code{endif} directive ends the conditional. Every conditional must +end with an @code{endif}. Unconditional makefile text follows. + +As this example illustrates, conditionals work at the textual level: +the lines of the conditional are treated as part of the makefile, or +ignored, according to the condition. This is why the larger syntactic +units of the makefile, such as rules, may cross the beginning or the +end of the conditional. + +When the variable @code{CC} has the value @samp{gcc}, the above example has +this effect: + +@example +foo: $(objects) + $(CC) -o foo $(objects) $(libs_for_gcc) +@end example + +@noindent +When the variable @code{CC} has any other value, the effect is this: + +@example +foo: $(objects) + $(CC) -o foo $(objects) $(normal_libs) +@end example + +Equivalent results can be obtained in another way by conditionalizing a +variable assignment and then using the variable unconditionally: + +@example +libs_for_gcc = -lgnu +normal_libs = + +ifeq ($(CC),gcc) + libs=$(libs_for_gcc) +else + libs=$(normal_libs) +endif + +foo: $(objects) + $(CC) -o foo $(objects) $(libs) +@end example + +@node Conditional Syntax, Testing Flags, Conditional Example, Conditionals +@section Syntax of Conditionals +@findex ifdef +@findex ifeq +@findex ifndef +@findex ifneq +@findex else +@findex endif + +The syntax of a simple conditional with no @code{else} is as follows: + +@example +@var{conditional-directive} +@var{text-if-true} +endif +@end example + +@noindent +The @var{text-if-true} may be any lines of text, to be considered as part +of the makefile if the condition is true. If the condition is false, no +text is used instead. + +The syntax of a complex conditional is as follows: + +@example +@var{conditional-directive} +@var{text-if-true} +else +@var{text-if-false} +endif +@end example + +or: + +@example +@var{conditional-directive-one} +@var{text-if-one-is-true} +else @var{conditional-directive-two} +@var{text-if-two-is-true} +else +@var{text-if-one-and-two-are-false} +endif +@end example + +@noindent +There can be as many ``@code{else} @var{conditional-directive}'' +clauses as necessary. Once a given condition is true, +@var{text-if-true} is used and no other clause is used; if no +condition is true then @var{text-if-false} is used. The +@var{text-if-true} and @var{text-if-false} can be any number of lines +of text. + +The syntax of the @var{conditional-directive} is the same whether the +conditional is simple or complex; after an @code{else} or not. There +are four different directives that test different conditions. Here is +a table of them: + +@table @code +@item ifeq (@var{arg1}, @var{arg2}) +@itemx ifeq '@var{arg1}' '@var{arg2}' +@itemx ifeq "@var{arg1}" "@var{arg2}" +@itemx ifeq "@var{arg1}" '@var{arg2}' +@itemx ifeq '@var{arg1}' "@var{arg2}" +Expand all variable references in @var{arg1} and @var{arg2} and +compare them. If they are identical, the @var{text-if-true} is +effective; otherwise, the @var{text-if-false}, if any, is effective. + +Often you want to test if a variable has a non-empty value. When the +value results from complex expansions of variables and functions, +expansions you would consider empty may actually contain whitespace +characters and thus are not seen as empty. However, you can use the +@code{strip} function (@pxref{Text Functions}) to avoid interpreting +whitespace as a non-empty value. For example: + +@example +@group +ifeq ($(strip $(foo)),) +@var{text-if-empty} +endif +@end group +@end example + +@noindent +will evaluate @var{text-if-empty} even if the expansion of +@code{$(foo)} contains whitespace characters. + +@item ifneq (@var{arg1}, @var{arg2}) +@itemx ifneq '@var{arg1}' '@var{arg2}' +@itemx ifneq "@var{arg1}" "@var{arg2}" +@itemx ifneq "@var{arg1}" '@var{arg2}' +@itemx ifneq '@var{arg1}' "@var{arg2}" +Expand all variable references in @var{arg1} and @var{arg2} and +compare them. If they are different, the @var{text-if-true} is +effective; otherwise, the @var{text-if-false}, if any, is effective. + +@item ifdef @var{variable-name} +The @code{ifdef} form takes the @emph{name} of a variable as its +argument, not a reference to a variable. If the value of that +variable has a non-empty value, the @var{text-if-true} is effective; +otherwise, the @var{text-if-false}, if any, is effective. Variables +that have never been defined have an empty value. The text +@var{variable-name} is expanded, so it could be a variable or function +that expands to the name of a variable. For example: + +@example +bar = true +foo = bar +ifdef $(foo) +frobozz = yes +endif +@end example + +The variable reference @code{$(foo)} is expanded, yielding @code{bar}, +which is considered to be the name of a variable. The variable +@code{bar} is not expanded, but its value is examined to determine if +it is non-empty. + +Note that @code{ifdef} only tests whether a variable has a value. It +does not expand the variable to see if that value is nonempty. +Consequently, tests using @code{ifdef} return true for all definitions +except those like @code{foo =}. To test for an empty value, use +@w{@code{ifeq ($(foo),)}}. For example, + +@example +bar = +foo = $(bar) +ifdef foo +frobozz = yes +else +frobozz = no +endif +@end example + +@noindent +sets @samp{frobozz} to @samp{yes}, while: + +@example +foo = +ifdef foo +frobozz = yes +else +frobozz = no +endif +@end example + +@noindent +sets @samp{frobozz} to @samp{no}. + +@item ifndef @var{variable-name} +If the variable @var{variable-name} has an empty value, the +@var{text-if-true} is effective; otherwise, the @var{text-if-false}, +if any, is effective. The rules for expansion and testing of +@var{variable-name} are identical to the @code{ifdef} directive. +@end table + +Extra spaces are allowed and ignored at the beginning of the +conditional directive line, but a tab is not allowed. (If the line +begins with a tab, it will be considered part of a recipe for a rule.) +Aside from this, extra spaces or tabs may be inserted with no effect +anywhere except within the directive name or within an argument. A +comment starting with @samp{#} may appear at the end of the line. + +The other two directives that play a part in a conditional are @code{else} +and @code{endif}. Each of these directives is written as one word, with no +arguments. Extra spaces are allowed and ignored at the beginning of the +line, and spaces or tabs at the end. A comment starting with @samp{#} may +appear at the end of the line. + +Conditionals affect which lines of the makefile @code{make} uses. If +the condition is true, @code{make} reads the lines of the +@var{text-if-true} as part of the makefile; if the condition is false, +@code{make} ignores those lines completely. It follows that syntactic +units of the makefile, such as rules, may safely be split across the +beginning or the end of the conditional.@refill + +@code{make} evaluates conditionals when it reads a makefile. +Consequently, you cannot use automatic variables in the tests of +conditionals because they are not defined until recipes are run +(@pxref{Automatic Variables}). + +To prevent intolerable confusion, it is not permitted to start a +conditional in one makefile and end it in another. However, you may +write an @code{include} directive within a conditional, provided you do +not attempt to terminate the conditional inside the included file. + +@node Testing Flags, , Conditional Syntax, Conditionals +@section Conditionals that Test Flags + +You can write a conditional that tests @code{make} command flags such as +@samp{-t} by using the variable @code{MAKEFLAGS} together with the +@code{findstring} function +(@pxref{Text Functions, , Functions for String Substitution and Analysis}). +This is useful when @code{touch} is not enough to make a file appear up +to date. + +The @code{findstring} function determines whether one string appears as a +substring of another. If you want to test for the @samp{-t} flag, +use @samp{t} as the first string and the value of @code{MAKEFLAGS} as +the other. + +For example, here is how to arrange to use @samp{ranlib -t} to finish +marking an archive file up to date: + +@example +archive.a: @dots{} +ifneq (,$(findstring t,$(MAKEFLAGS))) + +touch archive.a + +ranlib -t archive.a +else + ranlib archive.a +endif +@end example + +@noindent +The @samp{+} prefix marks those recipe lines as ``recursive'' so that +they will be executed despite use of the @samp{-t} flag. +@xref{Recursion, ,Recursive Use of @code{make}}. + +@node Functions, Running, Conditionals, Top +@chapter Functions for Transforming Text +@cindex functions + +@dfn{Functions} allow you to do text processing in the makefile to +compute the files to operate on or the commands to use in recipes. +You use a function in a @dfn{function call}, where you give the name +of the function and some text (the @dfn{arguments}) for the function +to operate on. The result of the function's processing is substituted +into the makefile at the point of the call, just as a variable might +be substituted. + +@menu +* Syntax of Functions:: How to write a function call. +* Text Functions:: General-purpose text manipulation functions. +* File Name Functions:: Functions for manipulating file names. +* Conditional Functions:: Functions that implement conditions. +* Foreach Function:: Repeat some text with controlled variation. +* File Function:: Write text to a file. +* Call Function:: Expand a user-defined function. +* Value Function:: Return the un-expanded value of a variable. +* Eval Function:: Evaluate the arguments as makefile syntax. +* Origin Function:: Find where a variable got its value. +* Flavor Function:: Find out the flavor of a variable. +* Make Control Functions:: Functions that control how make runs. +* Shell Function:: Substitute the output of a shell command. +* Guile Function:: Use GNU Guile embedded scripting language. +@end menu + +@node Syntax of Functions, Text Functions, Functions, Functions +@section Function Call Syntax +@cindex @code{$}, in function call +@cindex dollar sign (@code{$}), in function call +@cindex arguments of functions +@cindex functions, syntax of + +A function call resembles a variable reference. It can appear +anywhere a variable reference can appear, and it is expanded using the +same rules as variable references. A function call looks like this: + +@example +$(@var{function} @var{arguments}) +@end example + +@noindent +or like this: + +@example +$@{@var{function} @var{arguments}@} +@end example + +Here @var{function} is a function name; one of a short list of names +that are part of @code{make}. You can also essentially create your own +functions by using the @code{call} built-in function. + +The @var{arguments} are the arguments of the function. They are +separated from the function name by one or more spaces or tabs, and if +there is more than one argument, then they are separated by commas. +Such whitespace and commas are not part of an argument's value. The +delimiters which you use to surround the function call, whether +parentheses or braces, can appear in an argument only in matching pairs; +the other kind of delimiters may appear singly. If the arguments +themselves contain other function calls or variable references, it is +wisest to use the same kind of delimiters for all the references; write +@w{@samp{$(subst a,b,$(x))}}, not @w{@samp{$(subst a,b,$@{x@})}}. This +is because it is clearer, and because only one type of delimiter is +matched to find the end of the reference. + +The text written for each argument is processed by substitution of +variables and function calls to produce the argument value, which +is the text on which the function acts. The substitution is done in the +order in which the arguments appear. + +Commas and unmatched parentheses or braces cannot appear in the text of an +argument as written; leading spaces cannot appear in the text of the first +argument as written. These characters can be put into the argument value +by variable substitution. First define variables @code{comma} and +@code{space} whose values are isolated comma and space characters, then +substitute these variables where such characters are wanted, like this: + +@example +@group +comma:= , +empty:= +space:= $(empty) $(empty) +foo:= a b c +bar:= $(subst $(space),$(comma),$(foo)) +# @r{bar is now `a,b,c'.} +@end group +@end example + +@noindent +Here the @code{subst} function replaces each space with a comma, through +the value of @code{foo}, and substitutes the result. + +@node Text Functions, File Name Functions, Syntax of Functions, Functions +@section Functions for String Substitution and Analysis +@cindex functions, for text + +Here are some functions that operate on strings: + +@table @code +@item $(subst @var{from},@var{to},@var{text}) +@findex subst +Performs a textual replacement on the text @var{text}: each occurrence +of @var{from} is replaced by @var{to}. The result is substituted for +the function call. For example, + +@example +$(subst ee,EE,feet on the street) +@end example + +produces the value @samp{fEEt on the strEEt}. + +@item $(patsubst @var{pattern},@var{replacement},@var{text}) +@findex patsubst +Finds whitespace-separated words in @var{text} that match +@var{pattern} and replaces them with @var{replacement}. Here +@var{pattern} may contain a @samp{%} which acts as a wildcard, +matching any number of any characters within a word. If +@var{replacement} also contains a @samp{%}, the @samp{%} is replaced +by the text that matched the @samp{%} in @var{pattern}. Only the first +@samp{%} in the @var{pattern} and @var{replacement} is treated this +way; any subsequent @samp{%} is unchanged.@refill + +@cindex @code{%}, quoting in @code{patsubst} +@cindex @code{%}, quoting with @code{\} (backslash) +@cindex @code{\} (backslash), to quote @code{%} +@cindex backslash (@code{\}), to quote @code{%} +@cindex quoting @code{%}, in @code{patsubst} +@samp{%} characters in @code{patsubst} function invocations can be +quoted with preceding backslashes (@samp{\}). Backslashes that would +otherwise quote @samp{%} characters can be quoted with more backslashes. +Backslashes that quote @samp{%} characters or other backslashes are +removed from the pattern before it is compared file names or has a stem +substituted into it. Backslashes that are not in danger of quoting +@samp{%} characters go unmolested. For example, the pattern +@file{the\%weird\\%pattern\\} has @samp{the%weird\} preceding the +operative @samp{%} character, and @samp{pattern\\} following it. The +final two backslashes are left alone because they cannot affect any +@samp{%} character.@refill + +Whitespace between words is folded into single space characters; +leading and trailing whitespace is discarded. + +For example, + +@example +$(patsubst %.c,%.o,x.c.c bar.c) +@end example + +@noindent +produces the value @samp{x.c.o bar.o}. + +Substitution references (@pxref{Substitution Refs, ,Substitution +References}) are a simpler way to get the effect of the @code{patsubst} +function: + +@example +$(@var{var}:@var{pattern}=@var{replacement}) +@end example + +@noindent +is equivalent to + +@example +$(patsubst @var{pattern},@var{replacement},$(@var{var})) +@end example + +The second shorthand simplifies one of the most common uses of +@code{patsubst}: replacing the suffix at the end of file names. + +@example +$(@var{var}:@var{suffix}=@var{replacement}) +@end example + +@noindent +is equivalent to + +@example +$(patsubst %@var{suffix},%@var{replacement},$(@var{var})) +@end example + +@noindent +For example, you might have a list of object files: + +@example +objects = foo.o bar.o baz.o +@end example + +@noindent +To get the list of corresponding source files, you could simply write: + +@example +$(objects:.o=.c) +@end example + +@noindent +instead of using the general form: + +@example +$(patsubst %.o,%.c,$(objects)) +@end example + +@item $(strip @var{string}) +@cindex stripping whitespace +@cindex whitespace, stripping +@cindex spaces, stripping +@findex strip +Removes leading and trailing whitespace from @var{string} and replaces +each internal sequence of one or more whitespace characters with a +single space. Thus, @samp{$(strip a b c )} results in @w{@samp{a b c}}. + +The function @code{strip} can be very useful when used in conjunction +with conditionals. When comparing something with the empty string +@samp{} using @code{ifeq} or @code{ifneq}, you usually want a string of +just whitespace to match the empty string (@pxref{Conditionals}). + +Thus, the following may fail to have the desired results: + +@example +.PHONY: all +ifneq "$(needs_made)" "" +all: $(needs_made) +else +all:;@@echo 'Nothing to make!' +endif +@end example + +@noindent +Replacing the variable reference @w{@samp{$(needs_made)}} with the +function call @w{@samp{$(strip $(needs_made))}} in the @code{ifneq} +directive would make it more robust.@refill + +@item $(findstring @var{find},@var{in}) +@findex findstring +@cindex searching for strings +@cindex finding strings +@cindex strings, searching for +Searches @var{in} for an occurrence of @var{find}. If it occurs, the +value is @var{find}; otherwise, the value is empty. You can use this +function in a conditional to test for the presence of a specific +substring in a given string. Thus, the two examples, + +@example +$(findstring a,a b c) +$(findstring a,b c) +@end example + +@noindent +produce the values @samp{a} and @samp{} (the empty string), +respectively. @xref{Testing Flags}, for a practical application of +@code{findstring}.@refill + +@need 750 +@findex filter +@cindex filtering words +@cindex words, filtering +@item $(filter @var{pattern}@dots{},@var{text}) +Returns all whitespace-separated words in @var{text} that @emph{do} match +any of the @var{pattern} words, removing any words that @emph{do not} +match. The patterns are written using @samp{%}, just like the patterns +used in the @code{patsubst} function above.@refill + +The @code{filter} function can be used to separate out different types +of strings (such as file names) in a variable. For example: + +@example +sources := foo.c bar.c baz.s ugh.h +foo: $(sources) + cc $(filter %.c %.s,$(sources)) -o foo +@end example + +@noindent +says that @file{foo} depends of @file{foo.c}, @file{bar.c}, +@file{baz.s} and @file{ugh.h} but only @file{foo.c}, @file{bar.c} and +@file{baz.s} should be specified in the command to the +compiler.@refill + +@item $(filter-out @var{pattern}@dots{},@var{text}) +@findex filter-out +@cindex filtering out words +@cindex words, filtering out +Returns all whitespace-separated words in @var{text} that @emph{do not} +match any of the @var{pattern} words, removing the words that @emph{do} +match one or more. This is the exact opposite of the @code{filter} +function.@refill + +For example, given: + +@example +@group +objects=main1.o foo.o main2.o bar.o +mains=main1.o main2.o +@end group +@end example + +@noindent +the following generates a list which contains all the object files not +in @samp{mains}: + +@example +$(filter-out $(mains),$(objects)) +@end example + +@need 1500 +@findex sort +@cindex sorting words +@item $(sort @var{list}) +Sorts the words of @var{list} in lexical order, removing duplicate +words. The output is a list of words separated by single spaces. +Thus, + +@example +$(sort foo bar lose) +@end example + +@noindent +returns the value @samp{bar foo lose}. + +@cindex removing duplicate words +@cindex duplicate words, removing +@cindex words, removing duplicates +Incidentally, since @code{sort} removes duplicate words, you can use +it for this purpose even if you don't care about the sort order. + +@item $(word @var{n},@var{text}) +@findex word +@cindex word, selecting a +@cindex selecting a word +Returns the @var{n}th word of @var{text}. The legitimate values of +@var{n} start from 1. If @var{n} is bigger than the number of words +in @var{text}, the value is empty. For example, + +@example +$(word 2, foo bar baz) +@end example + +@noindent +returns @samp{bar}. + +@item $(wordlist @var{s},@var{e},@var{text}) +@findex wordlist +@cindex words, selecting lists of +@cindex selecting word lists +Returns the list of words in @var{text} starting with word @var{s} and +ending with word @var{e} (inclusive). The legitimate values of @var{s} +start from 1; @var{e} may start from 0. If @var{s} is bigger than the +number of words in @var{text}, the value is empty. If @var{e} is +bigger than the number of words in @var{text}, words up to the end of +@var{text} are returned. If @var{s} is greater than @var{e}, nothing +is returned. For example, + +@example +$(wordlist 2, 3, foo bar baz) +@end example + +@noindent +returns @samp{bar baz}. + +@c Following item phrased to prevent overfull hbox. --RJC 17 Jul 92 +@item $(words @var{text}) +@findex words +@cindex words, finding number +Returns the number of words in @var{text}. +Thus, the last word of @var{text} is +@w{@code{$(word $(words @var{text}),@var{text})}}.@refill + +@item $(firstword @var{names}@dots{}) +@findex firstword +@cindex words, extracting first +The argument @var{names} is regarded as a series of names, separated +by whitespace. The value is the first name in the series. The rest +of the names are ignored. + +For example, + +@example +$(firstword foo bar) +@end example + +@noindent +produces the result @samp{foo}. Although @code{$(firstword +@var{text})} is the same as @code{$(word 1,@var{text})}, the +@code{firstword} function is retained for its simplicity.@refill + + +@item $(lastword @var{names}@dots{}) +@findex lastword +@cindex words, extracting last +The argument @var{names} is regarded as a series of names, separated +by whitespace. The value is the last name in the series. + +For example, + +@example +$(lastword foo bar) +@end example + +@noindent +produces the result @samp{bar}. Although @code{$(lastword +@var{text})} is the same as @code{$(word $(words @var{text}),@var{text})}, +the @code{lastword} function was added for its simplicity and better +performance.@refill +@end table + + +Here is a realistic example of the use of @code{subst} and +@code{patsubst}. Suppose that a makefile uses the @code{VPATH} variable +to specify a list of directories that @code{make} should search for +prerequisite files +(@pxref{General Search, , @code{VPATH} Search Path for All Prerequisites}). +This example shows how to +tell the C compiler to search for header files in the same list of +directories.@refill + +The value of @code{VPATH} is a list of directories separated by colons, +such as @samp{src:../headers}. First, the @code{subst} function is used to +change the colons to spaces: + +@example +$(subst :, ,$(VPATH)) +@end example + +@noindent +This produces @samp{src ../headers}. Then @code{patsubst} is used to turn +each directory name into a @samp{-I} flag. These can be added to the +value of the variable @code{CFLAGS}, which is passed automatically to the C +compiler, like this: + +@example +override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH))) +@end example + +@noindent +The effect is to append the text @samp{-Isrc -I../headers} to the +previously given value of @code{CFLAGS}. The @code{override} directive is +used so that the new value is assigned even if the previous value of +@code{CFLAGS} was specified with a command argument (@pxref{Override +Directive, , The @code{override} Directive}). + +@node File Name Functions, Conditional Functions, Text Functions, Functions +@section Functions for File Names +@cindex functions, for file names +@cindex file name functions + +Several of the built-in expansion functions relate specifically to +taking apart file names or lists of file names. + +Each of the following functions performs a specific transformation on a +file name. The argument of the function is regarded as a series of file +names, separated by whitespace. (Leading and trailing whitespace is +ignored.) Each file name in the series is transformed in the same way and +the results are concatenated with single spaces between them. + +@table @code +@item $(dir @var{names}@dots{}) +@findex dir +@cindex directory part +@cindex file name, directory part +Extracts the directory-part of each file name in @var{names}. The +directory-part of the file name is everything up through (and +including) the last slash in it. If the file name contains no slash, +the directory part is the string @samp{./}. For example, + +@example +$(dir src/foo.c hacks) +@end example + +@noindent +produces the result @samp{src/ ./}. + +@item $(notdir @var{names}@dots{}) +@findex notdir +@cindex file name, nondirectory part +@cindex nondirectory part +Extracts all but the directory-part of each file name in @var{names}. +If the file name contains no slash, it is left unchanged. Otherwise, +everything through the last slash is removed from it. + +A file name that ends with a slash becomes an empty string. This is +unfortunate, because it means that the result does not always have the +same number of whitespace-separated file names as the argument had; +but we do not see any other valid alternative. + +For example, + +@example +$(notdir src/foo.c hacks) +@end example + +@noindent +produces the result @samp{foo.c hacks}. + +@item $(suffix @var{names}@dots{}) +@findex suffix +@cindex suffix, function to find +@cindex file name suffix +Extracts the suffix of each file name in @var{names}. If the file name +contains a period, the suffix is everything starting with the last +period. Otherwise, the suffix is the empty string. This frequently +means that the result will be empty when @var{names} is not, and if +@var{names} contains multiple file names, the result may contain fewer +file names. + +For example, + +@example +$(suffix src/foo.c src-1.0/bar.c hacks) +@end example + +@noindent +produces the result @samp{.c .c}. + +@item $(basename @var{names}@dots{}) +@findex basename +@cindex basename +@cindex file name, basename of +Extracts all but the suffix of each file name in @var{names}. If the +file name contains a period, the basename is everything starting up to +(and not including) the last period. Periods in the directory part are +ignored. If there is no period, the basename is the entire file name. +For example, + +@example +$(basename src/foo.c src-1.0/bar hacks) +@end example + +@noindent +produces the result @samp{src/foo src-1.0/bar hacks}. + +@c plural convention with dots (be consistent) +@item $(addsuffix @var{suffix},@var{names}@dots{}) +@findex addsuffix +@cindex suffix, adding +@cindex file name suffix, adding +The argument @var{names} is regarded as a series of names, separated +by whitespace; @var{suffix} is used as a unit. The value of +@var{suffix} is appended to the end of each individual name and the +resulting larger names are concatenated with single spaces between +them. For example, + +@example +$(addsuffix .c,foo bar) +@end example + +@noindent +produces the result @samp{foo.c bar.c}. + +@item $(addprefix @var{prefix},@var{names}@dots{}) +@findex addprefix +@cindex prefix, adding +@cindex file name prefix, adding +The argument @var{names} is regarded as a series of names, separated +by whitespace; @var{prefix} is used as a unit. The value of +@var{prefix} is prepended to the front of each individual name and the +resulting larger names are concatenated with single spaces between +them. For example, + +@example +$(addprefix src/,foo bar) +@end example + +@noindent +produces the result @samp{src/foo src/bar}. + +@item $(join @var{list1},@var{list2}) +@findex join +@cindex joining lists of words +@cindex words, joining lists +Concatenates the two arguments word by word: the two first words (one +from each argument) concatenated form the first word of the result, the +two second words form the second word of the result, and so on. So the +@var{n}th word of the result comes from the @var{n}th word of each +argument. If one argument has more words that the other, the extra +words are copied unchanged into the result. + +For example, @samp{$(join a b,.c .o)} produces @samp{a.c b.o}. + +Whitespace between the words in the lists is not preserved; it is +replaced with a single space. + +This function can merge the results of the @code{dir} and +@code{notdir} functions, to produce the original list of files which +was given to those two functions.@refill + +@item $(wildcard @var{pattern}) +@findex wildcard +@cindex wildcard, function +The argument @var{pattern} is a file name pattern, typically containing +wildcard characters (as in shell file name patterns). The result of +@code{wildcard} is a space-separated list of the names of existing files +that match the pattern. +@xref{Wildcards, ,Using Wildcard Characters in File Names}. + +@item $(realpath @var{names}@dots{}) +@findex realpath +@cindex realpath +@cindex file name, realpath of +For each file name in @var{names} return the canonical absolute name. +A canonical name does not contain any @code{.} or @code{..} components, +nor any repeated path separators (@code{/}) or symlinks. In case of a +failure the empty string is returned. Consult the @code{realpath(3)} +documentation for a list of possible failure causes. + +@item $(abspath @var{names}@dots{}) +@findex abspath +@cindex abspath +@cindex file name, abspath of +For each file name in @var{names} return an absolute name that does +not contain any @code{.} or @code{..} components, nor any repeated path +separators (@code{/}). Note that, in contrast to @code{realpath} +function, @code{abspath} does not resolve symlinks and does not require +the file names to refer to an existing file or directory. Use the +@code{wildcard} function to test for existence. +@end table + +@node Conditional Functions, Foreach Function, File Name Functions, Functions +@section Functions for Conditionals +@findex if +@cindex conditional expansion +There are three functions that provide conditional expansion. A key +aspect of these functions is that not all of the arguments are +expanded initially. Only those arguments which need to be expanded, +will be expanded. + +@table @code +@item $(if @var{condition},@var{then-part}[,@var{else-part}]) +@findex if +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})). + +The first argument, @var{condition}, first has all preceding and +trailing whitespace stripped, then is expanded. If it expands to any +non-empty string, then the condition is considered to be true. If it +expands to an empty string, the condition is considered to be false. + +If the condition is true then the second argument, @var{then-part}, is +evaluated and this is used as the result of the evaluation of the entire +@code{if} function. + +If the condition is false then the third argument, @var{else-part}, is +evaluated and this is the result of the @code{if} function. If there is +no third argument, the @code{if} function evaluates to nothing (the +empty string). + +Note that only one of the @var{then-part} or the @var{else-part} will be +evaluated, never both. Thus, either can contain side-effects (such as +@code{shell} function calls, etc.) + +@item $(or @var{condition1}[,@var{condition2}[,@var{condition3}@dots{}]]) +@findex or +The @code{or} function provides a ``short-circuiting'' OR operation. +Each argument is expanded, in order. If an argument expands to a +non-empty string the processing stops and the result of the expansion +is that string. If, after all arguments are expanded, all of them are +false (empty), then the result of the expansion is the empty string. + +@item $(and @var{condition1}[,@var{condition2}[,@var{condition3}@dots{}]]) +@findex and +The @code{and} function provides a ``short-circuiting'' AND operation. +Each argument is expanded, in order. If an argument expands to an +empty string the processing stops and the result of the expansion is +the empty string. If all arguments expand to a non-empty string then +the result of the expansion is the expansion of the last argument. + +@end table + +@node Foreach Function, File Function, Conditional Functions, Functions +@section The @code{foreach} Function +@findex foreach +@cindex words, iterating over + +The @code{foreach} function is very different from other functions. It +causes one piece of text to be used repeatedly, each time with a different +substitution performed on it. It resembles the @code{for} command in the +shell @code{sh} and the @code{foreach} command in the C-shell @code{csh}. + +The syntax of the @code{foreach} function is: + +@example +$(foreach @var{var},@var{list},@var{text}) +@end example + +@noindent +The first two arguments, @var{var} and @var{list}, are expanded before +anything else is done; note that the last argument, @var{text}, is +@strong{not} expanded at the same time. Then for each word of the expanded +value of @var{list}, the variable named by the expanded value of @var{var} +is set to that word, and @var{text} is expanded. Presumably @var{text} +contains references to that variable, so its expansion will be different +each time. + +The result is that @var{text} is expanded as many times as there are +whitespace-separated words in @var{list}. The multiple expansions of +@var{text} are concatenated, with spaces between them, to make the result +of @code{foreach}. + +This simple example sets the variable @samp{files} to the list of all files +in the directories in the list @samp{dirs}: + +@example +dirs := a b c d +files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)) +@end example + +Here @var{text} is @samp{$(wildcard $(dir)/*)}. The first repetition +finds the value @samp{a} for @code{dir}, so it produces the same result +as @samp{$(wildcard a/*)}; the second repetition produces the result +of @samp{$(wildcard b/*)}; and the third, that of @samp{$(wildcard c/*)}. + +This example has the same result (except for setting @samp{dirs}) as +the following example: + +@example +files := $(wildcard a/* b/* c/* d/*) +@end example + +When @var{text} is complicated, you can improve readability by giving it +a name, with an additional variable: + +@example +find_files = $(wildcard $(dir)/*) +dirs := a b c d +files := $(foreach dir,$(dirs),$(find_files)) +@end example + +@noindent +Here we use the variable @code{find_files} this way. We use plain @samp{=} +to define a recursively-expanding variable, so that its value contains an +actual function call to be re-expanded under the control of @code{foreach}; +a simply-expanded variable would not do, since @code{wildcard} would be +called only once at the time of defining @code{find_files}. + +The @code{foreach} function has no permanent effect on the variable +@var{var}; its value and flavor after the @code{foreach} function call are +the same as they were beforehand. The other values which are taken from +@var{list} are in effect only temporarily, during the execution of +@code{foreach}. The variable @var{var} is a simply-expanded variable +during the execution of @code{foreach}. If @var{var} was undefined +before the @code{foreach} function call, it is undefined after the call. +@xref{Flavors, ,The Two Flavors of Variables}.@refill + +You must take care when using complex variable expressions that result in +variable names because many strange things are valid variable names, but +are probably not what you intended. For example, + +@smallexample +files := $(foreach Esta-escrito-en-espanol!,b c ch,$(find_files)) +@end smallexample + +@noindent +might be useful if the value of @code{find_files} references the variable +whose name is @samp{Esta-escrito-en-espanol!} (es un nombre bastante largo, +no?), but it is more likely to be a mistake. + +@node File Function, Call Function, Foreach Function, Functions +@section The @code{file} Function +@findex file +@cindex writing to a file +@cindex file, writing to +@cindex reading from a file +@cindex file, reading from + +The @code{file} function allows the makefile to write to or read from +a file. Two modes of writing are supported: overwrite, where the text +is written to the beginning of the file and any existing content is +lost, and append, where the text is written to the end of the file, +preserving the existing content. In both cases the file is created if +it does not exist. It is a fatal error if the file cannot be opened +for writing, or if the write operation fails. The @code{file} +function expands to the empty string when writing to a file. + +When reading from a file, the @code{file} function expands to the +verbatim contents of the file, except that the final newline (if there +is one) will be stripped. Attempting to read from a non-existent file +expands to the empty string. + +The syntax of the @code{file} function is: + +@example +$(file @var{op} @var{filename}[,@var{text}]) +@end example + +When the @code{file} function is evaluated all its arguments are +expanded first, then the file indicated by @var{filename} will be +opened in the mode described by @var{op}. + +The operator @var{op} can be @code{>} to indicate the file will be +overwritten with new content, @code{>>} to indicate the current +contents of the file will be appended to, or @code{<} to indicate the +contents of the file will be read in. The @var{filename} specifies +the file to be written to or read from. There may optionally be +whitespace between the operator and the file name. + +When reading files, it is an error to provide a @var{text} value. + +When writing files, @var{text} will be written to the file. If +@var{text} does not already end in a newline a final newline will be +written (even if @var{text} is the empty string). If the @var{text} +argument is not given at all, nothing will be written. + +For example, the @code{file} function can be useful if your build +system has a limited command line size and your recipe runs a command +that can accept arguments from a file as well. Many commands use the +convention that an argument prefixed with an @code{@@} specifies a +file containing more arguments. Then you might write your recipe in +this way: + +@example +@group +program: $(OBJECTS) + $(file >$@@.in,$^) + $(CMD) $(CMDFLAGS) @@$@@.in + @@rm $@@.in +@end group +@end example + +If the command required each argument to be on a separate line of the +input file, you might write your recipe like this: + +@example +@group +program: $(OBJECTS) + $(file >$@@.in) $(foreach O,$^,$(file >>$@@.in,$O)) + $(CMD) $(CMDFLAGS) @@$@@.in + @@rm $@@.in +@end group +@end example + +@node Call Function, Value Function, File Function, Functions +@section The @code{call} Function +@findex call +@cindex functions, user defined +@cindex user defined functions + +The @code{call} function is unique in that it can be used to create new +parameterized functions. You can write a complex expression as the +value of a variable, then use @code{call} to expand it with different +values. + +The syntax of the @code{call} function is: + +@example +$(call @var{variable},@var{param},@var{param},@dots{}) +@end example + +When @code{make} expands this function, it assigns each @var{param} to +temporary variables @code{$(1)}, @code{$(2)}, etc. The variable +@code{$(0)} will contain @var{variable}. There is no maximum number of +parameter arguments. There is no minimum, either, but it doesn't make +sense to use @code{call} with no parameters. + +Then @var{variable} is expanded as a @code{make} variable in the context +of these temporary assignments. Thus, any reference to @code{$(1)} in +the value of @var{variable} will resolve to the first @var{param} in the +invocation of @code{call}. + +Note that @var{variable} is the @emph{name} of a variable, not a +@emph{reference} to that variable. Therefore you would not normally use +a @samp{$} or parentheses when writing it. (You can, however, use a +variable reference in the name if you want the name not to be a +constant.) + +If @var{variable} is the name of a built-in function, the built-in function +is always invoked (even if a @code{make} variable by that name also +exists). + +The @code{call} function expands the @var{param} arguments before +assigning them to temporary variables. This means that @var{variable} +values containing references to built-in functions that have special +expansion rules, like @code{foreach} or @code{if}, may not work as you +expect. + +Some examples may make this clearer. + +This macro simply reverses its arguments: + +@smallexample +reverse = $(2) $(1) + +foo = $(call reverse,a,b) +@end smallexample + +@noindent +Here @var{foo} will contain @samp{b a}. + +This one is slightly more interesting: it defines a macro to search for +the first instance of a program in @code{PATH}: + +@smallexample +pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH))))) + +LS := $(call pathsearch,ls) +@end smallexample + +@noindent +Now the variable LS contains @code{/bin/ls} or similar. + +The @code{call} function can be nested. Each recursive invocation gets +its own local values for @code{$(1)}, etc.@: that mask the values of +higher-level @code{call}. For example, here is an implementation of a +@dfn{map} function: + +@smallexample +map = $(foreach a,$(2),$(call $(1),$(a))) +@end smallexample + +Now you can @var{map} a function that normally takes only one argument, +such as @code{origin}, to multiple values in one step: + +@smallexample +o = $(call map,origin,o map MAKE) +@end smallexample + +and end up with @var{o} containing something like @samp{file file default}. + +A final caution: be careful when adding whitespace to the arguments to +@code{call}. As with other functions, any whitespace contained in the +second and subsequent arguments is kept; this can cause strange +effects. It's generally safest to remove all extraneous whitespace when +providing parameters to @code{call}. + +@node Value Function, Eval Function, Call Function, Functions +@comment node-name, next, previous, up +@section The @code{value} Function +@findex value +@cindex variables, unexpanded value + +The @code{value} function provides a way for you to use the value of a +variable @emph{without} having it expanded. Please note that this +does not undo expansions which have already occurred; for example if +you create a simply expanded variable its value is expanded during the +definition; in that case the @code{value} function will return the +same result as using the variable directly. + +The syntax of the @code{value} function is: + +@example +$(value @var{variable}) +@end example + +Note that @var{variable} is the @emph{name} of a variable, not a +@emph{reference} to that variable. Therefore you would not normally +use a @samp{$} or parentheses when writing it. (You can, however, use +a variable reference in the name if you want the name not to be a +constant.) + +The result of this function is a string containing the value of +@var{variable}, without any expansion occurring. For example, in this +makefile: + +@example +@group +FOO = $PATH + +all: + @@echo $(FOO) + @@echo $(value FOO) +@end group +@end example + +@noindent +The first output line would be @code{ATH}, since the ``$P'' would be +expanded as a @code{make} variable, while the second output line would +be the current value of your @code{$PATH} environment variable, since +the @code{value} function avoided the expansion. + +The @code{value} function is most often used in conjunction with the +@code{eval} function (@pxref{Eval Function}). + +@node Eval Function, Origin Function, Value Function, Functions +@comment node-name, next, previous, up +@section The @code{eval} Function +@findex eval +@cindex evaluating makefile syntax +@cindex makefile syntax, evaluating + +The @code{eval} function is very special: it allows you to define new +makefile constructs that are not constant; which are the result of +evaluating other variables and functions. The argument to the +@code{eval} function is expanded, then the results of that expansion +are parsed as makefile syntax. The expanded results can define new +@code{make} variables, targets, implicit or explicit rules, etc. + +The result of the @code{eval} function is always the empty string; +thus, it can be placed virtually anywhere in a makefile without +causing syntax errors. + +It's important to realize that the @code{eval} argument is expanded +@emph{twice}; first by the @code{eval} function, then the results of +that expansion are expanded again when they are parsed as makefile +syntax. This means you may need to provide extra levels of escaping +for ``$'' characters when using @code{eval}. The @code{value} +function (@pxref{Value Function}) can sometimes be useful in these +situations, to circumvent unwanted expansions. + +Here is an example of how @code{eval} can be used; this example +combines a number of concepts and other functions. Although it might +seem overly complex to use @code{eval} in this example, rather than +just writing out the rules, consider two things: first, the template +definition (in @code{PROGRAM_template}) could need to be much more +complex than it is here; and second, you might put the complex, +``generic'' part of this example into another makefile, then include +it in all the individual makefiles. Now your individual makefiles are +quite straightforward. + +@example +@group +PROGRAMS = server client + +server_OBJS = server.o server_priv.o server_access.o +server_LIBS = priv protocol + +client_OBJS = client.o client_api.o client_mem.o +client_LIBS = protocol + +# Everything after this is generic + +.PHONY: all +all: $(PROGRAMS) + +define PROGRAM_template = + $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) + ALL_OBJS += $$($(1)_OBJS) +endef + +$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog)))) + +$(PROGRAMS): + $(LINK.o) $^ $(LDLIBS) -o $@@ + +clean: + rm -f $(ALL_OBJS) $(PROGRAMS) +@end group +@end example + +@node Origin Function, Flavor Function, Eval Function, Functions +@section The @code{origin} Function +@findex origin +@cindex variables, origin of +@cindex origin of variable + +The @code{origin} function is unlike most other functions in that it does +not operate on the values of variables; it tells you something @emph{about} +a variable. Specifically, it tells you where it came from. + +The syntax of the @code{origin} function is: + +@example +$(origin @var{variable}) +@end example + +Note that @var{variable} is the @emph{name} of a variable to inquire about, +not a @emph{reference} to that variable. Therefore you would not normally +use a @samp{$} or parentheses when writing it. (You can, however, use a +variable reference in the name if you want the name not to be a constant.) + +The result of this function is a string telling you how the variable +@var{variable} was defined: + +@table @samp +@item undefined + +if @var{variable} was never defined. + +@item default + +if @var{variable} has a default definition, as is usual with @code{CC} +and so on. @xref{Implicit Variables, ,Variables Used by Implicit Rules}. +Note that if you have redefined a default variable, the @code{origin} +function will return the origin of the later definition. + +@item environment + +if @var{variable} was inherited from the environment provided to +@code{make}. + +@item environment override + +if @var{variable} was inherited from the environment provided to +@code{make}, and is overriding a setting for @var{variable} in the +makefile as a result of the @w{@samp{-e}} option (@pxref{Options +Summary, ,Summary of Options}).@refill + +@item file + +if @var{variable} was defined in a makefile. + +@item command line + +if @var{variable} was defined on the command line. + +@item override + +if @var{variable} was defined with an @code{override} directive in a +makefile (@pxref{Override Directive, ,The @code{override} Directive}). + +@item automatic + +if @var{variable} is an automatic variable defined for the execution +of the recipe for each rule (@pxref{Automatic Variables}). +@end table + +This information is primarily useful (other than for your curiosity) to +determine if you want to believe the value of a variable. For example, +suppose you have a makefile @file{foo} that includes another makefile +@file{bar}. You want a variable @code{bletch} to be defined in @file{bar} +if you run the command @w{@samp{make -f bar}}, even if the environment contains +a definition of @code{bletch}. However, if @file{foo} defined +@code{bletch} before including @file{bar}, you do not want to override that +definition. This could be done by using an @code{override} directive in +@file{foo}, giving that definition precedence over the later definition in +@file{bar}; unfortunately, the @code{override} directive would also +override any command line definitions. So, @file{bar} could +include:@refill + +@example +@group +ifdef bletch +ifeq "$(origin bletch)" "environment" +bletch = barf, gag, etc. +endif +endif +@end group +@end example + +@noindent +If @code{bletch} has been defined from the environment, this will redefine +it. + +If you want to override a previous definition of @code{bletch} if it came +from the environment, even under @samp{-e}, you could instead write: + +@example +@group +ifneq "$(findstring environment,$(origin bletch))" "" +bletch = barf, gag, etc. +endif +@end group +@end example + +Here the redefinition takes place if @samp{$(origin bletch)} returns either +@samp{environment} or @samp{environment override}. +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@node Flavor Function, Make Control Functions, Origin Function, Functions +@section The @code{flavor} Function +@findex flavor +@cindex variables, flavor of +@cindex flavor of variable + +The @code{flavor} function, like the @code{origin} function, does not +operate on the values of variables but rather it tells you something +@emph{about} a variable. Specifically, it tells you the flavor of a +variable (@pxref{Flavors, ,The Two Flavors of Variables}). + +The syntax of the @code{flavor} function is: + +@example +$(flavor @var{variable}) +@end example + +Note that @var{variable} is the @emph{name} of a variable to inquire about, +not a @emph{reference} to that variable. Therefore you would not normally +use a @samp{$} or parentheses when writing it. (You can, however, use a +variable reference in the name if you want the name not to be a constant.) + +The result of this function is a string that identifies the flavor of the +variable @var{variable}: + +@table @samp +@item undefined + +if @var{variable} was never defined. + +@item recursive + +if @var{variable} is a recursively expanded variable. + +@item simple + +if @var{variable} is a simply expanded variable. + +@end table + +@node Make Control Functions, Shell Function, Flavor Function, Functions +@section Functions That Control Make +@cindex functions, for controlling make +@cindex controlling make + +These functions control the way make runs. Generally, they are used to +provide information to the user of the makefile or to cause make to stop +if some sort of environmental error is detected. + +@table @code +@item $(error @var{text}@dots{}) +@findex error +@cindex error, stopping on +@cindex stopping make +Generates a fatal error where the message is @var{text}. Note that +the error is generated whenever this function is evaluated. So, if +you put it inside a recipe or on the right side of a recursive +variable assignment, it won't be evaluated until later. The +@var{text} will be expanded before the error is generated. + +For example, + +@example +ifdef ERROR1 +$(error error is $(ERROR1)) +endif +@end example + +@noindent +will generate a fatal error during the read of the makefile if the +@code{make} variable @code{ERROR1} is defined. Or, + +@example +ERR = $(error found an error!) + +.PHONY: err +err: ; $(ERR) +@end example + +@noindent +will generate a fatal error while @code{make} is running, if the +@code{err} target is invoked. + +@item $(warning @var{text}@dots{}) +@findex warning +@cindex warnings, printing +@cindex printing user warnings +This function works similarly to the @code{error} function, above, +except that @code{make} doesn't exit. Instead, @var{text} is expanded +and the resulting message is displayed, but processing of the makefile +continues. + +The result of the expansion of this function is the empty string. + +@item $(info @var{text}@dots{}) +@findex info +@cindex printing messages +This function does nothing more than print its (expanded) argument(s) +to standard output. No makefile name or line number is added. The +result of the expansion of this function is the empty string. +@end table + +@node Shell Function, Guile Function, Make Control Functions, Functions +@section The @code{shell} Function +@findex shell +@cindex command expansion +@cindex backquotes +@cindex shell command, function for + +The @code{shell} function is unlike any other function other than the +@code{wildcard} function +(@pxref{Wildcard Function, ,The Function @code{wildcard}}) in that it +communicates with the world outside of @code{make}. + +The @code{shell} function performs the same function that backquotes +(@samp{`}) perform in most shells: it does @dfn{command expansion}. +This means that it takes as an argument a shell command and evaluates +to the output of the command. The only processing @code{make} does on +the result is to convert each newline (or carriage-return / newline +pair) to a single space. If there is a trailing (carriage-return +and) newline it will simply be removed.@refill + +The commands run by calls to the @code{shell} function are run when the +function calls are expanded (@pxref{Reading Makefiles, , How +@code{make} Reads a Makefile}). Because this function involves +spawning a new shell, you should carefully consider the performance +implications of using the @code{shell} function within recursively +expanded variables vs.@: simply expanded variables (@pxref{Flavors, ,The +Two Flavors of Variables}). + +@vindex .SHELLSTATUS +After the @code{shell} function or @samp{!=} assignment operator is +used, its exit status is placed in the @code{.SHELLSTATUS} variable. + +Here are some examples of the use of the @code{shell} function: + +@example +contents := $(shell cat foo) +@end example + +@noindent +sets @code{contents} to the contents of the file @file{foo}, with a space +(rather than a newline) separating each line. + +@example +files := $(shell echo *.c) +@end example + +@noindent +sets @code{files} to the expansion of @samp{*.c}. Unless @code{make} is +using a very strange shell, this has the same result as +@w{@samp{$(wildcard *.c)}} (as long as at least one @samp{.c} file +exists).@refill + +@node Guile Function, , Shell Function, Functions +@section The @code{guile} Function +@findex guile +@cindex Guile + +If GNU @code{make} is built with support for GNU Guile as an embedded +extension language then the @code{guile} function will be available. +The @code{guile} function takes one argument which is first expanded +by @code{make} in the normal fashion, then passed to the GNU Guile +evaluator. The result of the evaluator is converted into a string and +used as the expansion of the @code{guile} function in the makefile. +See @ref{Guile Integration, ,GNU Guile Integration} for details on +writing extensions to @code{make} in Guile. + +You can determine whether GNU Guile support is available by checking +the @code{.FEATURES} variable for the word @var{guile}. + +@node Running, Implicit Rules, Functions, Top +@chapter How to Run @code{make} + +A makefile that says how to recompile a program can be used in more +than one way. The simplest use is to recompile every file that is out +of date. Usually, makefiles are written so that if you run +@code{make} with no arguments, it does just that. + +But you might want to update only some of the files; you might want to use +a different compiler or different compiler options; you might want just to +find out which files are out of date without changing them. + +By giving arguments when you run @code{make}, you can do any of these +things and many others. + +@cindex exit status of make +The exit status of @code{make} is always one of three values: +@table @code +@item 0 +The exit status is zero if @code{make} is successful. +@item 2 +The exit status is two if @code{make} encounters any errors. +It will print messages describing the particular errors. +@item 1 +The exit status is one if you use the @samp{-q} flag and @code{make} +determines that some target is not already up to date. +@xref{Instead of Execution, ,Instead of Executing Recipes}. +@end table + +@menu +* Makefile Arguments:: How to specify which makefile to use. +* Goals:: How to use goal arguments to specify which + parts of the makefile to use. +* Instead of Execution:: How to use mode flags to specify what + kind of thing to do with the recipes + in the makefile other than simply + execute them. +* Avoiding Compilation:: How to avoid recompiling certain files. +* Overriding:: How to override a variable to specify + an alternate compiler and other things. +* Testing:: How to proceed past some errors, to + test compilation. +* Options Summary:: Summary of Options +@end menu + +@node Makefile Arguments, Goals, Running, Running +@section Arguments to Specify the Makefile +@cindex @code{--file} +@cindex @code{--makefile} +@cindex @code{-f} + +The way to specify the name of the makefile is with the @samp{-f} or +@samp{--file} option (@samp{--makefile} also works). For example, +@samp{-f altmake} says to use the file @file{altmake} as the makefile. + +If you use the @samp{-f} flag several times and follow each @samp{-f} +with an argument, all the specified files are used jointly as +makefiles. + +If you do not use the @samp{-f} or @samp{--file} flag, the default is +to try @file{GNUmakefile}, @file{makefile}, and @file{Makefile}, in +that order, and use the first of these three which exists or can be made +(@pxref{Makefiles, ,Writing Makefiles}).@refill + +@node Goals, Instead of Execution, Makefile Arguments, Running +@section Arguments to Specify the Goals +@cindex goal, how to specify + +The @dfn{goals} are the targets that @code{make} should strive ultimately +to update. Other targets are updated as well if they appear as +prerequisites of goals, or prerequisites of prerequisites of goals, etc. + +By default, the goal is the first target in the makefile (not counting +targets that start with a period). Therefore, makefiles are usually +written so that the first target is for compiling the entire program or +programs they describe. If the first rule in the makefile has several +targets, only the first target in the rule becomes the default goal, not +the whole list. You can manage the selection of the default goal from +within your makefile using the @code{.DEFAULT_GOAL} variable +(@pxref{Special Variables, , Other Special Variables}). + +You can also specify a different goal or goals with command line +arguments to @code{make}. Use the name of the goal as an argument. +If you specify several goals, @code{make} processes each of them in +turn, in the order you name them. + +Any target in the makefile may be specified as a goal (unless it +starts with @samp{-} or contains an @samp{=}, in which case it will be +parsed as a switch or variable definition, respectively). Even +targets not in the makefile may be specified, if @code{make} can find +implicit rules that say how to make them. + +@vindex MAKECMDGOALS +@code{Make} will set the special variable @code{MAKECMDGOALS} to the +list of goals you specified on the command line. If no goals were given +on the command line, this variable is empty. Note that this variable +should be used only in special circumstances. + +An example of appropriate use is to avoid including @file{.d} files +during @code{clean} rules (@pxref{Automatic Prerequisites}), so +@code{make} won't create them only to immediately remove them +again:@refill + +@example +@group +sources = foo.c bar.c + +ifneq ($(MAKECMDGOALS),clean) +include $(sources:.c=.d) +endif +@end group +@end example + +One use of specifying a goal is if you want to compile only a part of +the program, or only one of several programs. Specify as a goal each +file that you wish to remake. For example, consider a directory containing +several programs, with a makefile that starts like this: + +@example +.PHONY: all +all: size nm ld ar as +@end example + +If you are working on the program @code{size}, you might want to say +@w{@samp{make size}} so that only the files of that program are recompiled. + +Another use of specifying a goal is to make files that are not normally +made. For example, there may be a file of debugging output, or a +version of the program that is compiled specially for testing, which has +a rule in the makefile but is not a prerequisite of the default goal. + +Another use of specifying a goal is to run the recipe associated with +a phony target (@pxref{Phony Targets}) or empty target (@pxref{Empty +Targets, ,Empty Target Files to Record Events}). Many makefiles contain +a phony target named @file{clean} which deletes everything except source +files. Naturally, this is done only if you request it explicitly with +@w{@samp{make clean}}. Following is a list of typical phony and empty +target names. @xref{Standard Targets}, for a detailed list of all the +standard target names which GNU software packages use. + +@table @file +@item all +@cindex @code{all} @r{(standard target)} +Make all the top-level targets the makefile knows about. + +@item clean +@cindex @code{clean} @r{(standard target)} +Delete all files that are normally created by running @code{make}. + +@item mostlyclean +@cindex @code{mostlyclean} @r{(standard target)} +Like @samp{clean}, but may refrain from deleting a few files that people +normally don't want to recompile. For example, the @samp{mostlyclean} +target for GCC does not delete @file{libgcc.a}, because recompiling it +is rarely necessary and takes a lot of time. + +@item distclean +@cindex @code{distclean} @r{(standard target)} +@itemx realclean +@cindex @code{realclean} @r{(standard target)} +@itemx clobber +@cindex @code{clobber} @r{(standard target)} +Any of these targets might be defined to delete @emph{more} files than +@samp{clean} does. For example, this would delete configuration files +or links that you would normally create as preparation for compilation, +even if the makefile itself cannot create these files. + +@item install +@cindex @code{install} @r{(standard target)} +Copy the executable file into a directory that users typically search +for commands; copy any auxiliary files that the executable uses into +the directories where it will look for them. + +@item print +@cindex @code{print} @r{(standard target)} +Print listings of the source files that have changed. + +@item tar +@cindex @code{tar} @r{(standard target)} +Create a tar file of the source files. + +@item shar +@cindex @code{shar} @r{(standard target)} +Create a shell archive (shar file) of the source files. + +@item dist +@cindex @code{dist} @r{(standard target)} +Create a distribution file of the source files. This might +be a tar file, or a shar file, or a compressed version of one of the +above, or even more than one of the above. + +@item TAGS +@cindex @code{TAGS} @r{(standard target)} +Update a tags table for this program. + +@item check +@cindex @code{check} @r{(standard target)} +@itemx test +@cindex @code{test} @r{(standard target)} +Perform self tests on the program this makefile builds. +@end table + +@node Instead of Execution, Avoiding Compilation, Goals, Running +@section Instead of Executing Recipes +@cindex execution, instead of +@cindex recipes, instead of executing + +The makefile tells @code{make} how to tell whether a target is up to date, +and how to update each target. But updating the targets is not always +what you want. Certain options specify other activities for @code{make}. + +@comment Extra blank lines make it print better. +@table @samp +@item -n +@itemx --just-print +@itemx --dry-run +@itemx --recon +@cindex @code{--just-print} +@cindex @code{--dry-run} +@cindex @code{--recon} +@cindex @code{-n} + +``No-op''. Causes @code{make} to print the recipes that are needed to +make the targets up to date, but not actually execute them. Note that +some recipes are still executed, even with this flag (@pxref{MAKE +Variable, ,How the @code{MAKE} Variable Works}). Also any recipes +needed to update included makefiles are still executed +(@pxref{Remaking Makefiles, ,How Makefiles Are Remade}). + +@item -t +@itemx --touch +@cindex @code{--touch} +@cindex touching files +@cindex target, touching +@cindex @code{-t} + +``Touch''. Marks targets as up to date without actually changing +them. In other words, @code{make} pretends to update the targets but +does not really change their contents; instead only their modified +times are updated. + +@item -q +@itemx --question +@cindex @code{--question} +@cindex @code{-q} +@cindex question mode + +``Question''. Silently check whether the targets are up to date, but +do not execute recipes; the exit code shows whether any updates are +needed. + +@item -W @var{file} +@itemx --what-if=@var{file} +@itemx --assume-new=@var{file} +@itemx --new-file=@var{file} +@cindex @code{--what-if} +@cindex @code{-W} +@cindex @code{--assume-new} +@cindex @code{--new-file} +@cindex what if +@cindex files, assuming new + +``What if''. Each @samp{-W} flag is followed by a file name. The given +files' modification times are recorded by @code{make} as being the present +time, although the actual modification times remain the same. +You can use the @samp{-W} flag in conjunction with the @samp{-n} flag +to see what would happen if you were to modify specific files.@refill +@end table + +With the @samp{-n} flag, @code{make} prints the recipe that it would +normally execute but usually does not execute it. + +With the @samp{-t} flag, @code{make} ignores the recipes in the rules +and uses (in effect) the command @code{touch} for each target that needs to +be remade. The @code{touch} command is also printed, unless @samp{-s} or +@code{.SILENT} is used. For speed, @code{make} does not actually invoke +the program @code{touch}. It does the work directly. + +With the @samp{-q} flag, @code{make} prints nothing and executes no +recipes, but the exit status code it returns is zero if and only if the +targets to be considered are already up to date. If the exit status is +one, then some updating needs to be done. If @code{make} encounters an +error, the exit status is two, so you can distinguish an error from a +target that is not up to date. + +It is an error to use more than one of these three flags in the same +invocation of @code{make}. + +@cindex +, and recipe execution +The @samp{-n}, @samp{-t}, and @samp{-q} options do not affect recipe +lines that begin with @samp{+} characters or contain the strings +@samp{$(MAKE)} or @samp{$@{MAKE@}}. Note that only the line containing +the @samp{+} character or the strings @samp{$(MAKE)} or @samp{$@{MAKE@}} +is run regardless of these options. Other lines in the same rule are +not run unless they too begin with @samp{+} or contain @samp{$(MAKE)} or +@samp{$@{MAKE@}} (@xref{MAKE Variable, ,How the @code{MAKE} Variable Works}.) + +@cindex phony targets and recipe execution +The @samp{-t} flag prevents phony targets (@pxref{Phony Targets}) from +being updated, unless there are recipe lines beginning with @samp{+} +or containing @samp{$(MAKE)} or @samp{$@{MAKE@}}. + +The @samp{-W} flag provides two features: + +@itemize @bullet +@item +If you also use the @samp{-n} or @samp{-q} flag, you can see what +@code{make} would do if you were to modify some files. + +@item +Without the @samp{-n} or @samp{-q} flag, when @code{make} is actually +executing recipes, the @samp{-W} flag can direct @code{make} to act as +if some files had been modified, without actually running the recipes +for those files.@refill +@end itemize + +Note that the options @samp{-p} and @samp{-v} allow you to obtain other +information about @code{make} or about the makefiles in use +(@pxref{Options Summary, ,Summary of Options}).@refill + +@node Avoiding Compilation, Overriding, Instead of Execution, Running +@section Avoiding Recompilation of Some Files +@cindex @code{-o} +@cindex @code{--old-file} +@cindex @code{--assume-old} +@cindex files, assuming old +@cindex files, avoiding recompilation of +@cindex recompilation, avoiding + +Sometimes you may have changed a source file but you do not want to +recompile all the files that depend on it. For example, suppose you add +a macro or a declaration to a header file that many other files depend +on. Being conservative, @code{make} assumes that any change in the +header file requires recompilation of all dependent files, but you know +that they do not need to be recompiled and you would rather not waste +the time waiting for them to compile. + +If you anticipate the problem before changing the header file, you can +use the @samp{-t} flag. This flag tells @code{make} not to run the +recipes in the rules, but rather to mark the target up to date by +changing its last-modification date. You would follow this procedure: + +@enumerate +@item +Use the command @samp{make} to recompile the source files that really +need recompilation, ensuring that the object files are up-to-date +before you begin. + +@item +Make the changes in the header files. + +@item +Use the command @samp{make -t} to mark all the object files as +up to date. The next time you run @code{make}, the changes in the +header files will not cause any recompilation. +@end enumerate + +If you have already changed the header file at a time when some files +do need recompilation, it is too late to do this. Instead, you can +use the @w{@samp{-o @var{file}}} flag, which marks a specified file as +``old'' (@pxref{Options Summary, ,Summary of Options}). This means +that the file itself will not be remade, and nothing else will be +remade on its account. Follow this procedure: + +@enumerate +@item +Recompile the source files that need compilation for reasons independent +of the particular header file, with @samp{make -o @var{headerfile}}. +If several header files are involved, use a separate @samp{-o} option +for each header file. + +@item +Touch all the object files with @samp{make -t}. +@end enumerate + +@node Overriding, Testing, Avoiding Compilation, Running +@section Overriding Variables +@cindex overriding variables with arguments +@cindex variables, overriding with arguments +@cindex command line variables +@cindex variables, command line + +An argument that contains @samp{=} specifies the value of a variable: +@samp{@var{v}=@var{x}} sets the value of the variable @var{v} to @var{x}. +If you specify a value in this way, all ordinary assignments of the same +variable in the makefile are ignored; we say they have been +@dfn{overridden} by the command line argument. + +The most common way to use this facility is to pass extra flags to +compilers. For example, in a properly written makefile, the variable +@code{CFLAGS} is included in each recipe that runs the C compiler, so a +file @file{foo.c} would be compiled something like this: + +@example +cc -c $(CFLAGS) foo.c +@end example + +Thus, whatever value you set for @code{CFLAGS} affects each compilation +that occurs. The makefile probably specifies the usual value for +@code{CFLAGS}, like this: + +@example +CFLAGS=-g +@end example + +Each time you run @code{make}, you can override this value if you +wish. For example, if you say @samp{make CFLAGS='-g -O'}, each C +compilation will be done with @samp{cc -c -g -O}. (This also +illustrates how you can use quoting in the shell to enclose spaces and +other special characters in the value of a variable when you override +it.) + +The variable @code{CFLAGS} is only one of many standard variables that +exist just so that you can change them this way. @xref{Implicit +Variables, , Variables Used by Implicit Rules}, for a complete list. + +You can also program the makefile to look at additional variables of your +own, giving the user the ability to control other aspects of how the +makefile works by changing the variables. + +When you override a variable with a command line argument, you can +define either a recursively-expanded variable or a simply-expanded +variable. The examples shown above make a recursively-expanded +variable; to make a simply-expanded variable, write @samp{:=} or +@samp{::=} instead of @samp{=}. But, unless you want to include a +variable reference or function call in the @emph{value} that you +specify, it makes no difference which kind of variable you create. + +There is one way that the makefile can change a variable that you have +overridden. This is to use the @code{override} directive, which is a line +that looks like this: @samp{override @var{variable} = @var{value}} +(@pxref{Override Directive, ,The @code{override} Directive}). + +@node Testing, Options Summary, Overriding, Running +@section Testing the Compilation of a Program +@cindex testing compilation +@cindex compilation, testing + +Normally, when an error happens in executing a shell command, @code{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 @code{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 @code{make} try compiling +every file that can be tried, to show you as many compilation errors +as possible. + +@cindex @code{-k} +@cindex @code{--keep-going} +On these occasions, you should use the @samp{-k} or +@samp{--keep-going} flag. This tells @code{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, @samp{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, @samp{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 @samp{-k}, it is a fatal error (@pxref{Options Summary, +,Summary of Options}).@refill + +The usual behavior of @code{make} assumes that your purpose is to get the +goals up to date; once @code{make} learns that this is impossible, it might +as well report the failure immediately. The @samp{-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' +@kbd{M-x compile} command passes the @samp{-k} flag by default. + +@node Options Summary, , Testing, Running +@section Summary of Options +@cindex options +@cindex flags +@cindex switches + +Here is a table of all the options @code{make} understands: + +@table @samp +@item -b +@cindex @code{-b} +@itemx -m +@cindex @code{-m} +These options are ignored for compatibility with other versions of @code{make}. + +@item -B +@cindex @code{-B} +@itemx --always-make +@cindex @code{--always-make} +Consider all targets out-of-date. GNU @code{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 +@code{MAKE_RESTARTS} (@pxref{Special Variables, , Other Special +Variables}) is set to a number greater than 0 this option is disabled +when considering whether to remake makefiles (@pxref{Remaking +Makefiles, , How Makefiles Are Remade}). + +@item -C @var{dir} +@cindex @code{-C} +@itemx --directory=@var{dir} +@cindex @code{--directory} +Change to directory @var{dir} before reading the makefiles. If multiple +@samp{-C} options are specified, each is interpreted relative to the +previous one: @samp{-C / -C etc} is equivalent to @samp{-C /etc}. +This is typically used with recursive invocations of @code{make} +(@pxref{Recursion, ,Recursive Use of @code{make}}). + +@item -d +@cindex @code{-d} +@c Extra blank line here makes the table look better. + +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 +@code{make} decides what to do. The @code{-d} option is equivalent to +@samp{--debug=a} (see below). + +@item --debug[=@var{options}] +@cindex @code{--debug} +@c Extra blank line here makes the table look better. + +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. + +@table @code +@item a (@i{all}) +All types of debugging output are enabled. This is equivalent to using +@samp{-d}. + +@item b (@i{basic}) +Basic debugging prints each target that was found to be out-of-date, and +whether the build was successful or not. + +@item v (@i{verbose}) +A level above @samp{basic}; includes messages about which makefiles were +parsed, prerequisites that did not need to be rebuilt, etc. This option +also enables @samp{basic} messages. + +@item i (@i{implicit}) +Prints messages describing the implicit rule searches for each target. +This option also enables @samp{basic} messages. + +@item j (@i{jobs}) +Prints messages giving details on the invocation of specific sub-commands. + +@item m (@i{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 @samp{all} option does enable this option. This +option also enables @samp{basic} messages. + +@item n (@i{none}) +Disable all debugging currently enabled. If additional debugging +flags are encountered after this they will still take effect. +@end table + +@item -e +@cindex @code{-e} +@itemx --environment-overrides +@cindex @code{--environment-overrides} +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. + +Evaluate @var{string} as makefile syntax. This is a command-line +version of the @code{eval} function (@pxref{Eval Function}). The +evaluation is performed after the default rules and variables have +been defined, but before any makefiles are read. + +@item -f @var{file} +@cindex @code{-f} +@itemx --file=@var{file} +@cindex @code{--file} +@itemx --makefile=@var{file} +@cindex @code{--makefile} +Read the file named @var{file} as a makefile. +@xref{Makefiles, ,Writing Makefiles}. + +@item -h +@cindex @code{-h} +@itemx --help +@cindex @code{--help} +@c Extra blank line here makes the table look better. + +Remind you of the options that @code{make} understands and then exit. + +@item -i +@cindex @code{-i} +@itemx --ignore-errors +@cindex @code{--ignore-errors} +Ignore all errors in recipes executed to remake files. +@xref{Errors, ,Errors in Recipes}. + +@item -I @var{dir} +@cindex @code{-I} +@itemx --include-dir=@var{dir} +@cindex @code{--include-dir} +Specifies a directory @var{dir} to search for included makefiles. +@xref{Include, ,Including Other Makefiles}. If several @samp{-I} +options are used to specify several directories, the directories are +searched in the order specified. + +@item -j [@var{jobs}] +@cindex @code{-j} +@itemx --jobs[=@var{jobs}] +@cindex @code{--jobs} +Specifies the number of recipes (jobs) to run simultaneously. With no +argument, @code{make} runs as many recipes simultaneously as possible. +If there is more than one @samp{-j} option, the last one is effective. +@xref{Parallel, ,Parallel Execution}, for more information on how +recipes are run. Note that this option is ignored on MS-DOS. + +@item -k +@cindex @code{-k} +@itemx --keep-going +@cindex @code{--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. +@xref{Testing, ,Testing the Compilation of a Program}. + +@item -l [@var{load}] +@cindex @code{-l} +@itemx --load-average[=@var{load}] +@cindex @code{--load-average} +@itemx --max-load[=@var{load}] +@cindex @code{--max-load} +Specifies that no new recipes should be started if there are other +recipes running and the load average is at least @var{load} (a +floating-point number). With no argument, removes a previous load +limit. @xref{Parallel, ,Parallel Execution}. + +@item -L +@cindex @code{-L} +@itemx --check-symlink-times +@cindex @code{--check-symlink-times} +On systems that support symbolic links, this option causes @code{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. + +@item -n +@cindex @code{-n} +@itemx --just-print +@cindex @code{--just-print} +@itemx --dry-run +@cindex @code{--dry-run} +@itemx --recon +@cindex @code{--recon} +@c Extra blank line here makes the table look better. + +Print the recipe that would be executed, but do not execute it (except +in certain circumstances). +@xref{Instead of Execution, ,Instead of Executing Recipes}. + +@item -o @var{file} +@cindex @code{-o} +@itemx --old-file=@var{file} +@cindex @code{--old-file} +@itemx --assume-old=@var{file} +@cindex @code{--assume-old} +Do not remake the file @var{file} even if it is older than its +prerequisites, and do not remake anything on account of changes in +@var{file}. Essentially the file is treated as very old and its rules +are ignored. @xref{Avoiding Compilation, ,Avoiding Recompilation of +Some Files}.@refill + +@item -O[@var{type}] +@cindex @code{-O} +@itemx --output-sync[=@var{type}] +@cindex @code{--output-sync} +@cindex output during parallel execution +@cindex parallel execution, output during +Ensure that the complete output from each recipe is printed in one +uninterrupted sequence. This option is only useful when using the +@code{--jobs} option to run multiple recipes simultaneously +(@pxref{Parallel, ,Parallel Execution}) Without this option output +will be displayed as it is generated by the recipes.@refill + +With no type or the type @samp{target}, output from the entire recipe +of each target is grouped together. With the type @samp{line}, output +from each line in the recipe is grouped together. With the type +@samp{recurse}, the output from an entire recursive make is grouped +together. With the type @samp{none}, no output synchronization is +performed. @xref{Parallel Output, ,Output During Parallel Execution}. + +@item -p +@cindex @code{-p} +@itemx --print-data-base +@cindex @code{--print-data-base} +@cindex data base of @code{make} rules +@cindex predefined rules and variables, printing +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 +@samp{-v} switch (see below). To print the data base without trying +to remake any files, use @w{@samp{make -qp}}. To print the data base +of predefined rules and variables, use @w{@samp{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. + +@item -q +@cindex @code{-q} +@itemx --question +@cindex @code{--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. @xref{Instead of Execution, ,Instead of Executing +Recipes}.@refill + +@item -r +@cindex @code{-r} +@itemx --no-builtin-rules +@cindex @code{--no-builtin-rules} +Eliminate use of the built-in implicit rules (@pxref{Implicit Rules, +,Using Implicit Rules}). You can still define your own by writing +pattern rules (@pxref{Pattern Rules, ,Defining and Redefining Pattern +Rules}). The @samp{-r} option also clears out the default list of +suffixes for suffix rules (@pxref{Suffix Rules, ,Old-Fashioned Suffix +Rules}). But you can still define your own suffixes with a rule for +@code{.SUFFIXES}, and then define your own suffix rules. Note that only +@emph{rules} are affected by the @code{-r} option; default variables +remain in effect (@pxref{Implicit Variables, ,Variables Used by Implicit +Rules}); see the @samp{-R} option below. + +@item -R +@cindex @code{-R} +@itemx --no-builtin-variables +@cindex @code{--no-builtin-variables} +Eliminate use of the built-in rule-specific variables (@pxref{Implicit +Variables, ,Variables Used by Implicit Rules}). You can still define +your own, of course. The @samp{-R} option also automatically enables +the @samp{-r} option (see above), since it doesn't make sense to have +implicit rules without any definitions for the variables that they use. + +@item -s +@cindex @code{-s} +@itemx --silent +@cindex @code{--silent} +@itemx --quiet +@cindex @code{--quiet} +@c Extra blank line here makes the table look better. + +Silent operation; do not print the recipes as they are executed. +@xref{Echoing, ,Recipe Echoing}. + +@item -S +@cindex @code{-S} +@itemx --no-keep-going +@cindex @code{--no-keep-going} +@itemx --stop +@cindex @code{--stop} +@c Extra blank line here makes the table look better. + +Cancel the effect of the @samp{-k} option. This is never necessary +except in a recursive @code{make} where @samp{-k} might be inherited +from the top-level @code{make} via @code{MAKEFLAGS} +(@pxref{Recursion, ,Recursive Use of @code{make}}) +or if you set @samp{-k} in @code{MAKEFLAGS} in your environment.@refill + +@item -t +@cindex @code{-t} +@itemx --touch +@cindex @code{--touch} +@c Extra blank line here makes the table look better. + +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 +@code{make}. @xref{Instead of Execution, ,Instead of Executing Recipes}. + +@item --trace +@cindex @code{--trace} +Show tracing information for @code{make} execution. Prints the entire +recipe to be executed, even for recipes that are normally silent (due +to @code{.SILENT} or @samp{@@}). Also prints the makefile name and +line number where the recipe was defined, and information on why the +target is being rebuilt. + +@item -v +@cindex @code{-v} +@itemx --version +@cindex @code{--version} +Print the version of the @code{make} program plus a copyright, a list +of authors, and a notice that there is no warranty; then exit. + +@item -w +@cindex @code{-w} +@itemx --print-directory +@cindex @code{--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 @code{make} commands. +@xref{Recursion, ,Recursive Use of @code{make}}. (In practice, you +rarely need to specify this option since @samp{make} does it for you; +see @ref{-w Option, ,The @samp{--print-directory} Option}.) + +@item --no-print-directory +@cindex @code{--no-print-directory} +Disable printing of the working directory under @code{-w}. +This option is useful when @code{-w} is turned on automatically, +but you do not want to see the extra messages. +@xref{-w Option, ,The @samp{--print-directory} Option}. + +@item -W @var{file} +@cindex @code{-W} +@itemx --what-if=@var{file} +@cindex @code{--what-if} +@itemx --new-file=@var{file} +@cindex @code{--new-file} +@itemx --assume-new=@var{file} +@cindex @code{--assume-new} +Pretend that the target @var{file} has just been modified. When used +with the @samp{-n} flag, this shows you what would happen if you were +to modify that file. Without @samp{-n}, it is almost the same as +running a @code{touch} command on the given file before running +@code{make}, except that the modification time is changed only in the +imagination of @code{make}. +@xref{Instead of Execution, ,Instead of Executing Recipes}. + +@item --warn-undefined-variables +@cindex @code{--warn-undefined-variables} +@cindex variables, warning for undefined +@cindex undefined variables, warning message +Issue a warning message whenever @code{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. +@end table + +@node Implicit Rules, Archives, Running, Top +@chapter Using Implicit Rules +@cindex implicit rule +@cindex rule, implicit + +Certain standard ways of remaking target files are used very often. For +example, one customary way to make an object file is from a C source file +using the C compiler, @code{cc}. + +@dfn{Implicit rules} tell @code{make} how to use customary techniques so +that you do not have to specify them in detail when you want to use +them. For example, there is an implicit rule for C compilation. File +names determine which implicit rules are run. For example, C +compilation typically takes a @file{.c} file and makes a @file{.o} file. +So @code{make} applies the implicit rule for C compilation when it sees +this combination of file name endings.@refill + +A chain of implicit rules can apply in sequence; for example, @code{make} +will remake a @file{.o} file from a @file{.y} file by way of a @file{.c} file. +@iftex +@xref{Chained Rules, ,Chains of Implicit Rules}. +@end iftex + +The built-in implicit rules use several variables in their recipes so +that, by changing the values of the variables, you can change the way the +implicit rule works. For example, the variable @code{CFLAGS} controls the +flags given to the C compiler by the implicit rule for C compilation. +@iftex +@xref{Implicit Variables, ,Variables Used by Implicit Rules}. +@end iftex + +You can define your own implicit rules by writing @dfn{pattern rules}. +@iftex +@xref{Pattern Rules, ,Defining and Redefining Pattern Rules}. +@end iftex + +@dfn{Suffix rules} are a more limited way to define implicit rules. +Pattern rules are more general and clearer, but suffix rules are +retained for compatibility. +@iftex +@xref{Suffix Rules, ,Old-Fashioned Suffix Rules}. +@end iftex + +@menu +* Using Implicit:: How to use an existing implicit rule + to get the recipes for updating a file. +* Catalogue of Rules:: A list of built-in rules. +* Implicit Variables:: How to change what predefined rules do. +* Chained Rules:: How to use a chain of implicit rules. +* Pattern Rules:: How to define new implicit rules. +* Last Resort:: How to define a recipe for rules which + cannot find any. +* Suffix Rules:: The old-fashioned style of implicit rule. +* Implicit Rule Search:: The precise algorithm for applying + implicit rules. +@end menu + +@node Using Implicit, Catalogue of Rules, Implicit Rules, Implicit Rules +@section Using Implicit Rules +@cindex implicit rule, how to use +@cindex rule, implicit, how to use + +To allow @code{make} to find a customary method for updating a target +file, all you have to do is refrain from specifying recipes yourself. +Either write a rule with no recipe, or don't write a rule at all. +Then @code{make} will figure out which implicit rule to use based on +which kind of source file exists or can be made. + +For example, suppose the makefile looks like this: + +@example +foo : foo.o bar.o + cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS) +@end example + +@noindent +Because you mention @file{foo.o} but do not give a rule for it, @code{make} +will automatically look for an implicit rule that tells how to update it. +This happens whether or not the file @file{foo.o} currently exists. + +If an implicit rule is found, it can supply both a recipe and one or +more prerequisites (the source files). You would want to write a rule +for @file{foo.o} with no recipe if you need to specify additional +prerequisites, such as header files, that the implicit rule cannot +supply. + +Each implicit rule has a target pattern and prerequisite patterns. There may +be many implicit rules with the same target pattern. For example, numerous +rules make @samp{.o} files: one, from a @samp{.c} file with the C compiler; +another, from a @samp{.p} file with the Pascal compiler; and so on. The rule +that actually applies is the one whose prerequisites exist or can be made. +So, if you have a file @file{foo.c}, @code{make} will run the C compiler; +otherwise, if you have a file @file{foo.p}, @code{make} will run the Pascal +compiler; and so on. + +Of course, when you write the makefile, you know which implicit rule you +want @code{make} to use, and you know it will choose that one because you +know which possible prerequisite files are supposed to exist. +@xref{Catalogue of Rules, ,Catalogue of Built-In Rules}, +for a catalogue of all the predefined implicit rules. + +Above, we said an implicit rule applies if the required prerequisites ``exist +or can be made''. A file ``can be made'' if it is mentioned explicitly in +the makefile as a target or a prerequisite, or if an implicit rule can be +recursively found for how to make it. When an implicit prerequisite is the +result of another implicit rule, we say that @dfn{chaining} is occurring. +@xref{Chained Rules, ,Chains of Implicit Rules}. + +In general, @code{make} searches for an implicit rule for each target, and +for each double-colon rule, that has no recipe. A file that is mentioned +only as a prerequisite is considered a target whose rule specifies nothing, +so implicit rule search happens for it. @xref{Implicit Rule Search, ,Implicit Rule Search Algorithm}, for the +details of how the search is done. + +Note that explicit prerequisites do not influence implicit rule search. +For example, consider this explicit rule: + +@example +foo.o: foo.p +@end example + +@noindent +The prerequisite on @file{foo.p} does not necessarily mean that +@code{make} will remake @file{foo.o} according to the implicit rule to +make an object file, a @file{.o} file, from a Pascal source file, a +@file{.p} file. For example, if @file{foo.c} also exists, the implicit +rule to make an object file from a C source file is used instead, +because it appears before the Pascal rule in the list of predefined +implicit rules (@pxref{Catalogue of Rules, , Catalogue of Built-In +Rules}). + +If you do not want an implicit rule to be used for a target that has no +recipe, you can give that target an empty recipe by writing a semicolon +(@pxref{Empty Recipes, ,Defining Empty Recipes}). + +@node Catalogue of Rules, Implicit Variables, Using Implicit, Implicit Rules +@section Catalogue of Built-In Rules +@cindex implicit rule, predefined +@cindex rule, implicit, predefined + +Here is a catalogue of predefined implicit rules which are always +available unless the makefile explicitly overrides or cancels them. +@xref{Canceling Rules, ,Canceling Implicit Rules}, for information on +canceling or overriding an implicit rule. The @samp{-r} or +@samp{--no-builtin-rules} option cancels all predefined rules. + +This manual only documents the default rules available on POSIX-based +operating systems. Other operating systems, such as VMS, Windows, +OS/2, etc. may have different sets of default rules. To see the full +list of default rules and variables available in your version of GNU +@code{make}, run @samp{make -p} in a directory with no makefile. + +Not all of these rules will always be defined, even when the @samp{-r} +option is not given. Many of the predefined implicit rules are +implemented in @code{make} as suffix rules, so which ones will be +defined depends on the @dfn{suffix list} (the list of prerequisites of +the special target @code{.SUFFIXES}). The default suffix list is: +@code{.out}, @code{.a}, @code{.ln}, @code{.o}, @code{.c}, @code{.cc}, +@code{.C}, @code{.cpp}, @code{.p}, @code{.f}, @code{.F}, @code{.m}, +@code{.r}, @code{.y}, @code{.l}, @code{.ym}, @code{.lm}, @code{.s}, +@code{.S}, @code{.mod}, @code{.sym}, @code{.def}, @code{.h}, +@code{.info}, @code{.dvi}, @code{.tex}, @code{.texinfo}, @code{.texi}, +@code{.txinfo}, @code{.w}, @code{.ch} @code{.web}, @code{.sh}, +@code{.elc}, @code{.el}. All of the implicit rules described below +whose prerequisites have one of these suffixes are actually suffix +rules. If you modify the suffix list, the only predefined suffix +rules in effect will be those named by one or two of the suffixes that +are on the list you specify; rules whose suffixes fail to be on the +list are disabled. @xref{Suffix Rules, ,Old-Fashioned Suffix Rules}, +for full details on suffix rules. + +@table @asis +@item Compiling C programs +@cindex C, rule to compile +@pindex cc +@pindex gcc +@pindex .o +@pindex .c +@file{@var{n}.o} is made automatically from @file{@var{n}.c} with +a recipe of the form @samp{$(CC) $(CPPFLAGS) $(CFLAGS) -c}.@refill + +@item Compiling C++ programs +@cindex C++, rule to compile +@pindex g++ +@pindex .cc +@pindex .cpp +@pindex .C +@file{@var{n}.o} is made automatically from @file{@var{n}.cc}, +@file{@var{n}.cpp}, or @file{@var{n}.C} with a recipe of the form +@samp{$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c}. We encourage you to use the +suffix @samp{.cc} for C++ source files instead of @samp{.C}.@refill + +@item Compiling Pascal programs +@cindex Pascal, rule to compile +@pindex pc +@pindex .p +@file{@var{n}.o} is made automatically from @file{@var{n}.p} +with the recipe @samp{$(PC) $(PFLAGS) -c}.@refill + +@item Compiling Fortran and Ratfor programs +@cindex Fortran, rule to compile +@cindex Ratfor, rule to compile +@pindex f77 +@pindex .f +@pindex .r +@pindex .F +@file{@var{n}.o} is made automatically from @file{@var{n}.r}, +@file{@var{n}.F} or @file{@var{n}.f} by running the +Fortran compiler. The precise recipe used is as follows:@refill + +@table @samp +@item .f +@samp{$(FC) $(FFLAGS) -c}. +@item .F +@samp{$(FC) $(FFLAGS) $(CPPFLAGS) -c}. +@item .r +@samp{$(FC) $(FFLAGS) $(RFLAGS) -c}. +@end table + +@item Preprocessing Fortran and Ratfor programs +@file{@var{n}.f} is made automatically from @file{@var{n}.r} or +@file{@var{n}.F}. This rule runs just the preprocessor to convert a +Ratfor or preprocessable Fortran program into a strict Fortran +program. The precise recipe used is as follows:@refill + +@table @samp +@item .F +@samp{$(FC) $(CPPFLAGS) $(FFLAGS) -F}. +@item .r +@samp{$(FC) $(FFLAGS) $(RFLAGS) -F}. +@end table + +@item Compiling Modula-2 programs +@cindex Modula-2, rule to compile +@pindex m2c +@pindex .sym +@pindex .def +@pindex .mod +@file{@var{n}.sym} is made from @file{@var{n}.def} with a recipe +of the form @samp{$(M2C) $(M2FLAGS) $(DEFFLAGS)}. @file{@var{n}.o} +is made from @file{@var{n}.mod}; the form is: +@w{@samp{$(M2C) $(M2FLAGS) $(MODFLAGS)}}.@refill + +@need 1200 +@item Assembling and preprocessing assembler programs +@cindex assembly, rule to compile +@pindex as +@pindex .s +@file{@var{n}.o} is made automatically from @file{@var{n}.s} by +running the assembler, @code{as}. The precise recipe is +@samp{$(AS) $(ASFLAGS)}.@refill + +@pindex .S +@file{@var{n}.s} is made automatically from @file{@var{n}.S} by +running the C preprocessor, @code{cpp}. The precise recipe is +@w{@samp{$(CPP) $(CPPFLAGS)}}. + +@item Linking a single object file +@cindex linking, predefined rule for +@pindex ld +@pindex .o +@file{@var{n}} is made automatically from @file{@var{n}.o} by running +the linker (usually called @code{ld}) via the C compiler. The precise +recipe used is @w{@samp{$(CC) $(LDFLAGS) @var{n}.o $(LOADLIBES) $(LDLIBS)}}. + +This rule does the right thing for a simple program with only one +source file. It will also do the right thing if there are multiple +object files (presumably coming from various other source files), one +of which has a name matching that of the executable file. Thus, + +@example +x: y.o z.o +@end example + +@noindent +when @file{x.c}, @file{y.c} and @file{z.c} all exist will execute: + +@example +@group +cc -c x.c -o x.o +cc -c y.c -o y.o +cc -c z.c -o z.o +cc x.o y.o z.o -o x +rm -f x.o +rm -f y.o +rm -f z.o +@end group +@end example + +@noindent +In more complicated cases, such as when there is no object file whose +name derives from the executable file name, you must write an explicit +recipe for linking. + +Each kind of file automatically made into @samp{.o} object files will +be automatically linked by using the compiler (@samp{$(CC)}, +@samp{$(FC)} or @samp{$(PC)}; the C compiler @samp{$(CC)} is used to +assemble @samp{.s} files) without the @samp{-c} option. This could be +done by using the @samp{.o} object files as intermediates, but it is +faster to do the compiling and linking in one step, so that's how it's +done.@refill + +@item Yacc for C programs +@pindex yacc +@cindex Yacc, rule to run +@pindex .y +@file{@var{n}.c} is made automatically from @file{@var{n}.y} by +running Yacc with the recipe @samp{$(YACC) $(YFLAGS)}. + +@item Lex for C programs +@pindex lex +@cindex Lex, rule to run +@pindex .l +@file{@var{n}.c} is made automatically from @file{@var{n}.l} by +running Lex. The actual recipe is @samp{$(LEX) $(LFLAGS)}. + +@item Lex for Ratfor programs +@file{@var{n}.r} is made automatically from @file{@var{n}.l} by +running Lex. The actual recipe is @samp{$(LEX) $(LFLAGS)}. + +The convention of using the same suffix @samp{.l} for all Lex files +regardless of whether they produce C code or Ratfor code makes it +impossible for @code{make} to determine automatically which of the two +languages you are using in any particular case. If @code{make} is +called upon to remake an object file from a @samp{.l} file, it must +guess which compiler to use. It will guess the C compiler, because +that is more common. If you are using Ratfor, make sure @code{make} +knows this by mentioning @file{@var{n}.r} in the makefile. Or, if you +are using Ratfor exclusively, with no C files, remove @samp{.c} from +the list of implicit rule suffixes with:@refill + +@example +@group +.SUFFIXES: +.SUFFIXES: .o .r .f .l @dots{} +@end group +@end example + +@item Making Lint Libraries from C, Yacc, or Lex programs +@pindex lint +@cindex @code{lint}, rule to run +@pindex .ln +@file{@var{n}.ln} is made from @file{@var{n}.c} by running @code{lint}. +The precise recipe is @w{@samp{$(LINT) $(LINTFLAGS) $(CPPFLAGS) -i}}. +The same recipe is used on the C code produced from +@file{@var{n}.y} or @file{@var{n}.l}.@refill + +@item @TeX{} and Web +@cindex @TeX{}, rule to run +@cindex Web, rule to run +@pindex tex +@pindex cweave +@pindex weave +@pindex tangle +@pindex ctangle +@pindex .dvi +@pindex .tex +@pindex .web +@pindex .w +@pindex .ch +@file{@var{n}.dvi} is made from @file{@var{n}.tex} with the recipe +@samp{$(TEX)}. @file{@var{n}.tex} is made from @file{@var{n}.web} with +@samp{$(WEAVE)}, or from @file{@var{n}.w} (and from @file{@var{n}.ch} if +it exists or can be made) with @samp{$(CWEAVE)}. @file{@var{n}.p} is +made from @file{@var{n}.web} with @samp{$(TANGLE)} and @file{@var{n}.c} +is made from @file{@var{n}.w} (and from @file{@var{n}.ch} if it exists +or can be made) with @samp{$(CTANGLE)}.@refill + +@item Texinfo and Info +@cindex Texinfo, rule to format +@cindex Info, rule to format +@pindex texi2dvi +@pindex makeinfo +@pindex .texinfo +@pindex .info +@pindex .texi +@pindex .txinfo +@file{@var{n}.dvi} is made from @file{@var{n}.texinfo}, +@file{@var{n}.texi}, or @file{@var{n}.txinfo}, with the recipe +@w{@samp{$(TEXI2DVI) $(TEXI2DVI_FLAGS)}}. @file{@var{n}.info} is made from +@file{@var{n}.texinfo}, @file{@var{n}.texi}, or @file{@var{n}.txinfo}, with +the recipe @w{@samp{$(MAKEINFO) $(MAKEINFO_FLAGS)}}. + +@item RCS +@cindex RCS, rule to extract from +@pindex co +@pindex ,v @r{(RCS file extension)} +Any file @file{@var{n}} is extracted if necessary from an RCS file +named either @file{@var{n},v} or @file{RCS/@var{n},v}. The precise +recipe used is @w{@samp{$(CO) $(COFLAGS)}}. @file{@var{n}} will not be +extracted from RCS if it already exists, even if the RCS file is +newer. The rules for RCS are terminal +(@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}), +so RCS files cannot be generated from another source; they must +actually exist.@refill + +@item SCCS +@cindex SCCS, rule to extract from +@pindex get +@pindex s. @r{(SCCS file prefix)} +Any file @file{@var{n}} is extracted if necessary from an SCCS file +named either @file{s.@var{n}} or @file{SCCS/s.@var{n}}. The precise +recipe used is @w{@samp{$(GET) $(GFLAGS)}}. The rules for SCCS are +terminal (@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}), +so SCCS files cannot be generated from another source; they must +actually exist.@refill + +@pindex .sh +For the benefit of SCCS, a file @file{@var{n}} is copied from +@file{@var{n}.sh} and made executable (by everyone). This is for +shell scripts that are checked into SCCS. Since RCS preserves the +execution permission of a file, you do not need to use this feature +with RCS.@refill + +We recommend that you avoid using of SCCS. RCS is widely held to be +superior, and is also free. By choosing free software in place of +comparable (or inferior) proprietary software, you support the free +software movement. +@end table + +Usually, you want to change only the variables listed in the table +above, which are documented in the following section. + +However, the recipes in built-in implicit rules actually use +variables such as @code{COMPILE.c}, @code{LINK.p}, and +@code{PREPROCESS.S}, whose values contain the recipes listed above. + +@code{make} follows the convention that the rule to compile a +@file{.@var{x}} source file uses the variable @code{COMPILE.@var{x}}. +Similarly, the rule to produce an executable from a @file{.@var{x}} +file uses @code{LINK.@var{x}}; and the rule to preprocess a +@file{.@var{x}} file uses @code{PREPROCESS.@var{x}}. + +@vindex OUTPUT_OPTION +Every rule that produces an object file uses the variable +@code{OUTPUT_OPTION}. @code{make} defines this variable either to +contain @samp{-o $@@}, or to be empty, depending on a compile-time +option. You need the @samp{-o} option to ensure that the output goes +into the right file when the source file is in a different directory, +as when using @code{VPATH} (@pxref{Directory Search}). However, +compilers on some systems do not accept a @samp{-o} switch for object +files. If you use such a system, and use @code{VPATH}, some +compilations will put their output in the wrong place. +A possible workaround for this problem is to give @code{OUTPUT_OPTION} +the value @w{@samp{; mv $*.o $@@}}. + +@node Implicit Variables, Chained Rules, Catalogue of Rules, Implicit Rules +@section Variables Used by Implicit Rules +@cindex flags for compilers + +The recipes in built-in implicit rules make liberal use of certain +predefined variables. You can alter the values of these variables in +the makefile, with arguments to @code{make}, or in the environment to +alter how the implicit rules work without redefining the rules +themselves. You can cancel all variables used by implicit rules with +the @samp{-R} or @samp{--no-builtin-variables} option. + +For example, the recipe used to compile a C source file actually says +@samp{$(CC) -c $(CFLAGS) $(CPPFLAGS)}. The default values of the variables +used are @samp{cc} and nothing, resulting in the command @samp{cc -c}. By +redefining @samp{CC} to @samp{ncc}, you could cause @samp{ncc} to be +used for all C compilations performed by the implicit rule. By redefining +@samp{CFLAGS} to be @samp{-g}, you could pass the @samp{-g} option to +each compilation. @emph{All} implicit rules that do C compilation use +@samp{$(CC)} to get the program name for the compiler and @emph{all} +include @samp{$(CFLAGS)} among the arguments given to the compiler.@refill + +The variables used in implicit rules fall into two classes: those that are +names of programs (like @code{CC}) and those that contain arguments for the +programs (like @code{CFLAGS}). (The ``name of a program'' may also contain +some command arguments, but it must start with an actual executable program +name.) If a variable value contains more than one argument, separate them +with spaces. + +The following tables describe of some of the more commonly-used predefined +variables. This list is not exhaustive, and the default values shown here may +not be what @code{make} selects for your environment. To see the +complete list of predefined variables for your instance of GNU @code{make} you +can run @samp{make -p} in a directory with no makefiles. + +Here is a table of some of the more common variables used as names of +programs in built-in rules: + +@table @code +@item AR +@vindex AR +Archive-maintaining program; default @samp{ar}. +@pindex ar + +@item AS +@vindex AS +Program for compiling assembly files; default @samp{as}. +@pindex as + +@item CC +@vindex CC +Program for compiling C programs; default @samp{cc}. +@pindex cc + +@item CXX +@vindex CXX +Program for compiling C++ programs; default @samp{g++}. +@pindex g++ + +@item CPP +@vindex CPP +Program for running the C preprocessor, with results to standard output; +default @samp{$(CC) -E}. + +@item FC +@vindex FC +Program for compiling or preprocessing Fortran and Ratfor programs; +default @samp{f77}. +@pindex f77 + +@item M2C +@vindex M2C +Program to use to compile Modula-2 source code; default @samp{m2c}. +@pindex m2c + +@item PC +@vindex PC +Program for compiling Pascal programs; default @samp{pc}. +@pindex pc + +@item CO +@vindex CO +Program for extracting a file from RCS; default @samp{co}. +@pindex co + +@item GET +@vindex GET +Program for extracting a file from SCCS; default @samp{get}. +@pindex get + +@item LEX +@vindex LEX +Program to use to turn Lex grammars into source code; default @samp{lex}. +@pindex lex + +@item YACC +@vindex YACC +Program to use to turn Yacc grammars into source code; default @samp{yacc}. +@pindex yacc + +@item LINT +@vindex LINT +Program to use to run lint on source code; default @samp{lint}. +@pindex lint + +@item MAKEINFO +@vindex MAKEINFO +Program to convert a Texinfo source file into an Info file; default +@samp{makeinfo}. +@pindex makeinfo + +@item TEX +@vindex TEX +Program to make @TeX{} @sc{dvi} files from @TeX{} source; +default @samp{tex}. +@pindex tex + +@item TEXI2DVI +@vindex TEXI2DVI +Program to make @TeX{} @sc{dvi} files from Texinfo source; +default @samp{texi2dvi}. +@pindex texi2dvi + +@item WEAVE +@vindex WEAVE +Program to translate Web into @TeX{}; default @samp{weave}. +@pindex weave + +@item CWEAVE +@vindex CWEAVE +Program to translate C Web into @TeX{}; default @samp{cweave}. +@pindex cweave + +@item TANGLE +@vindex TANGLE +Program to translate Web into Pascal; default @samp{tangle}. +@pindex tangle + +@item CTANGLE +@vindex CTANGLE +Program to translate C Web into C; default @samp{ctangle}. +@pindex ctangle + +@item RM +@vindex RM +Command to remove a file; default @samp{rm -f}. +@pindex rm +@end table + +Here is a table of variables whose values are additional arguments for the +programs above. The default values for all of these is the empty +string, unless otherwise noted. + +@table @code +@item ARFLAGS +@vindex ARFLAGS +Flags to give the archive-maintaining program; default @samp{rv}. + +@item ASFLAGS +@vindex ASFLAGS +Extra flags to give to the assembler (when explicitly +invoked on a @samp{.s} or @samp{.S} file). + +@item CFLAGS +@vindex CFLAGS +Extra flags to give to the C compiler. + +@item CXXFLAGS +@vindex CXXFLAGS +Extra flags to give to the C++ compiler. + +@item COFLAGS +@vindex COFLAGS +Extra flags to give to the RCS @code{co} program. + +@item CPPFLAGS +@vindex CPPFLAGS +Extra flags to give to the C preprocessor and programs +that use it (the C and Fortran compilers). + +@item FFLAGS +@vindex FFLAGS +Extra flags to give to the Fortran compiler. + +@item GFLAGS +@vindex GFLAGS +Extra flags to give to the SCCS @code{get} program. + +@item LDFLAGS +@vindex LDFLAGS +Extra flags to give to compilers when they are supposed to invoke the linker, +@samp{ld}, such as @code{-L}. Libraries (@code{-lfoo}) should be +added to the @code{LDLIBS} variable instead. + +@item LDLIBS +@vindex LDLIBS +@vindex LOADLIBES +Library flags or names given to compilers when they are supposed to +invoke the linker, @samp{ld}. @code{LOADLIBES} is a deprecated (but +still supported) alternative to @code{LDLIBS}. Non-library linker +flags, such as @code{-L}, should go in the @code{LDFLAGS} variable. + +@item LFLAGS +@vindex LFLAGS +Extra flags to give to Lex. + +@item YFLAGS +@vindex YFLAGS +Extra flags to give to Yacc. + +@item PFLAGS +@vindex PFLAGS +Extra flags to give to the Pascal compiler. + +@item RFLAGS +@vindex RFLAGS +Extra flags to give to the Fortran compiler for Ratfor programs. + +@item LINTFLAGS +@vindex LINTFLAGS +Extra flags to give to lint. +@end table + +@node Chained Rules, Pattern Rules, Implicit Variables, Implicit Rules +@section Chains of Implicit Rules + +@cindex chains of rules +@cindex rule, implicit, chains of +Sometimes a file can be made by a sequence of implicit rules. For example, +a file @file{@var{n}.o} could be made from @file{@var{n}.y} by running +first Yacc and then @code{cc}. Such a sequence is called a @dfn{chain}. + +If the file @file{@var{n}.c} exists, or is mentioned in the makefile, no +special searching is required: @code{make} finds that the object file can +be made by C compilation from @file{@var{n}.c}; later on, when considering +how to make @file{@var{n}.c}, the rule for running Yacc is +used. Ultimately both @file{@var{n}.c} and @file{@var{n}.o} are +updated.@refill + +@cindex intermediate files +@cindex files, intermediate +However, even if @file{@var{n}.c} does not exist and is not mentioned, +@code{make} knows how to envision it as the missing link between +@file{@var{n}.o} and @file{@var{n}.y}! In this case, @file{@var{n}.c} is +called an @dfn{intermediate file}. Once @code{make} has decided to use the +intermediate file, it is entered in the data base as if it had been +mentioned in the makefile, along with the implicit rule that says how to +create it.@refill + +Intermediate files are remade using their rules just like all other +files. But intermediate files are treated differently in two ways. + +The first difference is what happens if the intermediate file does not +exist. If an ordinary file @var{b} does not exist, and @code{make} +considers a target that depends on @var{b}, it invariably creates +@var{b} and then updates the target from @var{b}. But if @var{b} is an +intermediate file, then @code{make} can leave well enough alone. It +won't bother updating @var{b}, or the ultimate target, unless some +prerequisite of @var{b} is newer than that target or there is some other +reason to update that target. + +The second difference is that if @code{make} @emph{does} create @var{b} +in order to update something else, it deletes @var{b} later on after it +is no longer needed. Therefore, an intermediate file which did not +exist before @code{make} also does not exist after @code{make}. +@code{make} reports the deletion to you by printing a @samp{rm -f} +command showing which file it is deleting. + +Ordinarily, a file cannot be intermediate if it is mentioned in the +makefile as a target or prerequisite. However, you can explicitly mark a +file as intermediate by listing it as a prerequisite of the special target +@code{.INTERMEDIATE}. This takes effect even if the file is mentioned +explicitly in some other way. + +@cindex intermediate files, preserving +@cindex preserving intermediate files +@cindex secondary files +You can prevent automatic deletion of an intermediate file by marking it +as a @dfn{secondary} file. To do this, list it as a prerequisite of the +special target @code{.SECONDARY}. When a file is secondary, @code{make} +will not create the file merely because it does not already exist, but +@code{make} does not automatically delete the file. Marking a file as +secondary also marks it as intermediate. + +You can list the target pattern of an implicit rule (such as @samp{%.o}) +as a prerequisite of the special target @code{.PRECIOUS} to preserve +intermediate files made by implicit rules whose target patterns match +that file's name; see @ref{Interrupts}.@refill +@cindex preserving with @code{.PRECIOUS} +@cindex @code{.PRECIOUS} intermediate files + +A chain can involve more than two implicit rules. For example, it is +possible to make a file @file{foo} from @file{RCS/foo.y,v} by running RCS, +Yacc and @code{cc}. Then both @file{foo.y} and @file{foo.c} are +intermediate files that are deleted at the end.@refill + +No single implicit rule can appear more than once in a chain. This means +that @code{make} will not even consider such a ridiculous thing as making +@file{foo} from @file{foo.o.o} by running the linker twice. This +constraint has the added benefit of preventing any infinite loop in the +search for an implicit rule chain. + +There are some special implicit rules to optimize certain cases that would +otherwise be handled by rule chains. For example, making @file{foo} from +@file{foo.c} could be handled by compiling and linking with separate +chained rules, using @file{foo.o} as an intermediate file. But what +actually happens is that a special rule for this case does the compilation +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 + +You define an implicit rule by writing a @dfn{pattern rule}. A pattern +rule looks like an ordinary rule, except that its target contains the +character @samp{%} (exactly one of them). The target is considered a +pattern for matching file names; the @samp{%} can match any nonempty +substring, while other characters match only themselves. The prerequisites +likewise use @samp{%} to show how their names relate to the target name. + +Thus, a pattern rule @samp{%.o : %.c} says how to make any file +@file{@var{stem}.o} from another file @file{@var{stem}.c}.@refill + +Note that expansion using @samp{%} in pattern rules occurs +@strong{after} any variable or function expansions, which take place +when the makefile is read. @xref{Using Variables, , How to Use +Variables}, and @ref{Functions, ,Functions for Transforming Text}. + +@menu +* Pattern Intro:: An introduction to pattern rules. +* Pattern Examples:: Examples of pattern rules. +* Automatic Variables:: How to use automatic variables in the + recipe of implicit rules. +* Pattern Match:: How patterns match. +* Match-Anything Rules:: Precautions you should take prior to + defining rules that can match any + target file whatever. +* Canceling Rules:: How to override or cancel built-in rules. +@end menu + +@node Pattern Intro, Pattern Examples, Pattern Rules, Pattern Rules +@subsection Introduction to Pattern Rules +@cindex pattern rule +@cindex rule, pattern + +A pattern rule contains the character @samp{%} (exactly one of them) +in the target; otherwise, it looks exactly like an ordinary rule. The +target is a pattern for matching file names; the @samp{%} matches any +nonempty substring, while other characters match only themselves. +@cindex target pattern, implicit +@cindex @code{%}, in pattern rules + +For example, @samp{%.c} as a pattern matches any file name that ends in +@samp{.c}. @samp{s.%.c} as a pattern matches any file name that starts +with @samp{s.}, ends in @samp{.c} and is at least five characters long. +(There must be at least one character to match the @samp{%}.) The substring +that the @samp{%} matches is called the @dfn{stem}.@refill + +@samp{%} in a prerequisite of a pattern rule stands for the same stem +that was matched by the @samp{%} in the target. In order for the +pattern rule to apply, its target pattern must match the file name +under consideration and all of its prerequisites (after pattern +substitution) must name files that exist or can be made. These files +become prerequisites of the target. +@cindex prerequisite pattern, implicit + +Thus, a rule of the form + +@example +%.o : %.c ; @var{recipe}@dots{} +@end example + +@noindent +specifies how to make a file @file{@var{n}.o}, with another file +@file{@var{n}.c} as its prerequisite, provided that @file{@var{n}.c} +exists or can be made. + +There may also be prerequisites that do not use @samp{%}; such a prerequisite +attaches to every file made by this pattern rule. These unvarying +prerequisites are useful occasionally. + +A pattern rule need not have any prerequisites that contain @samp{%}, or +in fact any prerequisites at all. Such a rule is effectively a general +wildcard. It provides a way to make any file that matches the target +pattern. @xref{Last Resort}. + +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}. + +@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 + +Here are some examples of pattern rules actually predefined in +@code{make}. First, the rule that compiles @samp{.c} files into @samp{.o} +files:@refill + +@example +%.o : %.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@@ +@end example + +@noindent +defines a rule that can make any file @file{@var{x}.o} from +@file{@var{x}.c}. The recipe uses the automatic variables @samp{$@@} and +@samp{$<} to substitute the names of the target file and the source file +in each case where the rule applies (@pxref{Automatic Variables}).@refill + +Here is a second built-in rule: + +@example +% :: RCS/%,v + $(CO) $(COFLAGS) $< +@end example + +@noindent +defines a rule that can make any file @file{@var{x}} whatsoever from a +corresponding file @file{@var{x},v} in the sub-directory @file{RCS}. Since +the target is @samp{%}, this rule will apply to any file whatever, provided +the appropriate prerequisite file exists. The double colon makes the rule +@dfn{terminal}, which means that its prerequisite may not be an intermediate +file (@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}).@refill + +@need 500 +This pattern rule has two targets: + +@example +@group +%.tab.c %.tab.h: %.y + bison -d $< +@end group +@end example + +@noindent +@c The following paragraph is rewritten to avoid overfull hboxes +This tells @code{make} that the recipe @samp{bison -d @var{x}.y} will +make both @file{@var{x}.tab.c} and @file{@var{x}.tab.h}. If the file +@file{foo} depends on the files @file{parse.tab.o} and @file{scan.o} +and the file @file{scan.o} depends on the file @file{parse.tab.h}, +when @file{parse.y} is changed, the recipe @samp{bison -d parse.y} +will be executed only once, and the prerequisites of both +@file{parse.tab.o} and @file{scan.o} will be satisfied. (Presumably +the file @file{parse.tab.o} will be recompiled from @file{parse.tab.c} +and the file @file{scan.o} from @file{scan.c}, while @file{foo} is +linked from @file{parse.tab.o}, @file{scan.o}, and its other +prerequisites, and it will execute happily ever after.)@refill + +@node Automatic Variables, Pattern Match, Pattern Examples, Pattern Rules +@subsection Automatic Variables +@cindex automatic variables +@cindex variables, automatic +@cindex variables, and implicit rule + +Suppose you are writing a pattern rule to compile a @samp{.c} file into a +@samp{.o} file: how do you write the @samp{cc} command so that it operates +on the right source file name? You cannot write the name in the recipe, +because the name is different each time the implicit rule is applied. + +What you do is use a special feature of @code{make}, the @dfn{automatic +variables}. These variables have values computed afresh for each rule that +is executed, based on the target and prerequisites of the rule. In this +example, you would use @samp{$@@} for the object file name and @samp{$<} +for the source file name. + +@cindex automatic variables in prerequisites +@cindex prerequisites, and automatic variables +It's very important that you recognize the limited scope in which +automatic variable values are available: they only have values within +the recipe. In particular, you cannot use them anywhere +within the target list of a rule; they have no value there and will +expand to the empty string. Also, they cannot be accessed directly +within the prerequisite list of a rule. A common mistake is +attempting to use @code{$@@} within the prerequisites list; this will +not work. However, there is a special feature of GNU @code{make}, +secondary expansion (@pxref{Secondary Expansion}), which will allow +automatic variable values to be used in prerequisite lists. + +Here is a table of automatic variables: + +@table @code +@vindex $@@ +@vindex @@ @r{(automatic variable)} +@item $@@ +The file name of the target of the rule. If the target is an archive +member, then @samp{$@@} is the name of the archive file. In a pattern +rule that has multiple targets (@pxref{Pattern Intro, ,Introduction to +Pattern Rules}), @samp{$@@} is the name of whichever target caused the +rule's recipe to be run. + +@vindex $% +@vindex % @r{(automatic variable)} +@item $% +The target member name, when the target is an archive member. +@xref{Archives}. For example, if the target is @file{foo.a(bar.o)} then +@samp{$%} is @file{bar.o} and @samp{$@@} is @file{foo.a}. @samp{$%} is +empty when the target is not an archive member. + +@vindex $< +@vindex < @r{(automatic variable)} +@item $< +The name of the first prerequisite. If the target got its recipe from +an implicit rule, this will be the first prerequisite added by the +implicit rule (@pxref{Implicit Rules}). + +@vindex $? +@vindex ? @r{(automatic variable)} +@item $? +The names of all the prerequisites that are newer than the target, 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 (@pxref{Archives}). +@cindex prerequisites, list of changed +@cindex list of changed prerequisites + +@vindex $^ +@vindex ^ @r{(automatic variable)} +@item $^ +The names of all the prerequisites, with spaces between them. For +prerequisites which are archive members, only the named member is used +(@pxref{Archives}). A target has only one prerequisite on each other file +it depends on, no matter how many times each file is listed as a +prerequisite. So if you list a prerequisite more than once for a target, +the value of @code{$^} contains just one copy of the name. This list +does @strong{not} contain any of the order-only prerequisites; for those +see the @samp{$|} variable, below. +@cindex prerequisites, list of all +@cindex list of all prerequisites + +@vindex $+ +@vindex + @r{(automatic variable)} +@item $+ +This is like @samp{$^}, but prerequisites listed more than once are +duplicated in the order they were listed in the makefile. This is +primarily useful for use in linking commands where it is meaningful to +repeat library file names in a particular order. + +@vindex $| +@vindex | @r{(automatic variable)} +@item $| +The names of all the order-only prerequisites, with spaces between +them. + +@vindex $* +@vindex * @r{(automatic variable)} +@item $* +The stem with which an implicit rule matches (@pxref{Pattern Match, ,How +Patterns Match}). If the target is @file{dir/a.foo.b} and the target +pattern is @file{a.%.b} then the stem is @file{dir/foo}. The stem is +useful for constructing names of related files.@refill +@cindex stem, variable for + +In a static pattern rule, the stem is part of the file name that matched +the @samp{%} in the target pattern. + +In an explicit rule, there is no stem; so @samp{$*} cannot be determined +in that way. Instead, if the target name ends with a recognized suffix +(@pxref{Suffix Rules, ,Old-Fashioned Suffix Rules}), @samp{$*} is set to +the target name minus the suffix. For example, if the target name is +@samp{foo.c}, then @samp{$*} is set to @samp{foo}, since @samp{.c} is a +suffix. GNU @code{make} does this bizarre thing only for compatibility +with other implementations of @code{make}. You should generally avoid +using @samp{$*} except in implicit rules or static pattern rules.@refill + +If the target name in an explicit rule does not end with a recognized +suffix, @samp{$*} is set to the empty string for that rule. +@end table + +@samp{$?} is useful even in explicit rules when you wish to operate on only +the prerequisites that have changed. For example, suppose that an archive +named @file{lib} is supposed to contain copies of several object files. +This rule copies just the changed object files into the archive: + +@example +@group +lib: foo.o bar.o lose.o win.o + ar r lib $? +@end group +@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. 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) +@vindex @@D @r{(automatic variable)} +@item $(@@D) +The directory part of the file name of the target, with the trailing +slash removed. If the value of @samp{$@@} is @file{dir/foo.o} then +@samp{$(@@D)} is @file{dir}. This value is @file{.} if @samp{$@@} does +not contain a slash. + +@vindex $(@@F) +@vindex @@F @r{(automatic variable)} +@item $(@@F) +The file-within-directory part of the file name of the target. If the +value of @samp{$@@} is @file{dir/foo.o} then @samp{$(@@F)} is +@file{foo.o}. @samp{$(@@F)} is equivalent to @samp{$(notdir $@@)}. + +@vindex $(*D) +@vindex *D @r{(automatic variable)} +@item $(*D) +@vindex $(*F) +@vindex *F @r{(automatic variable)} +@itemx $(*F) +The directory part and the file-within-directory +part of the stem; @file{dir} and @file{foo} in this example. + +@vindex $(%D) +@vindex %D @r{(automatic variable)} +@item $(%D) +@vindex $(%F) +@vindex %F @r{(automatic variable)} +@itemx $(%F) +The directory part and the file-within-directory part of the target +archive member name. This makes sense only for archive member targets +of the form @file{@var{archive}(@var{member})} and is useful only when +@var{member} may contain a directory name. (@xref{Archive Members, +,Archive Members as Targets}.) + +@vindex $( +#include +#include +#include +#include +#include + +#include + +int plugin_is_GPL_compatible; + +char * +gen_tmpfile(const char *nm, int argc, char **argv) +@{ + int fd; + + /* Compute the size of the filename and allocate space for it. */ + int len = strlen (argv[0]) + 6 + 1; + char *buf = gmk_alloc (len); + + strcpy (buf, argv[0]); + strcat (buf, "XXXXXX"); + + fd = mkstemp(buf); + if (fd >= 0) + @{ + /* Don't leak the file descriptor. */ + close (fd); + return buf; + @} + + /* Failure. */ + fprintf (stderr, "mkstemp(%s) failed: %s\n", buf, strerror (errno)); + gmk_free (buf); + return NULL; +@} + +int +mk_temp_gmk_setup () +@{ + /* Register the function with make name "mk-temp". */ + gmk_add_function ("mk-temp", gen_tmpfile, 1, 1, 1); + return 1; +@} +@end group +@end example + +Next, we will write a makefile that can build this shared object, load +it, and use it: + +@example +@group +all: + @@echo Temporary file: $(mk-temp tmpfile.) + +load mk_temp.so + +mk_temp.so: mk_temp.c + $(CC) -shared -fPIC -o $@ $< +@end group +@end example + +On MS-Windows, due to peculiarities of how shared objects are +produced, the compiler needs to scan the @dfn{import library} produced +when building @code{make}, typically called +@file{libgnumake-@var{version}.dll.a}, where @var{version} is the +version of the load object API. So the recipe to produce a shared +object will look on Windows like this (assuming the API version is 1): + +@example +@group +mk_temp.dll: mk_temp.c + $(CC) -shared -o $@ $< -lgnumake-1 +@end group +@end example + +Now when you run @code{make} you'll see something like: + +@example +$ make +cc -shared -fPIC -o mk_temp.so mk_temp.c +Temporary filename: tmpfile.A7JEwd +@end example + +@node Integrating make, Features, Extending make, Top +@chapter Integrating GNU @code{make} +@cindex make integration + +GNU @code{make} is often one component in a larger system of tools, +including integrated development environments, compiler toolchains, +and others. The role of @code{make} is to start commands and +determine whether they succeeded or not: no special integration is +needed to accomplish that. However, sometimes it is convenient to +bind @code{make} more tightly with other parts of the system, both +higher-level (tools that invoke @code{make}) and lower-level (tools +that @code{make} invokes). + +@menu +* Job Slots:: Share job slots with GNU @code{make}. +* Terminal Output:: Control output to terminals. +@end menu + +@node Job Slots, Terminal Output, Integrating make, Integrating make +@section Sharing Job Slots with GNU @code{make} +@cindex job slots, sharing +@cindex tools, sharing job slots + +GNU @code{make} has the ability to run multiple recipes in parallel +(@pxref{Parallel, ,Parallel Execution}) and to cap the total number of +parallel jobs even across recursive invocations of @code{make} +(@pxref{Options/Recursion, ,Communicating Options to a +Sub-@code{make}}). Tools that @code{make} invokes which are also able +to run multiple operations in parallel, either using multiple threads +or multiple processes, can be enhanced to participate in GNU +@code{make}'s job management facility to ensure that the total number +of active threads/processes running on the system does not exceed the +maximum number of slots provided to GNU @code{make}. @refill + +@cindex jobserver +GNU @code{make} uses a method called the ``jobserver'' to control the +number of active jobs across recursive invocations. The actual +implementation of the jobserver varies across different operating +systems, but some fundamental aspects are always true. + +First, only command lines that @code{make} understands to be recursive +invocations of @code{make} (@pxref{MAKE Variable, ,How the @code{MAKE} +Variable Works}) will have access to the jobserver. When writing +makefiles you must be sure to mark the command as recursive (most +commonly by prefixing the command line with the @code{+} indicator +(@pxref{Recursion, ,Recursive Use of @code{make}}). + +Second, @code{make} will provide information necessary for accessing +the jobserver through the environment to its children, in the +@code{MAKEFLAGS} environment variable. Tools which want to +participate in the jobserver protocol will need to parse this +environment variable, as described in subsequent sections. + +Third, every command @code{make} starts has one implicit job slot +reserved for it before it starts. Any tool which wants to participate +in the jobserver protocol should assume it can always run one job +without having to contact the jobserver at all. + +Finally, it's critical that tools that participate in the jobserver +protocol return the exact number of slots they obtained from the +jobserver back to the jobserver before they exit, even under error +conditions. Remember that the implicit job slot should @strong{not} +be returned to the jobserver! Returning too few slots means that +those slots will be lost for the rest of the build process; returning +too many slots means that extra slots will be available. The +top-level @code{make} command will print an error message at the end +of the build if it detects an incorrect number of slots available in +the jobserver. + +As an example, suppose you are implementing a linker which provides +for multithreaded operation. You would like to enhance the linker so +that if it is invoked by GNU @code{make} it can participate in the +jobserver protocol to control how many threads are used during link. +First you will need to modify the linker to determine if the +@code{MAKEFLAGS} environment variable is set. Next you will need to +parse the value of that variable to determine if the jobserver is +available, and how to access it. If it is available then you can +access it to obtain job slots controlling how much parallelism your +tool can use. Once done your tool must return those job slots back to +the jobserver. + +@menu +* POSIX Jobserver:: Using the jobserver on POSIX systems. +* Windows Jobserver:: Using the jobserver on Windows systems. +@end menu + +@node POSIX Jobserver, Windows Jobserver, Job Slots, Job Slots +@subsection POSIX Jobserver Interaction +@cindex jobserver on POSIX + +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. 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 +@samp{R} and @samp{W} are non-negative integers representing file +descriptors: @samp{R} is the read file descriptor and @samp{W} is the +write file descriptor. + +It's important that when you release the job slot, you write back the +same character you read from the pipe for that slot. Don't assume +that all tokens are the same character; different characters may have +different meanings to GNU @code{make}. The order is not important, +since @code{make} has no idea in what order jobs will complete anyway. + +There are various error conditions you must consider to ensure your +implementation is robust: + +@itemize @bullet +@item +Usually you will have a command-line argument controlling the parallel +operation of your tool. Consider whether your tool should detect +situations where both the jobserver and the command-line argument are +specified, and how it should react. + +@item +If your tool determines that the @code{--jobserver-auth} option is +available in @code{MAKEFLAGS} but that the file descriptors specified +are closed, this means that the calling @code{make} process did not +think that your tool was a recursive @code{make} invocation (e.g., the +command line was not prefixed with a @code{+} character). You should +notify your users of this situation. + +@item +Your tool should also examine the first word of the @code{MAKEFLAGS} +variable and look for the character @code{n}. If this character is +present then @code{make} was invoked with the @samp{-n} option and +your tool should stop without performing any operations. + +@item +Your tool should be sure to write back the tokens it read, even under +error conditions. This includes not only errors in your tool but also +outside influences such as interrupts (@code{SIGINT}), etc. You may +want to install signal handlers to manage this write-back. +@end itemize + +@node Windows Jobserver, , POSIX Jobserver, Job Slots +@subsection Windows Jobserver Interaction +@cindex jobserver on Windows + +On Windows systems the jobserver is implemented as a named semaphore. +The semaphore will be set with an initial count equal to the number of +available slots; to obtain a slot you must wait on the semaphore (with +or without a timeout). To release a slot, release the semaphore. + +To access the semaphore you must parse the @code{MAKEFLAGS} variable and +look for the argument string @code{--jobserver-auth=NAME} where +@samp{NAME} is the name of the named semaphore. Use this name with +@code{OpenSemaphore} to create a handle to the semaphore. + +There are various error conditions you must consider to ensure your +implementation is robust: + +@itemize @bullet +@item +Usually you will have a command-line argument controlling the parallel +operation of your tool. Consider whether your tool should detect +situations where both the jobserver and the command-line argument are +specified, and how it should react. + +@item +Your tool should be sure to release the semaphore for the tokens it +read, even under error conditions. This includes not only errors in +your tool but also outside influences such as interrupts +(@code{SIGINT}), etc. You may want to install signal handlers to +manage this write-back. +@end itemize + +@node Terminal Output, , Job Slots, Integrating make +@section Synchronized Terminal Output +@cindex parallel output to terminal +@cindex terminal, output to + +Normally GNU @code{make} will invoke all commands with access to the +same standard and error outputs that @code{make} itself was started +with. A number of tools will detect whether the output is a terminal +or not-a-terminal, and use this information to change the output +style. For example if the output goes to a terminal the tool may add +control characters that set color, or even change the location of the +cursor. If the output is not going to a terminal then these special +control characters are not emitted so that they don't corrupt log +files, etc. + +The @code{--output-sync} (@pxref{Parallel Output, ,Output During +Parallel Output}) option will defeat the terminal detection. When +output synchronization is enabled GNU @code{make} arranges for all +command output to be written to a file, so that its output can be +written as a block without interference from other commands. This +means that all tools invoked by @code{make} will believe that their +output is not going to be displayed on a terminal, even when it will +be (because @code{make} will display it there after the command is +completed). + +In order to facilitate tools which would like to determine whether or +not their output will be displayed on a terminal, GNU @code{make} will +set the @code{MAKE_TERMOUT} and @code{MAKE_TERMERR} environment +variables before invoking any commands. Tools which would like to +determine whether standard or error output (respectively) will be +displayed on a terminal can check these environment variables to +determine if they exist and contain a non-empty value. If so the tool +can assume that the output will (eventually) be displayed on a +terminal. If the variables are not set or have an empty value, then +the tool should fall back to its normal methods of detecting whether +output is going to a terminal or not. + +The content of the variables can be parsed to determine the type of +terminal which will be used to display the output. + +Similarly, environments which invoke @code{make} and would like to +capture the output and eventually display it on a terminal (or some +display which can interpret terminal control characters) can set these +variables before invoking @code{make}. GNU @code{make} will not +modify these environment variables if they already exist when it +starts. + +@node Features, Missing, Integrating make, Top +@chapter Features of GNU @code{make} +@cindex features of GNU @code{make} +@cindex portability +@cindex compatibility + +Here is a summary of the features of GNU @code{make}, for comparison +with and credit to other versions of @code{make}. We consider the +features of @code{make} in 4.2 BSD systems as a baseline. If you are +concerned with writing portable makefiles, you should not use the +features of @code{make} listed here, nor the ones in @ref{Missing}. + +Many features come from the version of @code{make} in System V. + +@itemize @bullet +@item +The @code{VPATH} variable and its special meaning. +@xref{Directory Search, , Searching Directories for Prerequisites}. +This feature exists in System V @code{make}, but is undocumented. +It is documented in 4.3 BSD @code{make} (which says it mimics System V's +@code{VPATH} feature).@refill + +@item +Included makefiles. @xref{Include, ,Including Other Makefiles}. +Allowing multiple files to be included with a single directive is a GNU +extension. + +@item +Variables are read from and communicated via the environment. +@xref{Environment, ,Variables from the Environment}. + +@item +Options passed through the variable @code{MAKEFLAGS} to recursive +invocations of @code{make}. +@xref{Options/Recursion, ,Communicating Options to a Sub-@code{make}}. + +@item +The automatic variable @code{$%} is set to the member name +in an archive reference. @xref{Automatic Variables}. + +@item +The automatic variables @code{$@@}, @code{$*}, @code{$<}, @code{$%}, +and @code{$?} have corresponding forms like @code{$(@@F)} and +@code{$(@@D)}. We have generalized this to @code{$^} as an obvious +extension. @xref{Automatic Variables}.@refill + +@item +Substitution variable references. +@xref{Reference, ,Basics of Variable References}. + +@item +The command line options @samp{-b} and @samp{-m}, accepted and +ignored. In System V @code{make}, these options actually do something. + +@item +Execution of recursive commands to run @code{make} via the variable +@code{MAKE} even if @samp{-n}, @samp{-q} or @samp{-t} is specified. +@xref{Recursion, ,Recursive Use of @code{make}}. + +@item +Support for suffix @samp{.a} in suffix rules. @xref{Archive Suffix +Rules}. This feature is obsolete in GNU @code{make}, because the +general feature of rule chaining (@pxref{Chained Rules, ,Chains of +Implicit Rules}) allows one pattern rule for installing members in an +archive (@pxref{Archive Update}) to be sufficient. + +@item +The arrangement of lines and backslash/newline combinations in +recipes is retained when the recipes are printed, so they appear as +they do in the makefile, except for the stripping of initial +whitespace. +@end itemize + +The following features were inspired by various other versions of +@code{make}. In some cases it is unclear exactly which versions inspired +which others. + +@itemize @bullet +@item +Pattern rules using @samp{%}. +This has been implemented in several versions of @code{make}. +We're not sure who invented it first, but it's been spread around a bit. +@xref{Pattern Rules, ,Defining and Redefining Pattern Rules}.@refill + +@item +Rule chaining and implicit intermediate files. +This was implemented by Stu Feldman in his version of @code{make} +for AT&T Eighth Edition Research Unix, and later by Andrew Hume of +AT&T Bell Labs in his @code{mk} program (where he terms it +``transitive closure''). We do not really know if +we got this from either of them or thought it up ourselves at the +same time. @xref{Chained Rules, ,Chains of Implicit Rules}. + +@item +The automatic variable @code{$^} containing a list of all prerequisites +of the current target. We did not invent this, but we have no idea who +did. @xref{Automatic Variables}. The automatic variable +@code{$+} is a simple extension of @code{$^}. + +@item +The ``what if'' flag (@samp{-W} in GNU @code{make}) was (as far as we know) +invented by Andrew Hume in @code{mk}. +@xref{Instead of Execution, ,Instead of Executing Recipes}. + +@item +The concept of doing several things at once (parallelism) exists in +many incarnations of @code{make} and similar programs, though not in the +System V or BSD implementations. @xref{Execution, ,Recipe Execution}. + +@item +A number of different build tools that support parallelism also +support collecting output and displaying as a single block. +@xref{Parallel Output, ,Output During Parallel Execution}. + +@item +Modified variable references using pattern substitution come from +SunOS 4. @xref{Reference, ,Basics of Variable References}. +This functionality was provided in GNU @code{make} by the +@code{patsubst} function before the alternate syntax was implemented +for compatibility with SunOS 4. It is not altogether clear who +inspired whom, since GNU @code{make} had @code{patsubst} before SunOS +4 was released.@refill + +@item +The special significance of @samp{+} characters preceding recipe lines +(@pxref{Instead of Execution, ,Instead of Executing Recipes}) is +mandated by @cite{IEEE Standard 1003.2-1992} (POSIX.2). + +@item +The @samp{+=} syntax to append to the value of a variable comes from SunOS +4 @code{make}. @xref{Appending, , Appending More Text to Variables}. + +@item +The syntax @w{@samp{@var{archive}(@var{mem1} @var{mem2}@dots{})}} to list +multiple members in a single archive file comes from SunOS 4 @code{make}. +@xref{Archive Members}. + +@item +The @code{-include} directive to include makefiles with no error for a +nonexistent file comes from SunOS 4 @code{make}. (But note that SunOS 4 +@code{make} does not allow multiple makefiles to be specified in one +@code{-include} directive.) The same feature appears with the name +@code{sinclude} in SGI @code{make} and perhaps others. + +@item +The @code{!=} shell assignment operator exists in many BSD of +@code{make} and is purposefully implemented here to behave identically +to those implementations. + +@item +Various build management tools are implemented using scripting +languages such as Perl or Python and thus provide a natural embedded +scripting language, similar to GNU @code{make}'s integration of GNU +Guile. +@end itemize + +The remaining features are inventions new in GNU @code{make}: + +@itemize @bullet +@item +Use the @samp{-v} or @samp{--version} option to print version and +copyright information. + +@item +Use the @samp{-h} or @samp{--help} option to summarize the options to +@code{make}. + +@item +Simply-expanded variables. @xref{Flavors, ,The Two Flavors of Variables}. + +@item +Pass command line variable assignments automatically through the +variable @code{MAKE} to recursive @code{make} invocations. +@xref{Recursion, ,Recursive Use of @code{make}}. + +@item +Use the @samp{-C} or @samp{--directory} command option to change +directory. @xref{Options Summary, ,Summary of Options}. + +@item +Make verbatim variable definitions with @code{define}. +@xref{Multi-Line, ,Defining Multi-Line Variables}. + +@item +Declare phony targets with the special target @code{.PHONY}. + +Andrew Hume of AT&T Bell Labs implemented a similar feature with a +different syntax in his @code{mk} program. This seems to be a case of +parallel discovery. @xref{Phony Targets, ,Phony Targets}. + +@item +Manipulate text by calling functions. +@xref{Functions, ,Functions for Transforming Text}. + +@item +Use the @samp{-o} or @samp{--old-file} +option to pretend a file's modification-time is old. +@xref{Avoiding Compilation, ,Avoiding Recompilation of Some Files}. + +@item +Conditional execution. + +This feature has been implemented numerous times in various versions +of @code{make}; it seems a natural extension derived from the features +of the C preprocessor and similar macro languages and is not a +revolutionary concept. @xref{Conditionals, ,Conditional Parts of Makefiles}. + +@item +Specify a search path for included makefiles. +@xref{Include, ,Including Other Makefiles}. + +@item +Specify extra makefiles to read with an environment variable. +@xref{MAKEFILES Variable, ,The Variable @code{MAKEFILES}}. + +@item +Strip leading sequences of @samp{./} from file names, so that +@file{./@var{file}} and @file{@var{file}} are considered to be the +same file.@refill + +@item +Use a special search method for library prerequisites written in the +form @samp{-l@var{name}}. +@xref{Libraries/Search, ,Directory Search for Link Libraries}. + +@item +Allow suffixes for suffix rules +(@pxref{Suffix Rules, ,Old-Fashioned Suffix Rules}) to contain any +characters. In other versions of @code{make}, they must begin with +@samp{.} and not contain any @samp{/} characters. + +@item +Keep track of the current level of @code{make} recursion using the +variable @code{MAKELEVEL}. @xref{Recursion, ,Recursive Use of @code{make}}. + +@item +Provide any goals given on the command line in the variable +@code{MAKECMDGOALS}. @xref{Goals, ,Arguments to Specify the Goals}. + +@item +Specify static pattern rules. @xref{Static Pattern, ,Static Pattern Rules}. + +@item +Provide selective @code{vpath} search. +@xref{Directory Search, ,Searching Directories for Prerequisites}. + +@item +Provide computed variable references. +@xref{Reference, ,Basics of Variable References}. + +@item +Update makefiles. @xref{Remaking Makefiles, ,How Makefiles Are Remade}. +System V @code{make} has a very, very limited form of this +functionality in that it will check out SCCS files for makefiles. + +@item +Various new built-in implicit rules. +@xref{Catalogue of Rules, ,Catalogue of Built-In Rules}. + +@item +Load dynamic objects which can modify the behavior of @code{make}. +@xref{Loading Objects, ,Loading Dynamic Objects}. +@end itemize + +@node Missing, Makefile Conventions, Features, Top +@chapter Incompatibilities and Missing Features +@cindex incompatibilities +@cindex missing features +@cindex features, missing + +The @code{make} programs in various other systems support a few features +that are not implemented in GNU @code{make}. The POSIX.2 standard +(@cite{IEEE Standard 1003.2-1992}) which specifies @code{make} does not +require any of these features.@refill + +@itemize @bullet +@item +A target of the form @samp{@var{file}((@var{entry}))} stands for a member +of archive file @var{file}. The member is chosen, not by name, but by +being an object file which defines the linker symbol @var{entry}.@refill + +This feature was not put into GNU @code{make} because of the +non-modularity of putting knowledge into @code{make} of the internal +format of archive file symbol tables. +@xref{Archive Symbols, ,Updating Archive Symbol Directories}. + +@item +Suffixes (used in suffix rules) that end with the character @samp{~} +have a special meaning to System V @code{make}; +they refer to the SCCS file that corresponds +to the file one would get without the @samp{~}. For example, the +suffix rule @samp{.c~.o} would make the file @file{@var{n}.o} from +the SCCS file @file{s.@var{n}.c}. For complete coverage, a whole +series of such suffix rules is required. +@xref{Suffix Rules, ,Old-Fashioned Suffix Rules}. + +In GNU @code{make}, this entire series of cases is handled by two +pattern rules for extraction from SCCS, in combination with the +general feature of rule chaining. +@xref{Chained Rules, ,Chains of Implicit Rules}. + +@item +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 unnecessary.@refill + +@item +In some Unix @code{make}s, the automatic variable @code{$*} appearing in +the prerequisites of a rule has the amazingly strange ``feature'' of +expanding to the full name of the @emph{target of that rule}. We cannot +imagine what went on in the minds of Unix @code{make} developers to do +this; it is utterly inconsistent with the normal definition of @code{$*}. +@vindex * @r{(automatic variable), unsupported bizarre usage} + +@item +In some Unix @code{make}s, implicit rule search (@pxref{Implicit +Rules, ,Using Implicit Rules}) is apparently done for @emph{all} +targets, not just those without recipes. This means you can +do:@refill + +@example +@group +foo.o: + cc -c foo.c +@end group +@end example + +@noindent +and Unix @code{make} will intuit that @file{foo.o} depends on +@file{foo.c}.@refill + +We feel that such usage is broken. The prerequisite properties of +@code{make} are well-defined (for GNU @code{make}, at least), +and doing such a thing simply does not fit the model.@refill + +@item +GNU @code{make} does not include any built-in implicit rules for +compiling or preprocessing EFL programs. If we hear of anyone who is +using EFL, we will gladly add them. + +@item +It appears that in SVR4 @code{make}, a suffix rule can be specified +with no recipe, and it is treated as if it had an empty recipe +(@pxref{Empty Recipes}). For example: + +@example +.c.a: +@end example + +@noindent +will override the built-in @file{.c.a} suffix rule. + +We feel that it is cleaner for a rule without a recipe to always simply +add to the prerequisite list for the target. The above example can be +easily rewritten to get the desired behavior in GNU @code{make}: + +@example +.c.a: ; +@end example + +@item +Some versions of @code{make} invoke the shell with the @samp{-e} flag, +except under @samp{-k} (@pxref{Testing, ,Testing the Compilation of a +Program}). The @samp{-e} flag tells the shell to exit as soon as any +program it runs returns a nonzero status. We feel it is cleaner to +write each line of the recipe to stand on its own and not require this +special treatment. +@end itemize + +@comment The makefile standards are in a separate file that is also +@comment included by standards.texi. +@include make-stds.texi + +@node Quick Reference, Error Messages, Makefile Conventions, Top +@appendix Quick Reference + +This appendix summarizes the directives, text manipulation functions, +and special variables which GNU @code{make} understands. +@xref{Special Targets}, @ref{Catalogue of Rules, ,Catalogue of Built-In Rules}, +and @ref{Options Summary, ,Summary of Options}, +for other summaries. + +Here is a summary of the directives GNU @code{make} recognizes: + +@table @code +@item define @var{variable} +@itemx define @var{variable} = +@itemx define @var{variable} := +@itemx define @var{variable} ::= +@itemx define @var{variable} += +@itemx define @var{variable} ?= +@itemx endef +Define multi-line variables.@* +@xref{Multi-Line}. + +@item undefine @var{variable} +Undefining variables.@* +@xref{Undefine Directive}. + +@item ifdef @var{variable} +@itemx ifndef @var{variable} +@itemx ifeq (@var{a},@var{b}) +@itemx ifeq "@var{a}" "@var{b}" +@itemx ifeq '@var{a}' '@var{b}' +@itemx ifneq (@var{a},@var{b}) +@itemx ifneq "@var{a}" "@var{b}" +@itemx ifneq '@var{a}' '@var{b}' +@itemx else +@itemx endif +Conditionally evaluate part of the makefile.@* +@xref{Conditionals}. + +@item include @var{file} +@itemx -include @var{file} +@itemx sinclude @var{file} +Include another makefile.@* +@xref{Include, ,Including Other Makefiles}. + +@item override @var{variable-assignment} +Define a variable, overriding any previous definition, even one from +the command line.@* +@xref{Override Directive, ,The @code{override} Directive}. + +@item export +Tell @code{make} to export all variables to child processes by default.@* +@xref{Variables/Recursion, , Communicating Variables to a Sub-@code{make}}. + +@item export @var{variable} +@itemx export @var{variable-assignment} +@itemx unexport @var{variable} +Tell @code{make} whether or not to export a particular variable to child +processes.@* +@xref{Variables/Recursion, , Communicating Variables to a Sub-@code{make}}. + +@item private @var{variable-assignment} +Do not allow this variable assignment to be inherited by prerequisites.@* +@xref{Suppressing Inheritance}. + +@item vpath @var{pattern} @var{path} +Specify a search path for files matching a @samp{%} pattern.@* +@xref{Selective Search, , The @code{vpath} Directive}. + +@item vpath @var{pattern} +Remove all search paths previously specified for @var{pattern}. + +@item vpath +Remove all search paths previously specified in any @code{vpath} +directive. +@end table + +Here is a summary of the built-in functions (@pxref{Functions}): + +@table @code +@item $(subst @var{from},@var{to},@var{text}) +Replace @var{from} with @var{to} in @var{text}.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(patsubst @var{pattern},@var{replacement},@var{text}) +Replace words matching @var{pattern} with @var{replacement} in @var{text}.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(strip @var{string}) +Remove excess whitespace characters from @var{string}.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(findstring @var{find},@var{text}) +Locate @var{find} in @var{text}.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(filter @var{pattern}@dots{},@var{text}) +Select words in @var{text} that match one of the @var{pattern} words.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(filter-out @var{pattern}@dots{},@var{text}) +Select words in @var{text} that @emph{do not} match any of the @var{pattern} words.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(sort @var{list}) +Sort the words in @var{list} lexicographically, removing duplicates.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(word @var{n},@var{text}) +Extract the @var{n}th word (one-origin) of @var{text}.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(words @var{text}) +Count the number of words in @var{text}.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(wordlist @var{s},@var{e},@var{text}) +Returns the list of words in @var{text} from @var{s} to @var{e}.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(firstword @var{names}@dots{}) +Extract the first word of @var{names}.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(lastword @var{names}@dots{}) +Extract the last word of @var{names}.@* +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@item $(dir @var{names}@dots{}) +Extract the directory part of each file name.@* +@xref{File Name Functions, ,Functions for File Names}. + +@item $(notdir @var{names}@dots{}) +Extract the non-directory part of each file name.@* +@xref{File Name Functions, ,Functions for File Names}. + +@item $(suffix @var{names}@dots{}) +Extract the suffix (the last @samp{.} and following characters) of each file name.@* +@xref{File Name Functions, ,Functions for File Names}. + +@item $(basename @var{names}@dots{}) +Extract the base name (name without suffix) of each file name.@* +@xref{File Name Functions, ,Functions for File Names}. + +@item $(addsuffix @var{suffix},@var{names}@dots{}) +Append @var{suffix} to each word in @var{names}.@* +@xref{File Name Functions, ,Functions for File Names}. + +@item $(addprefix @var{prefix},@var{names}@dots{}) +Prepend @var{prefix} to each word in @var{names}.@* +@xref{File Name Functions, ,Functions for File Names}. + +@item $(join @var{list1},@var{list2}) +Join two parallel lists of words.@* +@xref{File Name Functions, ,Functions for File Names}. + +@item $(wildcard @var{pattern}@dots{}) +Find file names matching a shell file name pattern (@emph{not} a +@samp{%} pattern).@* +@xref{Wildcard Function, ,The Function @code{wildcard}}. + +@item $(realpath @var{names}@dots{}) +For each file name in @var{names}, expand to an absolute name that +does not contain any @code{.}, @code{..}, nor symlinks.@* +@xref{File Name Functions, ,Functions for File Names}. + +@item $(abspath @var{names}@dots{}) +For each file name in @var{names}, expand to an absolute name that +does not contain any @code{.} or @code{..} components, but preserves +symlinks.@* +@xref{File Name Functions, ,Functions for File Names}. + +@item $(error @var{text}@dots{}) +When this function is evaluated, @code{make} generates a fatal error +with the message @var{text}.@* +@xref{Make Control Functions, ,Functions That Control Make}. + +@item $(warning @var{text}@dots{}) +When this function is evaluated, @code{make} generates a warning with +the message @var{text}.@* +@xref{Make Control Functions, ,Functions That Control Make}. + +@item $(shell @var{command}) +Execute a shell command and return its output.@* +@xref{Shell Function, , The @code{shell} Function}. + +@item $(origin @var{variable}) +Return a string describing how the @code{make} variable @var{variable} was +defined.@* +@xref{Origin Function, , The @code{origin} Function}. + +@item $(flavor @var{variable}) +Return a string describing the flavor of the @code{make} variable +@var{variable}.@* +@xref{Flavor Function, , The @code{flavor} Function}. + +@item $(foreach @var{var},@var{words},@var{text}) +Evaluate @var{text} with @var{var} bound to each word in @var{words}, +and concatenate the results.@* +@xref{Foreach Function, ,The @code{foreach} Function}. + +@item $(if @var{condition},@var{then-part}[,@var{else-part}]) +Evaluate the condition @var{condition}; if it's non-empty substitute +the expansion of the @var{then-part} otherwise substitute the +expansion of the @var{else-part}.@* +@xref{Conditional Functions, ,Functions for Conditionals}. + +@item $(or @var{condition1}[,@var{condition2}[,@var{condition3}@dots{}]]) +Evaluate each condition @var{conditionN} one at a time; substitute the +first non-empty expansion. If all expansions are empty, substitute +the empty string.@* +@xref{Conditional Functions, ,Functions for Conditionals}. + +@item $(and @var{condition1}[,@var{condition2}[,@var{condition3}@dots{}]]) +Evaluate each condition @var{conditionN} one at a time; if any +expansion results in the empty string substitute the empty string. If +all expansions result in a non-empty string, substitute the expansion +of the last @var{condition}.@* +@xref{Conditional Functions, ,Functions for Conditionals}. + +@item $(call @var{var},@var{param},@dots{}) +Evaluate the variable @var{var} replacing any references to @code{$(1)}, +@code{$(2)} with the first, second, etc.@: @var{param} values.@* +@xref{Call Function, ,The @code{call} Function}. + +@item $(eval @var{text}) +Evaluate @var{text} then read the results as makefile commands. +Expands to the empty string.@* +@xref{Eval Function, ,The @code{eval} Function}. + +@item $(file @var{op} @var{filename},@var{text}) +Expand the arguments, then open the file @var{filename} using mode +@var{op} and write @var{text} to that file.@* +@xref{File Function, ,The @code{file} Function}. + +@item $(value @var{var}) +Evaluates to the contents of the variable @var{var}, with no expansion +performed on it.@* +@xref{Value Function, ,The @code{value} Function}. +@end table + +Here is a summary of the automatic variables. +@xref{Automatic Variables}, +for full information. + +@table @code +@item $@@ +The file name of the target. + +@item $% +The target member name, when the target is an archive member. + +@item $< +The name of the first prerequisite. + +@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}). + +@item $^ +@itemx $+ +The names of all the prerequisites, with spaces between them. For +prerequisites which are archive members, only the named member is used +(@pxref{Archives}). The value of @code{$^} omits duplicate +prerequisites, while @code{$+} retains them and preserves their order. + +@item $* +The stem with which an implicit rule matches +(@pxref{Pattern Match, ,How Patterns Match}). + +@item $(@@D) +@itemx $(@@F) +The directory part and the file-within-directory part of @code{$@@}. + +@item $(*D) +@itemx $(*F) +The directory part and the file-within-directory part of @code{$*}. + +@item $(%D) +@itemx $(%F) +The directory part and the file-within-directory part of @code{$%}. + +@item $( tar-`sed -e '/version_string/!d' \ + -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ + -e q + version.c`.shar.Z +@end group + +@group +.PHONY: dist +dist: $(SRCS) $(AUX) + echo tar-`sed \ + -e '/version_string/!d' \ + -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ + -e q + version.c` > .fname + -rm -rf `cat .fname` + mkdir `cat .fname` + ln $(SRCS) $(AUX) `cat .fname` + tar chZf `cat .fname`.tar.Z `cat .fname` + -rm -rf `cat .fname` .fname +@end group + +@group +tar.zoo: $(SRCS) $(AUX) + -rm -rf tmp.dir + -mkdir tmp.dir + -rm tar.zoo + for X in $(SRCS) $(AUX) ; do \ + echo $$X ; \ + sed 's/$$/^M/' $$X \ + > tmp.dir/$$X ; done + cd tmp.dir ; zoo aM ../tar.zoo * + -rm -rf tmp.dir +@end group +@end example + +@node GNU Free Documentation License, Concept Index, Complex Makefile, Top +@appendix GNU Free Documentation License +@cindex FDL, GNU Free Documentation License +@include fdl.texi + +@node Concept Index, Name Index, GNU Free Documentation License, Top +@unnumbered Index of Concepts + +@printindex cp + +@node Name Index, , Concept Index, Top +@unnumbered Index of Functions, Variables, & Directives + +@printindex fn + +@bye diff --git a/third_party/make/doc/stamp-vti b/third_party/make/doc/stamp-vti new file mode 100644 index 00000000000..df1d34c1a3a --- /dev/null +++ b/third_party/make/doc/stamp-vti @@ -0,0 +1,4 @@ +@set UPDATED 19 January 2020 +@set UPDATED-MONTH January 2020 +@set EDITION 4.3 +@set VERSION 4.3 diff --git a/third_party/make/doc/version.texi b/third_party/make/doc/version.texi new file mode 100644 index 00000000000..df1d34c1a3a --- /dev/null +++ b/third_party/make/doc/version.texi @@ -0,0 +1,4 @@ +@set UPDATED 19 January 2020 +@set UPDATED-MONTH January 2020 +@set EDITION 4.3 +@set VERSION 4.3 diff --git a/third_party/make/lib/Makefile.am b/third_party/make/lib/Makefile.am new file mode 100644 index 00000000000..6e4c1f0221b --- /dev/null +++ b/third_party/make/lib/Makefile.am @@ -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 . +# +# 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 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 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 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 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 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 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 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 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 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 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 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 +# 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/third_party/make/lib/Makefile.in b/third_party/make/lib/Makefile.in new file mode 100644 index 00000000000..0e33730945c --- /dev/null +++ b/third_party/make/lib/Makefile.in @@ -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 . +# +# 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 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 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 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 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 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 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 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 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 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 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 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 +# 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/third_party/make/lib/_Noreturn.h b/third_party/make/lib/_Noreturn.h new file mode 100644 index 00000000000..0d4b9c29e02 --- /dev/null +++ b/third_party/make/lib/_Noreturn.h @@ -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 . */ + +#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/third_party/make/lib/access.c b/third_party/make/lib/access.c new file mode 100644 index 00000000000..ba515cc0ced --- /dev/null +++ b/third_party/make/lib/access.c @@ -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 . */ + +#include + +/* Specification. */ +#include + +#include +#include + +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/third_party/make/lib/alloca.c b/third_party/make/lib/alloca.c new file mode 100644 index 00000000000..d0476d53e6c --- /dev/null +++ b/third_party/make/lib/alloca.c @@ -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 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 + +#include + +#include +#include + +#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 +# 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/third_party/make/lib/alloca.in.h b/third_party/make/lib/alloca.in.h new file mode 100644 index 00000000000..c7187e66ae3 --- /dev/null +++ b/third_party/make/lib/alloca.in.h @@ -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 + . + */ + +/* 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 that causes trouble when + included after 'alloca' gets defined as a macro. As a workaround, include + this first and define 'alloca' as a macro afterwards. */ +# if (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@ +# include_next +# endif +# define alloca __builtin_alloca +# elif defined _AIX +# define alloca __alloca +# elif defined _MSC_VER +# include +# 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 +# else +# include +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +# endif +#endif + +#endif /* _GL_ALLOCA_H */ diff --git a/third_party/make/lib/arg-nonnull.h b/third_party/make/lib/arg-nonnull.h new file mode 100644 index 00000000000..ac26ca8cfed --- /dev/null +++ b/third_party/make/lib/arg-nonnull.h @@ -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 . */ + +/* _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/third_party/make/lib/basename-lgpl.c b/third_party/make/lib/basename-lgpl.c new file mode 100644 index 00000000000..565469ea3d1 --- /dev/null +++ b/third_party/make/lib/basename-lgpl.c @@ -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 . */ + +#include + +#include "dirname.h" + +#include + +/* 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/third_party/make/lib/c++defs.h b/third_party/make/lib/c++defs.h new file mode 100644 index 00000000000..7a057633883 --- /dev/null +++ b/third_party/make/lib/c++defs.h @@ -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 . */ + +#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(::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(::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((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 , + 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 , + 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/third_party/make/lib/close.c b/third_party/make/lib/close.c new file mode 100644 index 00000000000..0c8780dc24a --- /dev/null +++ b/third_party/make/lib/close.c @@ -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 . */ + +#include + +/* Specification. */ +#include + +#include + +#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/third_party/make/lib/concat-filename.c b/third_party/make/lib/concat-filename.c new file mode 100644 index 00000000000..367e41d22c9 --- /dev/null +++ b/third_party/make/lib/concat-filename.c @@ -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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "concat-filename.h" + +#include +#include +#include + +#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/third_party/make/lib/concat-filename.h b/third_party/make/lib/concat-filename.h new file mode 100644 index 00000000000..64b461e39d4 --- /dev/null +++ b/third_party/make/lib/concat-filename.h @@ -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 . */ + +#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/third_party/make/lib/dirname-lgpl.c b/third_party/make/lib/dirname-lgpl.c new file mode 100644 index 00000000000..27d4374c2e7 --- /dev/null +++ b/third_party/make/lib/dirname-lgpl.c @@ -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 . */ + +#include + +#include "dirname.h" + +#include +#include + +/* 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/third_party/make/lib/dirname.h b/third_party/make/lib/dirname.h new file mode 100644 index 00000000000..8c12d93b510 --- /dev/null +++ b/third_party/make/lib/dirname.h @@ -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 . */ + +#ifndef DIRNAME_H_ +# define DIRNAME_H_ 1 + +# include +# include +# 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/third_party/make/lib/dosname.h b/third_party/make/lib/dosname.h new file mode 100644 index 00000000000..57829600948 --- /dev/null +++ b/third_party/make/lib/dosname.h @@ -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 . + + 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/third_party/make/lib/dup2.c b/third_party/make/lib/dup2.c new file mode 100644 index 00000000000..88ef2591313 --- /dev/null +++ b/third_party/make/lib/dup2.c @@ -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 . */ + +/* written by Paul Eggert */ + +#include + +/* Specification. */ +#include + +#include +#include + +#if HAVE_DUP2 + +# undef dup2 + +# if defined _WIN32 && ! defined __CYGWIN__ + +/* Get declarations of the native Windows API functions. */ +# define WIN32_LEAN_AND_MEAN +# include + +# if HAVE_MSVC_INVALID_PARAMETER_HANDLER +# include "msvc-inval.h" +# endif + +/* Get _get_osfhandle. */ +# if GNULIB_MSVC_NOTHROW +# include "msvc-nothrow.h" +# else +# include +# 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 + +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/third_party/make/lib/errno.in.h b/third_party/make/lib/errno.in.h new file mode 100644 index 00000000000..c27e0c7ddee --- /dev/null +++ b/third_party/make/lib/errno.in.h @@ -0,0 +1,279 @@ +/* A POSIX-like . + + 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 . */ + +#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 . */ +# 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/third_party/make/lib/error.c b/third_party/make/lib/error.c new file mode 100644 index 00000000000..3657b51cdfe --- /dev/null +++ b/third_party/make/lib/error.c @@ -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 . */ + +/* Written by David MacKenzie . */ + +#if !_LIBC +# include +#endif + +#include "error.h" + +#include +#include +#include +#include + +#if !_LIBC && ENABLE_NLS +# include "gettext.h" +# define _(msgid) gettext (msgid) +#endif + +#ifdef _LIBC +# include +# include +# include +# include +# 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 +# include +# include + +/* 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 +# define fflush(s) _IO_fflush (s) +# undef putc +# define putc(c, fp) _IO_putc (c, fp) + +# include + +#else /* not _LIBC */ + +# include +# include + +# if defined _WIN32 && ! defined __CYGWIN__ +/* Get declarations of the native Windows API functions. */ +# define WIN32_LEAN_AND_MEAN +# include +/* Get _get_osfhandle. */ +# if GNULIB_MSVC_NOTHROW +# include "msvc-nothrow.h" +# else +# include +# 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 +} + +/* 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/third_party/make/lib/error.h b/third_party/make/lib/error.h new file mode 100644 index 00000000000..bad47a16dd2 --- /dev/null +++ b/third_party/make/lib/error.h @@ -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 . */ + +#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 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/third_party/make/lib/exitfail.c b/third_party/make/lib/exitfail.c new file mode 100644 index 00000000000..189fa16f46a --- /dev/null +++ b/third_party/make/lib/exitfail.c @@ -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 . */ + +#include + +#include "exitfail.h" + +#include + +int volatile exit_failure = EXIT_FAILURE; diff --git a/third_party/make/lib/exitfail.h b/third_party/make/lib/exitfail.h new file mode 100644 index 00000000000..a69a03bbd5b --- /dev/null +++ b/third_party/make/lib/exitfail.h @@ -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 . */ + +extern int volatile exit_failure; diff --git a/third_party/make/lib/fcntl.c b/third_party/make/lib/fcntl.c new file mode 100644 index 00000000000..6b9927ec4e5 --- /dev/null +++ b/third_party/make/lib/fcntl.c @@ -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 . */ + +/* Written by Eric Blake . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include +#include + +#ifdef __KLIBC__ +# define INCL_DOS +# include +#endif + +#if defined _WIN32 && ! defined __CYGWIN__ +/* Get declarations of the native Windows API functions. */ +# define WIN32_LEAN_AND_MEAN +# include + +/* Get _get_osfhandle. */ +# if GNULIB_MSVC_NOTHROW +# include "msvc-nothrow.h" +# else +# include +# 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/third_party/make/lib/fcntl.in.h b/third_party/make/lib/fcntl.in.h new file mode 100644 index 00000000000..b2e1e5130d9 --- /dev/null +++ b/third_party/make/lib/fcntl.in.h @@ -0,0 +1,392 @@ +/* Like , 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 . */ + +/* written by Paul Eggert */ + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +#if defined __need_system_fcntl_h +/* Special invocation convention. */ + +/* Needed before . + May also define off_t to a 64-bit type on native Windows. */ +#include +/* On some systems other than glibc, is a prerequisite of + . On glibc systems, we would like to avoid namespace pollution. + But on glibc systems, includes inside an + extern "C" { ... } block, which leads to errors in C++ mode with the + overridden 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 +#endif +#@INCLUDE_NEXT@ @NEXT_FCNTL_H@ + +/* Native Windows platforms declare open(), creat() in . */ +#if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \ + && (defined _WIN32 && ! defined __CYGWIN__) +# include +#endif + +#else +/* Normal invocation convention. */ + +#ifndef _@GUARD_PREFIX@_FCNTL_H + +/* Needed before . + May also define off_t to a 64-bit type on native Windows. */ +#include +/* On some systems other than glibc, is a prerequisite of + . On glibc systems, we would like to avoid namespace pollution. + But on glibc systems, includes inside an + extern "C" { ... } block, which leads to errors in C++ mode with the + overridden 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 +#endif +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_FCNTL_H@ + +/* Native Windows platforms declare open(), creat() in . */ +#if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \ + && (defined _WIN32 && ! defined __CYGWIN__) +# include +#endif + +#ifndef _@GUARD_PREFIX@_FCNTL_H +#define _@GUARD_PREFIX@_FCNTL_H + +#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */ +# include +#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 +# 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/third_party/make/lib/fd-hook.c b/third_party/make/lib/fd-hook.c new file mode 100644 index 00000000000..8840f634880 --- /dev/null +++ b/third_party/make/lib/fd-hook.c @@ -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 , 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 . */ + +#include + +/* Specification. */ +#include "fd-hook.h" + +#include + +/* 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/third_party/make/lib/fd-hook.h b/third_party/make/lib/fd-hook.h new file mode 100644 index 00000000000..ed1a15a230c --- /dev/null +++ b/third_party/make/lib/fd-hook.h @@ -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 . */ + + +#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/third_party/make/lib/filename.h b/third_party/make/lib/filename.h new file mode 100644 index 00000000000..d4c70203e66 --- /dev/null +++ b/third_party/make/lib/filename.h @@ -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 . */ + +#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/third_party/make/lib/findprog-in.c b/third_party/make/lib/findprog-in.c new file mode 100644 index 00000000000..c254f2f588e --- /dev/null +++ b/third_party/make/lib/findprog-in.c @@ -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 , 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 . */ + + +#include + +/* Specification. */ +#include "findprog.h" + +#include +#include +#include +#include +#include + +#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 . + 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/third_party/make/lib/findprog.h b/third_party/make/lib/findprog.h new file mode 100644 index 00000000000..aef62891441 --- /dev/null +++ b/third_party/make/lib/findprog.h @@ -0,0 +1,71 @@ +/* Locating a program in PATH. + Copyright (C) 2001-2003, 2009-2020 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _FINDPROG_H +#define _FINDPROG_H + +#include + +#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/third_party/make/lib/fnmatch.c b/third_party/make/lib/fnmatch.c new file mode 100644 index 00000000000..4da8c5fb651 --- /dev/null +++ b/third_party/make/lib/fnmatch.c @@ -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 +#endif + +/* Enable GNU extensions in fnmatch.h. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include +#include + +#if HAVE_STRING_H || defined _LIBC +# include +#else +# include +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include +#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: must be included before . */ +# include +# include +#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/third_party/make/lib/fnmatch.in.h b/third_party/make/lib/fnmatch.in.h new file mode 100644 index 00000000000..a788c8e1c7b --- /dev/null +++ b/third_party/make/lib/fnmatch.in.h @@ -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 . */ +#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/third_party/make/lib/getdtablesize.c b/third_party/make/lib/getdtablesize.c new file mode 100644 index 00000000000..0fe70921f9d --- /dev/null +++ b/third_party/make/lib/getdtablesize.c @@ -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 , 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 . */ + +#include + +/* Specification. */ +#include + +#if defined _WIN32 && ! defined __CYGWIN__ + +# include + +# 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 +# include + +# 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/third_party/make/lib/getloadavg.c b/third_party/make/lib/getloadavg.c new file mode 100644 index 00000000000..ebb6f5d5dba --- /dev/null +++ b/third_party/make/lib/getloadavg.c @@ -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 . */ + +/* 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 + +/* Specification. */ +#include + +#include +#include +#include + +# include + +# if HAVE_SYS_PARAM_H +# include +# 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 , which + conflicts with the definition understood in this file, that this + really is BSD. */ +# undef BSD + +/* NeXT defines FSCALE in . 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 +# include +# include +# include +/* Tru64 4.0D's table.h redefines sys */ +# undef sys +# endif + +# if defined (__osf__) && (defined (mips) || defined (__mips__)) +# define OSF_MIPS +# include +# 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 +/* 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 +# 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 +# else /* NLIST_STRUCT */ +# include +# endif /* NLIST_STRUCT */ + +# ifdef SUNOS_5 +# include +# include +# endif + +# if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) +# include +# 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 +# include +# else /* eunice */ +# include +# 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 +# include +# include +# 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 +# else +# include +# endif +# endif /* NeXT */ + +# ifdef sgi +# include +# endif /* sgi */ + +# ifdef UMAX +# include +# include +# include +# include + +# ifdef UMAX_43 +# include +# include +# include +# include +# include +# else /* Not UMAX_43. */ +# include +# include +# include +# include +# include +# include +# endif /* Not UMAX_43. */ +# endif /* UMAX */ + +# ifdef DGUX +# include +# endif + +# if (defined __linux__ || defined __ANDROID__ \ + || defined __CYGWIN__ || defined SUNOS_5 \ + || (defined LOAD_AVE_TYPE && ! defined __VMS)) +# include +# endif + +/* 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 */ + +/* 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/third_party/make/lib/getprogname.c b/third_party/make/lib/getprogname.c new file mode 100644 index 00000000000..9f69f5a5592 --- /dev/null +++ b/third_party/make/lib/getprogname.c @@ -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 . */ + +#include + +/* Specification. */ +#include "getprogname.h" + +#include /* get program_invocation_name declaration */ +#include /* get __argv declaration */ + +#ifdef _AIX +# include +# include +# include +#endif + +#ifdef __MVS__ +# ifndef _OPEN_SYS +# define _OPEN_SYS +# endif +# include +# include +#endif + +#ifdef __hpux +# include +# include +# include +# include +#endif + +#ifdef __sgi +# include +# include +# include +# include +# include +#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/third_party/make/lib/getprogname.h b/third_party/make/lib/getprogname.h new file mode 100644 index 00000000000..676912b4b84 --- /dev/null +++ b/third_party/make/lib/getprogname.h @@ -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 . */ + +#ifndef _GL_GETPROGNAME_H +#define _GL_GETPROGNAME_H + +#include + +#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/third_party/make/lib/gettext.h b/third_party/make/lib/gettext.h new file mode 100644 index 00000000000..0bd1e13348a --- /dev/null +++ b/third_party/make/lib/gettext.h @@ -0,0 +1,301 @@ +/* Convenience header for conditional use of GNU . + 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 . */ + +#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 + +/* 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 a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + , which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include +# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H +# include +# 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 + +/* 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 +#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/third_party/make/lib/glob.c b/third_party/make/lib/glob.c new file mode 100644 index 00000000000..adad16fa6dd --- /dev/null +++ b/third_party/make/lib/glob.c @@ -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 +#endif + +/* Enable GNU extensions in glob.h. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include +#include + +/* Outcomment the following line for production quality code. */ +/* #define NDEBUG 1 */ +#include + +#include /* 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 +# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + +#if defined STDC_HEADERS || defined __GNU_LIBRARY__ +# include +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +# ifndef POSIX +# ifdef _POSIX_VERSION +# define POSIX +# endif +# endif +#endif + +#if !defined _AMIGA && !defined VMS && !defined WINDOWS32 +# include +#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 +# define NAMLEN(dirent) strlen((dirent)->d_name) +#else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# ifdef HAVE_SYS_NDIR_H +# include +# endif +# ifdef HAVE_SYS_DIR_H +# include +# endif +# ifdef HAVE_NDIR_H +# include +# endif +# ifdef HAVE_VMSDIR_H +# include "vmsdir.h" +# endif /* HAVE_VMSDIR_H */ +#endif + + +/* In GNU systems, 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 +# include +# define ANSI_STRING +#else /* No standard headers. */ + +extern char *getenv (); + +# ifdef HAVE_STRING_H +# include +# define ANSI_STRING +# else +# include +# endif +# ifdef HAVE_MEMORY_H +# include +# 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 +# else /* Not HAVE_ALLOCA_H. */ +# ifndef _AIX +# ifdef WINDOWS32 +# include +# 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 to take precedence. */ +#ifndef __GNU_LIBRARY__ +# undef FNM_PATHNAME +# undef FNM_NOESCAPE +# undef FNM_PERIOD +#endif +#include + +/* Some system header files erroneously define these. + We want our own definitions from 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 + +#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 + +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/third_party/make/lib/glob.in.h b/third_party/make/lib/glob.in.h new file mode 100644 index 00000000000..0992de36d2d --- /dev/null +++ b/third_party/make/lib/glob.in.h @@ -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/third_party/make/lib/intprops.h b/third_party/make/lib/intprops.h new file mode 100644 index 00000000000..dfbcaae73e3 --- /dev/null +++ b/third_party/make/lib/intprops.h @@ -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 . */ + +/* Written by Paul Eggert. */ + +#ifndef _GL_INTPROPS_H +#define _GL_INTPROPS_H + +#include + +/* 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 + . */ +#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__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__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 + . */ +#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 . */ +# 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__OVERFLOW macros return 1 if the corresponding C operators + might not yield numerically correct answers due to arithmetic overflow. + The INT__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 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 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 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 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 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/third_party/make/lib/limits.in.h b/third_party/make/lib/limits.in.h new file mode 100644 index 00000000000..90c273fa178 --- /dev/null +++ b/third_party/make/lib/limits.in.h @@ -0,0 +1,104 @@ +/* A GNU-like . + + 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 . */ + +#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/third_party/make/lib/malloc.c b/third_party/make/lib/malloc.c new file mode 100644 index 00000000000..7232f1e38af --- /dev/null +++ b/third_party/make/lib/malloc.c @@ -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 . */ + +/* written by Jim Meyering and Bruno Haible */ + +#define _GL_USE_STDLIB_ALLOC 1 +#include +/* 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 + +#include + +/* 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/third_party/make/lib/msvc-inval.c b/third_party/make/lib/msvc-inval.c new file mode 100644 index 00000000000..863668889c6 --- /dev/null +++ b/third_party/make/lib/msvc-inval.c @@ -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 . */ + +#include + +/* 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 + +# 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 + +# 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 ¬_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 = ¬_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/third_party/make/lib/msvc-inval.h b/third_party/make/lib/msvc-inval.h new file mode 100644 index 00000000000..93ee7859ca9 --- /dev/null +++ b/third_party/make/lib/msvc-inval.h @@ -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 . */ + +#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 + { + + } + CATCH_MSVC_INVAL + { + + } + 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 + +/* Gnulib can define its own status codes, as described in the page + "Raising Software Exceptions" on microsoft.com + . + 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 + . + 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 + +# 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/third_party/make/lib/msvc-nothrow.c b/third_party/make/lib/msvc-nothrow.c new file mode 100644 index 00000000000..bf93b882412 --- /dev/null +++ b/third_party/make/lib/msvc-nothrow.c @@ -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 . */ + +#include + +/* Specification. */ +#include "msvc-nothrow.h" + +/* Get declarations of the native Windows API functions. */ +#define WIN32_LEAN_AND_MEAN +#include + +#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/third_party/make/lib/msvc-nothrow.h b/third_party/make/lib/msvc-nothrow.h new file mode 100644 index 00000000000..fca541573fc --- /dev/null +++ b/third_party/make/lib/msvc-nothrow.h @@ -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 . */ + +#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 + +# 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/third_party/make/lib/stdbool.in.h b/third_party/make/lib/stdbool.in.h new file mode 100644 index 00000000000..baacf98a38b --- /dev/null +++ b/third_party/make/lib/stdbool.in.h @@ -0,0 +1,132 @@ +/* Copyright (C) 2001-2003, 2006-2020 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _GL_STDBOOL_H +#define _GL_STDBOOL_H + +/* ISO C 99 for platforms that lack it. */ + +/* Usage suggestions: + + Programs that use should be aware of some limitations + and standards compliance issues. + + Standards compliance: + + - 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: + + - 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 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 /* 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 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/third_party/make/lib/stddef.in.h b/third_party/make/lib/stddef.in.h new file mode 100644 index 00000000000..2e50a1f01e8 --- /dev/null +++ b/third_party/make/lib/stddef.in.h @@ -0,0 +1,121 @@ +/* A substitute for POSIX 2008 , 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 . */ + +/* Written by Eric Blake. */ + +/* + * POSIX 2008 for platforms that have issues. + * + */ + +#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 that blindly + redefines NULL even when __need_wint_t was defined, even though + wint_t is not normally provided by . 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 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 +#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/third_party/make/lib/stdint.in.h b/third_party/make/lib/stdint.in.h new file mode 100644 index 00000000000..994c0c777c0 --- /dev/null +++ b/third_party/make/lib/stdint.in.h @@ -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 . */ + +/* + * ISO C 99 for platforms that lack it. + * + */ + +#ifndef _@GUARD_PREFIX@_STDINT_H + +#if __GNUC__ >= 3 +@PRAGMA_SYSTEM_HEADER@ +#endif +@PRAGMA_COLUMNS@ + +/* When including a system file that in turn includes , + use the system , not our substitute. This avoids + problems with (for example) VMS, whose includes + . */ +#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H + +/* On Android (Bionic libc), includes this file before + having defined 'time_t'. Therefore in this case avoid including + other system header files; just include the system's . + Ideally we should test __BIONIC__ here, but it is only defined after + 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 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 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 . + Include it before , since any "#include " + in 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 + +/* Override WINT_MIN and WINT_MAX if gnulib's or 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@ + +/* defines some of the stdint.h types as well, on glibc, + IRIX 6.5, and OpenBSD 3.8 (via ). + AIX 5.2 isn't needed and causes troubles. + Mac OS X 10.4.6 includes (which is us), but + relies on the system definitions, so include + after @NEXT_STDINT_H@. */ +# if @HAVE_SYS_TYPES_H@ && ! defined _AIX +# include +# endif + +# if @HAVE_INTTYPES_H@ + /* In OpenBSD 3.8, includes , which defines + int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__. + also defines intptr_t and uintptr_t. */ +# include +# elif @HAVE_SYS_INTTYPES_H@ + /* Solaris 7 has the types except the *_fast*_t types, and + the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */ +# include +# endif + +# if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__ + /* Linux libc4 >= 4.6.7 and libc5 have a that defines + int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is + included by . */ +# include +# 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 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 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 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 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 . */ +# 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 + -> -> -> , and the latter includes + 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: , and must be + included before . */ +# include +# include +# include +# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H +# include +# 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 or 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/third_party/make/lib/stdio.in.h b/third_party/make/lib/stdio.in.h new file mode 100644 index 00000000000..ebcbfaf5e77 --- /dev/null +++ b/third_party/make/lib/stdio.in.h @@ -0,0 +1,1444 @@ +/* A GNU-like . + + 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 . */ + +#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 + -> -> -> -> + -> -> -> . + 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 + +#include + +/* 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 + +/* 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 , not in . */ +/* But in any case avoid namespace pollution on glibc systems. */ +#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \ + && ! defined __GLIBC__ +# include +#endif + +/* Android 4.3 declares renameat in , not in . */ +/* But in any case avoid namespace pollution on glibc systems. */ +#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \ + && ! defined __GLIBC__ +# include +#endif + +/* MSVC declares 'perror' in , not in . 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 +#endif + +/* MSVC declares 'remove' in , not in . We must include + it before we #define remove rpl_remove. */ +/* MSVC declares 'rename' in , not in . 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 +#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., + . + 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 + , + 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/third_party/make/lib/stdlib.in.h b/third_party/make/lib/stdlib.in.h new file mode 100644 index 00000000000..e088959b285 --- /dev/null +++ b/third_party/make/lib/stdlib.in.h @@ -0,0 +1,1112 @@ +/* A GNU-like . + + 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 . */ + +#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 + +/* MirBSD 10 defines WEXITSTATUS in , not in . */ +#if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS +# include +#endif + +/* Solaris declares getloadavg() in . */ +#if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@ +/* OpenIndiana has a bug: must be included before + . */ +# include +# include +#endif + +/* Native Windows platforms declare mktemp() in . */ +#if 0 && (defined _WIN32 && ! defined __CYGWIN__) +# include +#endif + +#if @GNULIB_RANDOM_R@ + +/* OSF/1 5.1 declares 'struct random_data' in , which is included + from if _REENTRANT is defined. Include it whenever we need + 'struct random_data'. */ +# if @HAVE_RANDOM_H@ +# include +# endif + +# if !@HAVE_STRUCT_RANDOM_DATA@ || @REPLACE_RANDOM_R@ || !@HAVE_RANDOM_R@ +# include +# endif + +# if !@HAVE_STRUCT_RANDOM_DATA@ +/* Define 'struct random_data'. + But allow multiple gnulib generated 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 declares mkstemp. */ +/* On Mac OS X 10.5, only declares mkstemps. */ +/* On Mac OS X 10.13, only declares mkostemp and mkostemps. */ +/* On Cygwin 1.7.1, only declares getsubopt. */ +/* But avoid namespace pollution on glibc systems and native Windows. */ +# include +#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 ) + 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 ) + 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/third_party/make/lib/stpcpy.c b/third_party/make/lib/stpcpy.c new file mode 100644 index 00000000000..58265f0b797 --- /dev/null +++ b/third_party/make/lib/stpcpy.c @@ -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 . */ + +#include + +#include + +#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/third_party/make/lib/strerror-override.c b/third_party/make/lib/strerror-override.c new file mode 100644 index 00000000000..61b7689fd81 --- /dev/null +++ b/third_party/make/lib/strerror-override.c @@ -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 . */ + +/* Written by Bruno Haible , 2010. */ + +#include + +#include "strerror-override.h" + +#include + +#if GNULIB_defined_EWINSOCK /* native Windows platforms */ +# if HAVE_WINSOCK2_H +# include +# 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 */ + 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 */ + 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/third_party/make/lib/strerror-override.h b/third_party/make/lib/strerror-override.h new file mode 100644 index 00000000000..062f51cf6ba --- /dev/null +++ b/third_party/make/lib/strerror-override.h @@ -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 . */ + +#ifndef _GL_STRERROR_OVERRIDE_H +# define _GL_STRERROR_OVERRIDE_H + +# include +# include + +/* 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/third_party/make/lib/strerror.c b/third_party/make/lib/strerror.c new file mode 100644 index 00000000000..1a53a8b9277 --- /dev/null +++ b/third_party/make/lib/strerror.c @@ -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 . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include + +#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/third_party/make/lib/string.in.h b/third_party/make/lib/string.in.h new file mode 100644 index 00000000000..2c04e5f4f71 --- /dev/null +++ b/third_party/make/lib/string.in.h @@ -0,0 +1,1067 @@ +/* A GNU-like . + + 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 . */ + +#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" + 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 + +/* MirBSD defines mbslen as a macro. */ +#if @GNULIB_MBSLEN@ && defined __MirBSD__ +# include +#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 , not in . */ +/* But in any case avoid namespace pollution on glibc systems. */ +#if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \ + && ! defined __GLIBC__ +# include +#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/third_party/make/lib/stripslash.c b/third_party/make/lib/stripslash.c new file mode 100644 index 00000000000..6818b306141 --- /dev/null +++ b/third_party/make/lib/stripslash.c @@ -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 . */ + +#include + +#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/third_party/make/lib/sys_types.in.h b/third_party/make/lib/sys_types.in.h new file mode 100644 index 00000000000..e7e1a22ee5e --- /dev/null +++ b/third_party/make/lib/sys_types.in.h @@ -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 . */ + +#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 . */ +# 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 , not in . */ +/* But avoid namespace pollution on glibc systems. */ +#if (defined _WIN32 && ! defined __CYGWIN__) && ! defined __GLIBC__ +# include +#endif + +#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */ +#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */ +#endif /* __need_XXX */ diff --git a/third_party/make/lib/unistd.c b/third_party/make/lib/unistd.c new file mode 100644 index 00000000000..72bad1c0527 --- /dev/null +++ b/third_party/make/lib/unistd.c @@ -0,0 +1,4 @@ +#include +#define _GL_UNISTD_INLINE _GL_EXTERN_INLINE +#include "unistd.h" +typedef int dummy; diff --git a/third_party/make/lib/unistd.in.h b/third_party/make/lib/unistd.in.h new file mode 100644 index 00000000000..7909416f366 --- /dev/null +++ b/third_party/make/lib/unistd.in.h @@ -0,0 +1,1719 @@ +/* Substitute for and wrapper around . + 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 . */ + +#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 + -> -> -> + 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 +# 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 +#endif + +/* mingw doesn't define the SEEK_* or *_FILENO macros in . */ +/* MSVC declares 'unlink' in , not in . We must include + it before we #define unlink rpl_unlink. */ +/* Cygwin 1.7.1 declares symlinkat in , not in . */ +/* 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 +#endif + +/* Cygwin 1.7.1 and Android 4.3 declare unlinkat in , not in + . */ +/* But avoid namespace pollution on glibc systems. */ +#if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) \ + && (defined __CYGWIN__ || defined __ANDROID__) \ + && ! defined __GLIBC__ +# include +#endif + +/* mingw fails to declare _exit in . */ +/* mingw, MSVC, BeOS, Haiku declare environ in , not in + . */ +/* Solaris declares getcwd not only in but also in . */ +/* OSF Tru64 Unix cannot see gnulib rpl_strtod when system is + included here. */ +/* But avoid namespace pollution on glibc systems. */ +#if !defined __GLIBC__ && !defined __osf__ +# define __need_system_stdlib_h +# include +# undef __need_system_stdlib_h +#endif + +/* Native Windows platforms declare chdir, getcwd, rmdir in + and/or , not in . + They also declare access(), chmod(), close(), dup(), dup2(), isatty(), + lseek(), read(), unlink(), write() in . */ +#if ((@GNULIB_CHDIR@ || @GNULIB_GETCWD@ || @GNULIB_RMDIR@ \ + || defined GNULIB_POSIXCHECK) \ + && (defined _WIN32 && ! defined __CYGWIN__)) +# include /* mingw32, mingw64 */ +# include /* 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 +#endif + +/* AIX and OSF/1 5.1 declare getdomainname in , not in . + NonStop Kernel declares gethostname in , not in . */ +/* But avoid namespace pollution on glibc systems. */ +#if ((@GNULIB_GETDOMAINNAME@ && (defined _AIX || defined __osf__)) \ + || (@GNULIB_GETHOSTNAME@ && defined __TANDEM)) \ + && !defined __GLIBC__ +# include +#endif + +/* Android 4.3 declares fchownat in , not in . */ +/* But avoid namespace pollution on glibc systems. */ +#if (@GNULIB_FCHOWNAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \ + && !defined __GLIBC__ +# include +#endif + +/* MSVC defines off_t in . + 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 +#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 +# include +#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 . */ + +#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 "); + _GL_WARN_ON_USE (connect, + "connect() used without including "); + _GL_WARN_ON_USE (accept, + "accept() used without including "); + _GL_WARN_ON_USE (bind, + "bind() used without including "); + _GL_WARN_ON_USE (getpeername, + "getpeername() used without including "); + _GL_WARN_ON_USE (getsockname, + "getsockname() used without including "); + _GL_WARN_ON_USE (getsockopt, + "getsockopt() used without including "); + _GL_WARN_ON_USE (listen, + "listen() used without including "); + _GL_WARN_ON_USE (recv, + "recv() used without including "); + _GL_WARN_ON_USE (send, + "send() used without including "); + _GL_WARN_ON_USE (recvfrom, + "recvfrom() used without including "); + _GL_WARN_ON_USE (sendto, + "sendto() used without including "); + _GL_WARN_ON_USE (setsockopt, + "setsockopt() used without including "); + _GL_WARN_ON_USE (shutdown, + "shutdown() used without including "); +# 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 "); +# 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 - " + "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 + . */ +# 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 ) + 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 + . */ +# 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 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 +# if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR +# define _GL_USE_CRT_EXTERNS +# endif +# endif +# ifdef _GL_USE_CRT_EXTERNS +# include +# 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 + . */ +# 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 + . */ +# 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 + . */ +# 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 + . */ +# 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 + . + 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 . + + 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 . + + 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 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 +# 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 +# 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 + . */ +# 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 + . */ +# 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 + . */ +# 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 ) + 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 + . */ +# 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 + . */ +# 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 + . */ +# 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 + . */ +# 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 + . */ +# 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 + . */ +# 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 + . */ +# 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 + . */ +# 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 + . */ +# 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/third_party/make/lib/verify.h b/third_party/make/lib/verify.h new file mode 100644 index 00000000000..d9ab89a570c --- /dev/null +++ b/third_party/make/lib/verify.h @@ -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 . */ + +/* 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 , included by 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 +# 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 + 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/third_party/make/lib/warn-on-use.h b/third_party/make/lib/warn-on-use.h new file mode 100644 index 00000000000..1be2cbb9570 --- /dev/null +++ b/third_party/make/lib/warn-on-use.h @@ -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 . */ + +/* _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 ]], + [getline]) in configure.ac, which potentially defines + HAVE_RAW_DECL_GETLINE + - adding this code to a header that wraps the system : + #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/third_party/make/lib/xalloc-die.c b/third_party/make/lib/xalloc-die.c new file mode 100644 index 00000000000..68559deebb3 --- /dev/null +++ b/third_party/make/lib/xalloc-die.c @@ -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 . */ + +#include + +#include "xalloc.h" + +#include + +#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/third_party/make/lib/xalloc-oversized.h b/third_party/make/lib/xalloc-oversized.h new file mode 100644 index 00000000000..13ee23031a0 --- /dev/null +++ b/third_party/make/lib/xalloc-oversized.h @@ -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 . */ + +#ifndef XALLOC_OVERSIZED_H_ +#define XALLOC_OVERSIZED_H_ + +#include +#include + +/* 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/third_party/make/lib/xalloc.h b/third_party/make/lib/xalloc.h new file mode 100644 index 00000000000..9563b0bc926 --- /dev/null +++ b/third_party/make/lib/xalloc.h @@ -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 . */ + +#ifndef XALLOC_H_ +#define XALLOC_H_ + +#include +#include + +#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 inline T * +xrealloc (T *p, size_t s) +{ + return (T *) xrealloc ((void *) p, s); +} + +template inline T * +xnrealloc (T *p, size_t n, size_t s) +{ + return (T *) xnrealloc ((void *) p, n, s); +} + +template inline T * +x2realloc (T *p, size_t *pn) +{ + return (T *) x2realloc ((void *) p, pn); +} + +template inline T * +x2nrealloc (T *p, size_t *pn, size_t s) +{ + return (T *) x2nrealloc ((void *) p, pn, s); +} + +template 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/third_party/make/lib/xconcat-filename.c b/third_party/make/lib/xconcat-filename.c new file mode 100644 index 00000000000..e04d4337eb6 --- /dev/null +++ b/third_party/make/lib/xconcat-filename.c @@ -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 . */ + +/* Written by Bruno Haible . */ + +#include + +/* 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/third_party/make/lib/xmalloc.c b/third_party/make/lib/xmalloc.c new file mode 100644 index 00000000000..486873602e4 --- /dev/null +++ b/third_party/make/lib/xmalloc.c @@ -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 . */ + +#include + +#define XALLOC_INLINE _GL_EXTERN_INLINE + +#include "xalloc.h" + +#include +#include + +/* 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/third_party/make/m4/00gnulib.m4 b/third_party/make/m4/00gnulib.m4 new file mode 100644 index 00000000000..1a1a1d74f7e --- /dev/null +++ b/third_party/make/m4/00gnulib.m4 @@ -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/third_party/make/m4/absolute-header.m4 b/third_party/make/m4/absolute-header.m4 new file mode 100644 index 00000000000..39726ba57ba --- /dev/null +++ b/third_party/make/m4/absolute-header.m4 @@ -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 , , + 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/third_party/make/m4/access.m4 b/third_party/make/m4/access.m4 new file mode 100644 index 00000000000..cfe799d5c97 --- /dev/null +++ b/third_party/make/m4/access.m4 @@ -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/third_party/make/m4/acinclude.m4 b/third_party/make/m4/acinclude.m4 new file mode 100644 index 00000000000..a812aa082cb --- /dev/null +++ b/third_party/make/m4/acinclude.m4 @@ -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 . + +dnl --------------------------------------------------------------------------- +dnl Got this from the lynx 2.8 distribution. +dnl by T.E.Dickey +dnl and Jim Spath +dnl and Philippe De Muyter +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 +dnl Update for Darwin by Troy Runkel +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 +#include + ], [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/third_party/make/m4/alloca.m4 b/third_party/make/m4/alloca.m4 new file mode 100644 index 00000000000..59225245b91 --- /dev/null +++ b/third_party/make/m4/alloca.m4 @@ -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 , + 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 . + +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/third_party/make/m4/asm-underscore.m4 b/third_party/make/m4/asm-underscore.m4 new file mode 100644 index 00000000000..09be5eefb6d --- /dev/null +++ b/third_party/make/m4/asm-underscore.m4 @@ -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 </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/third_party/make/m4/close.m4 b/third_party/make/m4/close.m4 new file mode 100644 index 00000000000..378ec4cb0a3 --- /dev/null +++ b/third_party/make/m4/close.m4 @@ -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/third_party/make/m4/dirname.m4 b/third_party/make/m4/dirname.m4 new file mode 100644 index 00000000000..9995ff3c423 --- /dev/null +++ b/third_party/make/m4/dirname.m4 @@ -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/third_party/make/m4/dospaths.m4 b/third_party/make/m4/dospaths.m4 new file mode 100644 index 00000000000..4c77e333c6c --- /dev/null +++ b/third_party/make/m4/dospaths.m4 @@ -0,0 +1,33 @@ +# Test if the system uses DOS-style pathnames (drive specs and backslashes) +# By Paul Smith . 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 . + +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/third_party/make/m4/double-slash-root.m4 b/third_party/make/m4/double-slash-root.m4 new file mode 100644 index 00000000000..c463ac41aca --- /dev/null +++ b/third_party/make/m4/double-slash-root.m4 @@ -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 + # . + 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/third_party/make/m4/dup2.m4 b/third_party/make/m4/dup2.m4 new file mode 100644 index 00000000000..21b1ecc26b8 --- /dev/null +++ b/third_party/make/m4/dup2.m4 @@ -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 + #include + #include + #include + #include + #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/third_party/make/m4/eaccess.m4 b/third_party/make/m4/eaccess.m4 new file mode 100644 index 00000000000..7eea8e97b03 --- /dev/null +++ b/third_party/make/m4/eaccess.m4 @@ -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/third_party/make/m4/errno_h.m4 b/third_party/make/m4/errno_h.m4 new file mode 100644 index 00000000000..dd4994f3d5d --- /dev/null +++ b/third_party/make/m4/errno_h.m4 @@ -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 +#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 , 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 +#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 +#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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include +]) + 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/third_party/make/m4/error.m4 b/third_party/make/m4/error.m4 new file mode 100644 index 00000000000..60c229d5add --- /dev/null +++ b/third_party/make/m4/error.m4 @@ -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_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/third_party/make/m4/extensions.m4 b/third_party/make/m4/extensions.m4 new file mode 100644 index 00000000000..d7c95effdac --- /dev/null +++ b/third_party/make/m4/extensions.m4 @@ -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 + mbstate_t x;]])], + [], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ + #define _XOPEN_SOURCE 500 + #include + 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/third_party/make/m4/extern-inline.m4 b/third_party/make/m4/extern-inline.m4 new file mode 100644 index 00000000000..75c50087bd0 --- /dev/null +++ b/third_party/make/m4/extern-inline.m4 @@ -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 + . + + 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 . 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 . + 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 + and + . */ +#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/third_party/make/m4/fcntl-o.m4 b/third_party/make/m4/fcntl-o.m4 new file mode 100644 index 00000000000..747b865759e --- /dev/null +++ b/third_party/make/m4/fcntl-o.m4 @@ -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 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 + #include + #if HAVE_UNISTD_H + # include + #else /* on Windows with MSVC */ + # include + # include + # defined sleep(n) _sleep ((n) * 1000) + #endif + #include + #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/third_party/make/m4/fcntl.m4 b/third_party/make/m4/fcntl.m4 new file mode 100644 index 00000000000..562ae2395df --- /dev/null +++ b/third_party/make/m4/fcntl.m4 @@ -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 + #include + #include + #include + #include + #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 +#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/third_party/make/m4/fcntl_h.m4 b/third_party/make/m4/fcntl_h.m4 new file mode 100644 index 00000000000..6b253937fd1 --- /dev/null +++ b/third_party/make/m4/fcntl_h.m4 @@ -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 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/third_party/make/m4/findprog-in.m4 b/third_party/make/m4/findprog-in.m4 new file mode 100644 index 00000000000..54ea10e486d --- /dev/null +++ b/third_party/make/m4/findprog-in.m4 @@ -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/third_party/make/m4/getdtablesize.m4 b/third_party/make/m4/getdtablesize.m4 new file mode 100644 index 00000000000..ab2e3feb37b --- /dev/null +++ b/third_party/make/m4/getdtablesize.m4 @@ -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 ]], + [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/third_party/make/m4/getloadavg.m4 b/third_party/make/m4/getloadavg.m4 new file mode 100644 index 00000000000..3bd2a142e73 --- /dev/null +++ b/third_party/make/m4/getloadavg.m4 @@ -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 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 .]) + 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 , not . +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: must be included before + . */ + # include + # include + #endif + #include ]]) +])# 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 , because Solaris 2 does not use dwarf (it +# uses stabs), but it is still SVR4. We cannot check for 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 + instead of .])]) +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 ]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[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/third_party/make/m4/getprogname.m4 b/third_party/make/m4/getprogname.m4 new file mode 100644 index 00000000000..6baefc91c62 --- /dev/null +++ b/third_party/make/m4/getprogname.m4 @@ -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 ]) + AC_CHECK_DECLS([program_invocation_short_name], [ac_found=1], [], + [#include ]) + AC_CHECK_DECLS([__argv], [ac_found=1], [], [#include ]) + + # 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/third_party/make/m4/gettext.m4 b/third_party/make/m4/gettext.m4 new file mode 100644 index 00000000000..be247bf7b88 --- /dev/null +++ b/third_party/make/m4/gettext.m4 @@ -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 , 1995-2000. +dnl Bruno Haible , 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 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 +$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 +$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 +$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/third_party/make/m4/gnulib-cache.m4 b/third_party/make/m4/gnulib-cache.m4 new file mode 100644 index 00000000000..93c826be4ff --- /dev/null +++ b/third_party/make/m4/gnulib-cache.m4 @@ -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 . +# +# 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/third_party/make/m4/gnulib-common.m4 b/third_party/make/m4/gnulib-common.m4 new file mode 100644 index 00000000000..6c4cad6cef4 --- /dev/null +++ b/third_party/make/m4/gnulib-common.m4 @@ -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 + + 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 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 +# , +# but many more packages use AC_PROG_CC_STDC than AC_PROG_CC_C99 +# . +# Remaining problems: +# - When AC_PROG_CC_STDC is invoked twice, it adds the C99 enabling options +# to CC twice +# . +# - 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/third_party/make/m4/gnulib-comp.m4 b/third_party/make/m4/gnulib-comp.m4 new file mode 100644 index 00000000000..44d182df8bf --- /dev/null +++ b/third_party/make/m4/gnulib-comp.m4 @@ -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 . +# +# 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 + #include + #include + #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 + # include + # 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/third_party/make/m4/host-cpu-c-abi.m4 b/third_party/make/m4/host-cpu-c-abi.m4 new file mode 100644 index 00000000000..6db2aa25aea --- /dev/null +++ b/third_party/make/m4/host-cpu-c-abi.m4 @@ -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 . +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 ), and _MIPS_SIM == _ABIN32. + # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but + # may later get defined by ), 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 < +#include + ]], + [[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 +#include + ]], + [[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 +#include + +#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 +#include +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 . + 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/third_party/make/m4/include_next.m4 b/third_party/make/m4/include_next.m4 new file mode 100644 index 00000000000..9009e293b53 --- /dev/null +++ b/third_party/make/m4/include_next.m4 @@ -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 . + 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 . By virtue of the second bug, we need to use + dnl include_next as well in this case. + cat < conftestd1a/conftest.h +#define DEFINED_IN_CONFTESTD1 +#include_next +#ifdef DEFINED_IN_CONFTESTD2 +int foo; +#else +#error "include_next doesn't work" +#endif +EOF + cat < conftestd1b/conftest.h +#define DEFINED_IN_CONFTESTD1 +#include +#include_next +#ifdef DEFINED_IN_CONFTESTD2 +int foo; +#else +#error "include_next doesn't work" +#endif +EOF + cat < 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 ]], + [gl_cv_have_include_next=yes], + [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2" + AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include ]], + [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 +# ''; 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 ''; 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 +# 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 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/third_party/make/m4/intlmacosx.m4 b/third_party/make/m4/intlmacosx.m4 new file mode 100644 index 00000000000..8a045f6a295 --- /dev/null +++ b/third_party/make/m4/intlmacosx.m4 @@ -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 ]], + [[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 ]], + [[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/third_party/make/m4/lib-ld.m4 b/third_party/make/m4/lib-ld.m4 new file mode 100644 index 00000000000..ddc569f7364 --- /dev/null +++ b/third_party/make/m4/lib-ld.m4 @@ -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 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 = 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/third_party/make/m4/lib-prefix.m4 b/third_party/make/m4/lib-prefix.m4 new file mode 100644 index 00000000000..31f49e40aa4 --- /dev/null +++ b/third_party/make/m4/lib-prefix.m4 @@ -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 . + 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/third_party/make/m4/limits-h.m4 b/third_party/make/m4/limits-h.m4 new file mode 100644 index 00000000000..0b4f092a432 --- /dev/null +++ b/third_party/make/m4/limits-h.m4 @@ -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 + 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 . +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/third_party/make/m4/longlong.m4 b/third_party/make/m4/longlong.m4 new file mode 100644 index 00000000000..eefb37c455e --- /dev/null +++ b/third_party/make/m4/longlong.m4 @@ -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 + @%:@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/third_party/make/m4/malloc.m4 b/third_party/make/m4/malloc.m4 new file mode 100644 index 00000000000..c1f8ea32f2c --- /dev/null +++ b/third_party/make/m4/malloc.m4 @@ -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 + #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/third_party/make/m4/msvc-inval.m4 b/third_party/make/m4/msvc-inval.m4 new file mode 100644 index 00000000000..dcf398d032d --- /dev/null +++ b/third_party/make/m4/msvc-inval.m4 @@ -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/third_party/make/m4/msvc-nothrow.m4 b/third_party/make/m4/msvc-nothrow.m4 new file mode 100644 index 00000000000..13198d8599c --- /dev/null +++ b/third_party/make/m4/msvc-nothrow.m4 @@ -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/third_party/make/m4/multiarch.m4 b/third_party/make/m4/multiarch.m4 new file mode 100644 index 00000000000..3c2034c5e00 --- /dev/null +++ b/third_party/make/m4/multiarch.m4 @@ -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/third_party/make/m4/nls.m4 b/third_party/make/m4/nls.m4 new file mode 100644 index 00000000000..53cdc8be8be --- /dev/null +++ b/third_party/make/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 , 1995-2000. +dnl Bruno Haible , 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/third_party/make/m4/off_t.m4 b/third_party/make/m4/off_t.m4 new file mode 100644 index 00000000000..6e19af881ed --- /dev/null +++ b/third_party/make/m4/off_t.m4 @@ -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/third_party/make/m4/po.m4 b/third_party/make/m4/po.m4 new file mode 100644 index 00000000000..43012dca1b4 --- /dev/null +++ b/third_party/make/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 , 1995-2000. +dnl Bruno Haible , 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 < "$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" < /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" <> "$ac_file.tmp" <, 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/third_party/make/m4/ssize_t.m4 b/third_party/make/m4/ssize_t.m4 new file mode 100644 index 00000000000..6c0a588873c --- /dev/null +++ b/third_party/make/m4/ssize_t.m4 @@ -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 ]], + [[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/third_party/make/m4/stdbool.m4 b/third_party/make/m4/stdbool.m4 new file mode 100644 index 00000000000..6bb087ebdf4 --- /dev/null +++ b/third_party/make/m4/stdbool.m4 @@ -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 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, does not exist or does not conform to C99. + dnl On Solaris 10 with CC=cc CXX=CC, exists but is not usable + dnl in C++ mode (and no 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 + + #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/third_party/make/m4/stddef_h.m4 b/third_party/make/m4/stddef_h.m4 new file mode 100644 index 00000000000..6bcfadb74ef --- /dev/null +++ b/third_party/make/m4/stddef_h.m4 @@ -0,0 +1,72 @@ +dnl A placeholder for , 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 + 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 + 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/third_party/make/m4/stdint.m4 b/third_party/make/m4/stdint.m4 new file mode 100644 index 00000000000..29ad826d8ea --- /dev/null +++ b/third_party/make/m4/stdint.m4 @@ -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 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 , 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 . + 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 . + 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 . + 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 +/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ +#if !(defined WCHAR_MIN && defined WCHAR_MAX) +#error "WCHAR_MIN, WCHAR_MAX not defined in " +#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 /* 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 +] +gl_STDINT_INCLUDES +[ +#include +#include +#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 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 +] +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 predates C++11.]) + AC_DEFINE([__STDC_LIMIT_MACROS], [1], + [Define to 1 if the system 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 + ]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 , and for + dnl (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 ], [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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #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 and 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/third_party/make/m4/stdio_h.m4 b/third_party/make/m4/stdio_h.m4 new file mode 100644 index 00000000000..c603b514d96 --- /dev/null +++ b/third_party/make/m4/stdio_h.m4 @@ -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 + #include + /* 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 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 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 + ]], [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/third_party/make/m4/stdlib_h.m4 b/third_party/make/m4/stdlib_h.m4 new file mode 100644 index 00000000000..61a3e31edac --- /dev/null +++ b/third_party/make/m4/stdlib_h.m4 @@ -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 +#if HAVE_SYS_LOADAVG_H +/* OpenIndiana has a bug: must be included before + . */ +# include +# include +#endif +#if HAVE_RANDOM_H +# include +#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/third_party/make/m4/stpcpy.m4 b/third_party/make/m4/stpcpy.m4 new file mode 100644 index 00000000000..0f0fa9eaaed --- /dev/null +++ b/third_party/make/m4/stpcpy.m4 @@ -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 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/third_party/make/m4/strerror.m4 b/third_party/make/m4/strerror.m4 new file mode 100644 index 00000000000..fd84ce87116 --- /dev/null +++ b/third_party/make/m4/strerror.m4 @@ -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 + ]], + [[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 , 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 + #include + ]], + [[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/third_party/make/m4/string_h.m4 b/third_party/make/m4/string_h.m4 new file mode 100644 index 00000000000..4c1f685eabd --- /dev/null +++ b/third_party/make/m4/string_h.m4 @@ -0,0 +1,122 @@ +# Configure a GNU-like replacement for . + +# 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 + ]], + [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/third_party/make/m4/sys_socket_h.m4 b/third_party/make/m4/sys_socket_h.m4 new file mode 100644 index 00000000000..1471aeaec41 --- /dev/null +++ b/third_party/make/m4/sys_socket_h.m4 @@ -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 is self-contained], + [gl_cv_header_sys_socket_h_selfcontained], + [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[]])], + [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, 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 defines the SHUT_* macros], + [gl_cv_header_sys_socket_h_shut], + [ + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include ]], + [[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 +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#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 + #ifdef HAVE_SYS_SOCKET_H + #include + #endif + #ifdef HAVE_WS2TCPIP_H + #include + #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 +#include + ]], [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 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 replacement and of the +# 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 replacement and of the +# 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/third_party/make/m4/sys_types_h.m4 b/third_party/make/m4/sys_types_h.m4 new file mode 100644 index 00000000000..be918dc0d8b --- /dev/null +++ b/third_party/make/m4/sys_types_h.m4 @@ -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 + +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 + .])]) +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 + .])]) +fi +]) + +]) diff --git a/third_party/make/m4/unistd_h.m4 b/third_party/make/m4/unistd_h.m4 new file mode 100644 index 00000000000..7453866df84 --- /dev/null +++ b/third_party/make/m4/unistd_h.m4 @@ -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 +#endif +/* Some systems declare various items in the wrong headers. */ +#if !(defined __GLIBC__ && !defined __UCLIBC__) +# include +# include +# include +# if defined _WIN32 && ! defined __CYGWIN__ +# include +# 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/third_party/make/m4/warn-on-use.m4 b/third_party/make/m4/warn-on-use.m4 new file mode 100644 index 00000000000..5c8ee45092d --- /dev/null +++ b/third_party/make/m4/warn-on-use.m4 @@ -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/third_party/make/m4/wchar_t.m4 b/third_party/make/m4/wchar_t.m4 new file mode 100644 index 00000000000..e48d4649322 --- /dev/null +++ b/third_party/make/m4/wchar_t.m4 @@ -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 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 + 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/third_party/make/m4/wint_t.m4 b/third_party/make/m4/wint_t.m4 new file mode 100644 index 00000000000..877fd86c7ee --- /dev/null +++ b/third_party/make/m4/wint_t.m4 @@ -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 has the 'wint_t' type and whether gnulib's +dnl or 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: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be included + before . */ +#include +#include +#include +#include + 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 or 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: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be + included before . */ +#if !(defined __GLIBC__ && !defined __UCLIBC__) +# include +# include +# include +#endif +#include + 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/third_party/make/m4/xalloc.m4 b/third_party/make/m4/xalloc.m4 new file mode 100644 index 00000000000..a5568700766 --- /dev/null +++ b/third_party/make/m4/xalloc.m4 @@ -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/third_party/make/makefile.com b/third_party/make/makefile.com new file mode 100644 index 00000000000..eff906ef0b8 --- /dev/null +++ b/third_party/make/makefile.com @@ -0,0 +1,171 @@ +$! +$! Makefile.com - builds GNU Make for VMS +$! +$! P1 = LIST will provide compiler listings. +$! P2 = DEBUG will build an image with debug information +$! P3 = WALL will enable all warning messages (some are suppressed since +$! one macro intentionally causes an error condition) +$! +$! In case of problems with the install you might contact me at +$! zinser@decus.de (preferred) or zinser@sysdev.deutsche-boerse.com +$ +$! hb +$! But don't ask Martin Zinser about the lines, I added/changed. +$! In case of an error do some cleanup +$ on error then $ goto cleanup +$! in case somebody set up her/his own symbol for cc +$ set symbol/scope=(nolocal,noglobal) +$! +$! Just some general constants... +$! +$ true = 1 +$ false = 0 +$ tmpnam = "temp_" + f$getjpi("","pid") +$ tt = tmpnam + ".txt" +$ tc = tmpnam + ".c" +$! +$! Look for the compiler used +$! +$ lval = "" +$ if f$search("SYS$SYSTEM:DECC$COMPILER.EXE").eqs."" +$ then +$ if f$trnlnm("SYS").eqs."" then def/nolog sys sys$library: +$ ccopt = "" +$ else +$ ccopt = "/decc/prefix=(all,except=(globfree,glob))" +$ if f$trnlnm("SYS").eqs."" +$ then +$ if f$trnlnm("DECC$LIBRARY_INCLUDE").nes."" +$ then +$ define sys decc$library_include: +$ else +$ if f$search("SYS$COMMON:[DECC$LIB.REFERENCE]DECC$RTLDEF.DIR").nes."" - + then lval = "SYS$COMMON:[DECC$LIB.REFERENCE.DECC$RTLDEF]," +$ if f$search("SYS$COMMON:[DECC$LIB.REFERENCE]SYS$STARLET_C.DIR").nes."" - + then lval = lval+"SYS$COMMON:[DECC$LIB.REFERENCE.SYS$STARLET_C]," +$ lval=lval+"SYS$LIBRARY:" +$ define sys 'lval +$ endif +$ endif +$ endif +$! +$! +$ if (p1 .eqs. "LIST") +$ then +$ ccopt = ccopt + "/list/show=(expan,inclu)" +$ endif +$! +$! Should we build a debug image +$! +$ if (p2.eqs."DEBUG") +$ then +$ ccopt = ccopt + "/noopt/debug" +$ lopt = "/debug" +$ else +$ lopt = "" +$ endif +$! +$! Do we want to see all warnings +$! +$ if (p3.nes."WALL") +$ then +$ gosub check_cc_qual +$ endif +$ 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: +$ cfile = f$elem(n," ",filelist) +$ if cfile .eqs. " " then goto linkit +$ write sys$output "Compiling ''cfile'..." +$ call compileit 'cfile' +$ n = n + 1 +$ goto loop +$ linkit: +$ close optf +$ link/exe=make make.opt/opt'lopt +$ goto cleanup +$ +$ cleanup: +$ if f$trnlnm("SYS").nes."" then $ deassign sys +$ if f$trnlnm("OPTF").nes."" then $ close optf +$ if f$search("make.opt").nes."" then $ del make.opt;* +$ exit +$! +$!----------------------------------------------------------------------------- +$! +$! Check if this is a define relating to the properties of the C/C++ +$! compiler +$! +$CHECK_CC_QUAL: +$ open/write tmpc 'tc +$ ccqual = "/warn=(disable=questcompare)" +$ write tmpc "#include " +$ write tmpc "unsigned int i = 1;" +$ write tmpc "int main(){" +$ write tmpc "if (i < 0){printf(""Mission impossible\n"");}}" +$ close tmpc +$ gosub cc_qual_check +$ return +$! +$!----------------------------------------------------------------------------- +$! +$! Check for properties of C/C++ compiler +$! +$CC_QUAL_CHECK: +$ cc_qual = false +$ set message/nofac/noident/nosever/notext +$ cc 'ccqual' 'tmpnam' +$ if $status then cc_qual = true +$ set message/fac/ident/sever/text +$ delete/nolog 'tmpnam'.*;* +$ if cc_qual then ccopt = ccopt + ccqual +$ return +$!----------------------------------------------------------------------------- +$! +$ compileit : subroutine +$ ploc = f$locate("]",p1) +$! filnam = p1 +$ if ploc .lt. f$length(p1) +$ then +$ objdir = f$extract(0, ploc+1, p1) +$ write optf p1 +$ else +$ objdir := [] +$ write optf objdir+p1 +$ endif +$ 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' +$ exit +$ endsubroutine : compileit +$! +$!----------------------------------------------------------------------------- +$!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 . diff --git a/third_party/make/mk/Amiga.mk b/third_party/make/mk/Amiga.mk new file mode 100644 index 00000000000..074c53e0670 --- /dev/null +++ b/third_party/make/mk/Amiga.mk @@ -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 . + +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/third_party/make/mk/VMS.mk b/third_party/make/mk/VMS.mk new file mode 100644 index 00000000000..75d33fe4fa4 --- /dev/null +++ b/third_party/make/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 . + +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/third_party/make/mk/Windows32.mk b/third_party/make/mk/Windows32.mk new file mode 100644 index 00000000000..494be02cc8a --- /dev/null +++ b/third_party/make/mk/Windows32.mk @@ -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 . + +# 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/third_party/make/mk/msdosdjgpp.mk b/third_party/make/mk/msdosdjgpp.mk new file mode 100644 index 00000000000..420937de102 --- /dev/null +++ b/third_party/make/mk/msdosdjgpp.mk @@ -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 . + +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/third_party/make/po/LINGUAS b/third_party/make/po/LINGUAS new file mode 100644 index 00000000000..b1682e8f17a --- /dev/null +++ b/third_party/make/po/LINGUAS @@ -0,0 +1,29 @@ +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 diff --git a/third_party/make/po/Makefile.in.in b/third_party/make/po/Makefile.in.in new file mode 100644 index 00000000000..65184f65c73 --- /dev/null +++ b/third_party/make/po/Makefile.in.in @@ -0,0 +1,475 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. +# +# Origin: gettext-0.19 +GETTEXT_MACRO_VERSION = 0.19 + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + +SED = @SED@ +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +datadir = @datadir@ +localedir = @localedir@ +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ + +# We use $(mkdir_p). +# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as +# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, +# @install_sh@ does not start with $(SHELL), so we add it. +# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined +# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake +# versions, $(mkinstalldirs) and $(install_sh) are unused. +mkinstalldirs = $(SHELL) @install_sh@ -d +install_sh = $(SHELL) @install_sh@ +MKDIR_P = @MKDIR_P@ +mkdir_p = @mkdir_p@ + +GMSGFMT_ = @GMSGFMT@ +GMSGFMT_no = @GMSGFMT@ +GMSGFMT_yes = @GMSGFMT_015@ +GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) +MSGFMT_ = @MSGFMT@ +MSGFMT_no = @MSGFMT@ +MSGFMT_yes = @MSGFMT_015@ +MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) +XGETTEXT_ = @XGETTEXT@ +XGETTEXT_no = @XGETTEXT@ +XGETTEXT_yes = @XGETTEXT_015@ +XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) +MSGMERGE = msgmerge +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +UPDATEPOFILES = @UPDATEPOFILES@ +DUMMYPOFILES = @DUMMYPOFILES@ +DISTFILES.common = Makefile.in.in remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +POFILESDEPS_ = $(srcdir)/$(DOMAIN).pot +POFILESDEPS_yes = $(POFILESDEPS_) +POFILESDEPS_no = +POFILESDEPS = $(POFILESDEPS_$(PO_DEPENDS_ON_POT)) + +DISTFILESDEPS_ = update-po +DISTFILESDEPS_yes = $(DISTFILESDEPS_) +DISTFILESDEPS_no = +DISTFILESDEPS = $(DISTFILESDEPS_$(DIST_DEPENDS_ON_UPDATE_PO)) + +# Makevars gets inserted here. (Don't remove this line!) + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: all-@USE_NLS@ + +all-yes: stamp-po +all-no: + +# Ensure that the gettext macros and this Makefile.in.in are in sync. +CHECK_MACRO_VERSION = \ + test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ + || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ + exit 1; \ + } + +# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no +# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because +# we don't want to bother translators with empty POT files). We assume that +# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. +# In this case, stamp-po is a nop (i.e. a phony target). + +# stamp-po is a timestamp denoting the last time at which the CATALOGS have +# been loosely updated. Its purpose is that when a developer or translator +# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, +# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent +# invocations of "make" will do nothing. This timestamp would not be necessary +# if updating the $(CATALOGS) would always touch them; however, the rule for +# $(POFILES) has been designed to not touch files that don't need to be +# changed. +stamp-po: $(srcdir)/$(DOMAIN).pot + @$(CHECK_MACRO_VERSION) + test ! -f $(srcdir)/$(DOMAIN).pot || \ + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @test ! -f $(srcdir)/$(DOMAIN).pot || { \ + echo "touch stamp-po" && \ + echo timestamp > stamp-poT && \ + mv stamp-poT stamp-po; \ + } + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +# The determination of whether the package xyz is a GNU one is based on the +# heuristic whether some file in the top level directory mentions "GNU xyz". +# If GNU 'find' is available, we avoid grepping through monster files. +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + package_gnu="$(PACKAGE_GNU)"; \ + test -n "$$package_gnu" || { \ + if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \ + LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f \ + -size -10000000c -exec grep 'GNU @PACKAGE@' \ + /dev/null '{}' ';' 2>/dev/null; \ + else \ + LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null; \ + fi; \ + } | grep -v 'libtool:' >/dev/null; then \ + package_gnu=yes; \ + else \ + package_gnu=no; \ + fi; \ + }; \ + if test "$$package_gnu" = "yes"; then \ + package_prefix='GNU '; \ + else \ + package_prefix=''; \ + fi; \ + if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ + msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ + else \ + msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ + fi; \ + case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + ;; \ + *) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --package-name="$${package_prefix}@PACKAGE@" \ + --package-version='@VERSION@' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + ;; \ + esac + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(POFILESDEPS) + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test -f $(srcdir)/$(DOMAIN).pot || $(MAKE) $(srcdir)/$(DOMAIN).pot; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) \ + && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ + $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ + esac; \ + }; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common) Makevars.template; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + for file in Makevars; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + for file in $(DISTFILES.common) Makevars.template; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +info dvi ps pdf html tags TAGS ctags CTAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f stamp-poT + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f stamp-po $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS) + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: stamp-po $(DISTFILES) + dists="$(DISTFILES)"; \ + if test "$(PACKAGE)" = "gettext-tools"; then \ + dists="$$dists Makevars.template"; \ + fi; \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + dists="$$dists $(DOMAIN).pot stamp-po"; \ + fi; \ + if test -f $(srcdir)/ChangeLog; then \ + dists="$$dists ChangeLog"; \ + fi; \ + for i in 0 1 2 3 4 5 6 7 8 9; do \ + if test -f $(srcdir)/ChangeLog.$$i; then \ + dists="$$dists ChangeLog.$$i"; \ + fi; \ + done; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir) || exit 1; \ + else \ + cp -p $(srcdir)/$$file $(distdir) || exit 1; \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ + $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + esac; \ + }; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +# Recreate Makefile by invoking config.status. Explicitly invoke the shell, +# because execution permission bits may not work on the current file system. +# Use @SHELL@, which is the shell determined by autoconf for the use by its +# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. +Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ + cd $(top_builddir) \ + && @SHELL@ ./config.status $(subdir)/$@.in po-directories + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/third_party/make/po/Makevars b/third_party/make/po/Makevars new file mode 100644 index 00000000000..f7abd7b01e1 --- /dev/null +++ b/third_party/make/po/Makevars @@ -0,0 +1,87 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +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 +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# 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 +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +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 = + +# 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 diff --git a/third_party/make/po/POTFILES.in b/third_party/make/po/POTFILES.in new file mode 100644 index 00000000000..46e53ef32c3 --- /dev/null +++ b/third_party/make/po/POTFILES.in @@ -0,0 +1,47 @@ +# List of source files containing translatable strings. +# 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 +# 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 . + +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 diff --git a/third_party/make/po/Rules-quot b/third_party/make/po/Rules-quot new file mode 100644 index 00000000000..9dc963076f1 --- /dev/null +++ b/third_party/make/po/Rules-quot @@ -0,0 +1,58 @@ +# This file, Rules-quot, can be copied and used freely without restrictions. +# Special Makefile rules for English message catalogs with quotation marks. + +DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot + +.SUFFIXES: .insert-header .po-update-en + +en@quot.po-create: + $(MAKE) en@quot.po-update +en@boldquot.po-create: + $(MAKE) en@boldquot.po-update + +en@quot.po-update: en@quot.po-update-en +en@boldquot.po-update: en@boldquot.po-update-en + +.insert-header.po-update-en: + @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ + if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + ll=`echo $$lang | sed -e 's/@.*//'`; \ + LC_ALL=C; export LC_ALL; \ + cd $(srcdir); \ + if $(MSGINIT) $(MSGINIT_OPTIONS) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null \ + | $(SED) -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | \ + { case `$(MSGFILTER) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-8] | 0.1[0-8].*) \ + $(MSGFILTER) $(SED) -f `echo $$lang | sed -e 's/.*@//'`.sed \ + ;; \ + *) \ + $(MSGFILTER) `echo $$lang | sed -e 's/.*@//'` \ + ;; \ + esac } 2>/dev/null > $$tmpdir/$$lang.new.po \ + ; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "creation of $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +en@quot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header + +en@boldquot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header + +mostlyclean: mostlyclean-quot +mostlyclean-quot: + rm -f *.insert-header diff --git a/third_party/make/po/be.gmo b/third_party/make/po/be.gmo new file mode 100644 index 0000000000000000000000000000000000000000..0908d0afc6260320a23160810f31ded080eb9adf GIT binary patch literal 6580 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, 2002, 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.80\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\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 \n" +"Language-Team: Belarusian \n" +"Language: be\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: KBabel 0.9.6\n" + +#: src/ar.c:46 +#, fuzzy, 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" + +#: src/ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: архіў \"%s\" ня йснуе" + +#: src/ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: \"%s\" - гэта не рэчаісны архіў" + +#: src/ar.c:157 +#, fuzzy, 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 "" + +#: src/arscan.c:130 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "" + +#: src/arscan.c:261 +#, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "" + +#: src/arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "" + +#: 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, рэжым = 0%o.\n" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "" + +#: src/commands.c:628 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: src/commands.c:646 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Выдаляецца файл \"%s\"" + +#: src/commands.c:648 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Выдаляецца файл \"%s\"" + +#: src/commands.c:684 +#, fuzzy +msgid "# recipe to execute" +msgstr "# загады для выкананьня" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (убудаваны):" + +#: src/commands.c:689 +#, fuzzy, 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 "" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "" + +#: src/dir.c:1094 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" + +#: src/dir.c:1099 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "" + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "" + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "" + +#: 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 "" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "" + +#: 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 "" + +#: src/file.c:283 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" + +#: src/file.c:287 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "" + +#: src/file.c:290 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" + +#: src/file.c:310 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" + +#: src/file.c:316 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" + +#: src/file.c:408 +#, fuzzy, 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 "" + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "" + +#: src/file.c:1025 +#, fuzzy +msgid "# Command line target." +msgstr "загадны радок" + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" + +#: 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 "" + +#: 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 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Загады, што выконваюцца зараз (ГЭТА - ПАМЫЛКА)." + +#: src/file.c:1065 +#, fuzzy +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 "" + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "" + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Файлы" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "" + +#: src/function.c:799 +#, c-format +msgid "first argument to 'word' function must be greater than 0" +msgstr "" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "" + +#: src/function.c:1533 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe (): памылка ў process_init_fd()\n" + +#: src/function.c:1557 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe (): памылка ў process_init_fd()\n" + +#: src/function.c:1564 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "памылка ў CreatePipe() (e=%d)\n" + +#: src/function.c:1572 +#, fuzzy, 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 "" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "" + +#: src/function.c:2234 src/function.c:2265 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: src/function.c:2242 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "%s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, fuzzy, c-format +msgid "close: %s: %s" +msgstr "%s%s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "" + +#: src/function.c:2277 +#, fuzzy, c-format +msgid "read: %s: %s" +msgstr "%s: %s" + +#: src/function.c:2290 +#, fuzzy, c-format +msgid "file: invalid file operation: %s" +msgstr "%s: нерэчаісны выбар -- %c.\n" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "" + +#: src/function.c:2417 +#, fuzzy, 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 "" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "" + +#: src/getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: выбар \"%s\" - неадназначы.\n" + +#: src/getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: выбар \"--%s\" не дазваляе довад.\n" + +#: src/getopt.c:688 +#, fuzzy, 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 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: выбар \"%s\" патрабуе довад.\n" + +#: src/getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: нераспазнаны выбар \"--%s\".\n" + +#: src/getopt.c:738 +#, fuzzy, 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 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: выбар \"-W %s\" - неадназначын.\n" + +#: src/getopt.c:862 +#, fuzzy, 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 "" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: src/hash.c:50 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "" + +#: src/hash.c:282 +#, c-format +msgid "Rehash=%u, " +msgstr "" + +#: src/hash.c:283 +#, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "" + +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "" + +#: src/implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "" + +#: src/implicit.c:786 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Выдаляюцца прамежкавыя файлы...\n" + +#: src/job.c:370 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (часовы файл)" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr "" + +#: src/job.c:553 +msgid " (ignored)" +msgstr "" + +#: src/job.c:557 src/job.c:1892 +#, fuzzy +msgid "" +msgstr " (убудаваны):" + +#: src/job.c:573 +#, fuzzy, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "*** [%s] Памылка %d" + +#: 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 "" + +#: 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 "" + +#: src/job.c:899 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: src/job.c:950 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "" + +#: src/job.c:956 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "" + +#: src/job.c:1071 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: src/job.c:1575 src/job.c:2487 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" + +#: src/job.c:1642 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: src/job.c:1902 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: архіў \"%s\" ня йснуе" + +#: src/job.c:1905 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s Няма правіла каб зрабіць мэту \"%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 "" + +#: src/job.c:2212 +#, c-format +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: src/job.c:2226 +#, c-format +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "" + +#: src/job.c:2520 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: src/job.c:2862 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL зьменена (раней \"%s\", зараз \"%s\")" + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: src/job.c:3605 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: src/load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: src/load.c:256 +#, fuzzy, c-format +msgid "The 'load' operation is not supported on this platform." +msgstr "Паралельня працы (-j) не падтрымліваюцца на гэтае плятхорме." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Выбары:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr "" + +#: src/main.c:345 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: src/main.c:362 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" + +#: src/main.c:364 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:369 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: src/main.c:371 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:384 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" + +#: src/main.c:386 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" + +#: src/main.c:388 +#, fuzzy +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 "" + +#: 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 "" + +#: src/main.c:397 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr "" +" -h, --help Друкуе гэтае паведамленьне й выходзіць.\n" + +#: src/main.c:399 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: src/main.c:849 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" + +#: 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 "" + +#: src/main.c:864 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "" + +#: src/main.c:865 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "" + +#: src/main.c:941 src/main.c:956 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" + +#: src/main.c:1009 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" + +#: src/main.c:1609 +#, c-format +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" + +#: src/main.c:1617 +#, c-format +msgid "warning: -j%d forced in submake: resetting jobserver mode." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Абнаўляюцца make-файлы....\n" + +#: src/main.c:2226 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "" + +#: src/main.c:2323 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "Makefile \"%s\" ня знойдзен" + +#: src/main.c:2328 +#, fuzzy, 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 "" + +#: 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 "" + +#: 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 "" + +#: 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 \n" +msgstr "Паведамляйце пра памылкі на .\n" + +#: src/main.c:2901 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "выбар \"-%c\" патрабуе станоўчы цэлы довад" + +#: src/main.c:2965 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "выбар \"-%c\" патрабуе станоўчы цэлы довад" + +#: src/main.c:3363 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"Гэта праграма пабудавана для %s\n" + +#: src/main.c:3365 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"Гэта праграма падубавана для %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" + +#: 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 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: уваход у невядомую тэчку" + +#: src/output.c:99 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: выхад зь невядомае тэчкі" + +#: src/output.c:102 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: уваход у тэчку \"%s\"\n" + +#: src/output.c:104 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: выхад з тэчкі \"%s\"\n" + +#: src/output.c:108 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: уваход у невядомую тэчку" + +#: src/output.c:110 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: выхад зь невядомае тэчкі" + +#: src/output.c:113 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: уваход у тэчку \"%s\"\n" + +#: src/output.c:115 +#, fuzzy, 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 "" + +#: 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 "" + +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "ствараецца трубаправод прац" + +#: src/posixos.c:98 src/posixos.c:251 +#, fuzzy +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 "" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: 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 +#, fuzzy +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 "Чытаюцца make-файлы...\n" + +#: src/read.c:336 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Чытаецца make-файл \"%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 "" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "" + +#: src/read.c:1035 +#, fuzzy, c-format +msgid "missing rule before recipe" +msgstr "прапушчана правіла перад загадамі" + +#: src/read.c:1136 +#, fuzzy, c-format +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (вы маеце на ўвазе TAB замест 8 прагалаў?)" + +#: src/read.c:1138 +#, fuzzy, c-format +msgid "missing separator" +msgstr "прапушчан падзяляльнік %s" + +#: 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 +#, fuzzy, 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 "" + +#: src/read.c:1503 +#, fuzzy, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "прапушчаны \"endef\", незавершаны \"define\"" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "" + +#: src/read.c:1604 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "зьнешні \"%s\"" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "" + +#: 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 "" + +#: src/read.c:2122 src/read.c:2168 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "" + +#: src/read.c:2128 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "" + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "" + +#: 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 "" + +#: src/read.c:2636 +#, c-format +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" + +#: src/remake.c:226 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "Нічога ня было зроблена для \"%s\"." + +#: src/remake.c:227 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "\"%s\" - састарэл(а)." + +#: src/remake.c:323 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Усё яшэ абнаўляецца файл \"%s\".\n" + +#: src/remake.c:389 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%s Няма правіла каб зрабіць мэту \"%s\", патрэбную для \"%s\"%s" + +#: src/remake.c:399 +#, fuzzy, 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 "" + +#: src/remake.c:432 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "" + +#: src/remake.c:444 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "Файл \"%s\" ужо быў разгледжаны.\n" + +#: src/remake.c:454 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "Усё яшэ абнаўляецца файл \"%s\".\n" + +#: src/remake.c:457 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Скончана абнаўленьне файла \"%s\".\n" + +#: src/remake.c:486 +#, fuzzy, 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 "" + +#: src/remake.c:507 src/remake.c:1039 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "" + +#: src/remake.c:509 src/remake.c:1041 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "" + +#: src/remake.c:674 +#, fuzzy, 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 "" + +#: src/remake.c:694 +#, fuzzy, 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 "" + +#: src/remake.c:751 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "" + +#: src/remake.c:756 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Файл \"%s\" ня йснуе.\n" + +#: src/remake.c:761 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "" + +#: src/remake.c:764 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "" + +#: src/remake.c:782 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: src/remake.c:789 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" + +#: src/remake.c:794 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "" + +#: src/remake.c:802 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "%sНяма правіла каб зрабіць мэту \"%s\"%s" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "" + +#: src/remake.c:824 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "%sНяма правіла каб зрабіць мэту \"%s\"%s" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr "" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "" + +#: src/remake.c:846 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "%sНяма правіла каб зрабіць мэту \"%s\"%s" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "" + +#: src/remake.c:852 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "" + +#: src/remake.c:1047 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Невядомы ўбудаваны загад \"%s\".\n" + +#: src/remake.c:1422 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Увага! Файл \"%s\" мае час зьмяненьня %.2g с, які шчэ не надышоў." + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: src/rule.c:289 +#, c-format +msgid "warning: ignoring prerequisites on suffix rule definition" +msgstr "" + +#: src/rule.c:530 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" + +#: src/rule.c:548 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "" + +#: 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 "" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "" + +#: 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 "" + +#: src/strcache.c:304 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: src/strcache.c:308 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n" +msgstr "" + +#: src/strcache.c:319 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: src/strcache.c:322 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" + +#: 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 "make-файл" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "" + +#: src/variable.c:1668 +msgid "command line" +msgstr "загадны радок" + +#: src/variable.c:1671 +#, fuzzy +msgid "'override' directive" +msgstr "дырэктыва \"override\"" + +#: src/variable.c:1682 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (з \"%s\", радок %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Пераменныя\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" + +#: src/variable.h:229 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "Увага! Нявызначаная пераменная \"%.*s\"" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "" + +#: src/vmsjobs.c:244 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "" + +#: src/vmsjobs.c:1224 +#, c-format +msgid "DCL: %s\n" +msgstr "" + +#: src/vmsjobs.c:1284 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Перанакіраваны вывад у %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" + +#: src/vpath.c:620 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr " (пошук шляху)" + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:194 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#~ msgid "*** [%s] Error 0x%x" +#~ msgstr "*** [%s] Памылка 0x%x" + +#~ msgid "Error, empty command\n" +#~ msgstr "Памылка! Парожні загад.\n" + +#~ 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 недаступны." + +#~ 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 "" +#~ "%s Гэта вольнае праграмнае забесьпячэньне; глядзіце зыходны код для\n" +#~ "%sпагадненьня аб распаўсюджваньні. Ня йснуе НІЯКАЕ гарантыі, нават аб\n" +#~ "%sмагчымасьці выкарыстньня зь якой небудзь мэтай.\n" + +#~ msgid "Unknown error %d" +#~ msgstr "Невядомая памылка %d" + +#~ msgid "virtual memory exhausted" +#~ msgstr "віртуальная памяць вычарпана" + +#~ msgid "invalid `override' directive" +#~ msgstr "нерэчаісная дырэктыва \"override\"" + +#~ 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." +#~ msgstr "" +#~ "\n" +#~ "# Няма файлаў." + +#~ msgid "DIRECTORY" +#~ msgstr "ТЭЧКА" + +#~ msgid "FILE" +#~ msgstr "ФАЙЛ" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Чытае ФАЙЛ як make-файл" + +#~ msgid "Entering" +#~ msgstr "Уваход у" + +#~ msgid "Leaving" +#~ msgstr "выхад з" + +#~ msgid "# No variables." +#~ msgstr "# Няма пераменных." diff --git a/third_party/make/po/bg.gmo b/third_party/make/po/bg.gmo new file mode 100644 index 0000000000000000000000000000000000000000..ea867cc5b45a9cce894ffb585ec57159b8f28d93 GIT binary patch literal 59330 zcmdU&37lM2o$oK|phj>(6h+a?(xe0F4go}L2#^&TvY7?M7-FTny1PhsRZ~kA7YvJ_ zh=MGNU|1DI9fg=cSQ6aFaa=0nHtIY_aZqQ*dCqed-^_EI_x=6<=ia)tba#Th_dc&b zx%t(-_uRAm_wzreZvEtt=iD6e_n8Bt=+)r02S?G|XGPKP57$-xj`8aUfX8$C8t_=~ zT<}HUCE)YG%fKVSYrr1x)8I?MAAvFW>u~+xt|)pL=cj?w!8d|OgImCtgWEv55bXeu z0KW*n0{khs9Q=3iH1J$HaTItJ_$u&zFb2N@R>5C@i@`NCqUSyVE&%@>d;@q!cN8rF zH-l$^Uj<9xb7w@++2AHn=TCroe%5hOGzxA77lHo>o(rA~QMQ8b0#$D`Gm7Q|ec%vy zDYy=N3RJ%rLYzMEGH@CAIH-CK>W!jzf){`_@O$8;;CZv?EBJL#{eAukUjGH)iJadC zsz2WX`@xsZ_IB2R&)0oWeEm2mdVLW*2z&~BA^2PHVDJDc6a8NVir&Y9)4(%9iNd+y zAz&VS3Ah1D*6}jQ1FP8T^>&aVM%mhIKL8=CsqHMp!$&mMTd8Shk*BkuLK_t_NE}o&!an4}dZFICw1h z-$2pfIW+oO@aTZ^LA5^sBEr$TL5+V0D0+Sw{3iHAP|w|Wy7T?dz?X6UJ5co>3{hh6 zWKjKC4XXUx!Iy%!fvWGbpy>W(@CD$%fui%XP#W?3l>z5~i#gAMuqOHp_$u(JaDKp< z*geiq1-TTx4U~L80*ZcL0wrI+0S^NYKg;i*2tJqd(?RuP0f>l48$tEwe()9GPEh^* z7AXGx98`S=(x~)dHYhrs1;*fVQ2o0ER6Xwp)t`@mYX2VawcummLEw)A{t6Vm{x#fx z)jaS2X`tk77!?1n1z!W+3##6)gzMi1)!)Ah=g-2JY5cDSC2!||M}m1!?OqM4zMDYF z>1ROMlZV6kS3vRWTcFx|5)_{gSm6CR3>3dl2Q{7n@M!P~@Nn=x@F?($p!)R`I1~H> zcm#O-Lf7MdQ1>gK`gbj;dOriIp6`LG|DV7E!51&`{vQUa-^YOJXAjr~&JE|op!DYL zpy>1gP~*J?l>ToI_zO_|IUFU9!Batv_d@VMa5Jd;?*cXcZ6GEk`W&eK{T+x2kDham z`^DFRs(&pg{(le@AGU##i$4dYmrsG}?@Rmr{0-oA&WAzu^E&WZ;QgTJ@@Y{0_!fu? zN52MT=ck|R@^~UBKCcBu_qT!12e*OJoBKfV_a~s*|8>B_&vW@dC*a#a$?2y-(e=xq z%KsJk9Pq%!?nhn#iXKMgHd{FgQLG|-) z@CD!xLFwgFU=MiMQm=m@C_0URs^|J}{Q*$zeg`}l{2ll_@K2Vxp1%;3JiHt{2AlyN z3oZpk?;0q6UI#uG{3IxUxE&N7z68n+`~cK*zXp#7U%K4;eI_`A^NnCHcqcdw{5Gg@ z{|Gz|Jmif|w>hBtyAo7=n?Q}{c2ND;1Bwqn1l8{U03`|E-|v zxjbCI8^mNsyTBKM{{nV{&tB>BF%z84`6=KVz!C5y@a}-$2PL=DR{8Z~LDBck;6W-6 z9s<@t@##IF==Tu#VsH* zYDOOerEmWT9tytTO+L;T6rWE5Mc1{U==Bj$^7c(o{QN$sas4MKeja?G>rFQ(I`@I< zM->#m-Un*Dp8{V2eg~BP{~8p3egkTpN50w5SAe4TmEn9lcp~S23#z`u);ND&4@&M9 zfO@_Jz687zlss$)#m6szqW`zRnczQzDj&ba<@t@E?8{bA_qT!S*VjSS|9epFPG9Tv zJR5u+=a+&izXOzg_*uZ`T;z0{4vL;@K=I+-pvLt$C_4T81u;43*l162Rs z1ilu0FE|IhA3P2GCD;cZ{Z{YiMWFg|Jt+R}2F33KbKd{cK=p43oCUrYJQaKdd_DME zQ1W}+dgtpIp!8rVxcPu6dJCxbzBl0Wk{1usH_qP(il3hZMfWd->)!)U=e#%X?QQ@U za{d8u9{62Q{XJ}m7#CasBI?mSpvL|0pz1wt*yk1VLD`+F!K=ZCz_)>CjL4Dufn6KXCGcwS ze()kX^*!);RDKos6Yxnezs37~4uk$Y=et3T`_i}jJn+ZhXE~qw4yWT^gSvm>JDrc$ zfuj31P56Ky}520snTzWfXv24C?$=l53d zRL;Ky>iX}&ZgB8gw?pp-XLJ4-D7yS3C_S3>e%IdusO$HF^T1z)>&Jh<$2$V*`Fp?~ z@OuHDeVvz|4W7gGDky&M29E-N48G-A#7p2(&ez<4?FByxO8$<&(VssDRR7-xE&{&{ zo({g?Ccl0TcqHeSfv8k;4;X{5yxHl}2kN;JsD3;I9(Dlq1SMyOec0={0o3_lfT&!w z=$0t@5cmXmFnIn)oL_^W>iKg}{W|1U_nYT|ui^Y6@U7rG!HdA3fCqtdZgY7#H{hk< zYOZewtKjoK>h|!R;0c_65d4xG;Ul7KbvY|giVz2H;eD)7*cd0wgjiXL@P*B5@=ig!3#M545)Sw{DjZ9mx9M}ejE52@T=f4 z;8URN(6syAKA#L8%lU`E>ELegP?ZBE_x}NI0B3$OiVEN@;2iK-pK?2Q7ASgN1wIe_ z5!es@98`ThpZ4cggJ*F51b8m^2XH>v|EJ!M_k%}q{u}Uv;31#!@qP@%1Vz6C%iudd z>wfH?K+$Uz&TB6CK2Ys{6I=v-A6yI`@u1t8i@}$0{zLF$@E^dF!SlB}-QEWt#QAr? z3&Ed)$ANvHbNc5&$;E@rVlEE9YMeIOAcL-)q2kas4--##7qm<9P@a{hs}Zk7Fq~oAXD&wctO18h8Jr-rk46 zHJtxmcdiMitK@(3i$dzbNT-gcq7*j{+h=fcY%j-{x~T8 z_%65}e9fP`zFh|D`iH;^z@LH|$Eja;`VN5$Illx{Jr9FtfZqn^fiL_E*Mm2LXLEid zcs%%Hun&ChH{9;b1K-H`!{FP&=YP}n`Q4!G&X+)q@Au$LaM`z;39BU-R0vpP+-q=yp;2=f~SBB|I+Ju2Y5K=e*?Y&{15O* z@Z|5f-#j0bJpBM%0{#KagNwiGeA^B_kMo~_w}F2Tei*#!d(7>?*L>f{y$f8)`LrK6 zUIdmn-wwV4JnFApPEP|h-VcLkg1-Po=VO29{3?K=>!n~3d<4va-9K`@z6MnJzXQeB znLl>@+z5((-v#yj?7#MYje>)m?*Xp^kN$5y5BeM^KK}+B0(*bra(^@UcFw;Et_J)6 z#`$&!D7yR>JOX^vPrV--LG|wuP<(mS&+sYWTJT=*p99|dq{jzyf9`SMqadt}4*y#} z|9fzN^K+ka|N9wm9p``Y3t~Vp4-SLh0@cnbzjXd=1`p@_KJWnW1|9mqpRV7|XX)3U zg3k`uU!$A+$sXLswHSoV_BRyDT*KK%!?hg&N4Tdx>JKrA=5Rh8l)OR4=)D|AbM3vM z4o;)3e7+I<1INN}eJ-DeI6lnz4DiJqpW^fN;4vJ3%5hgHi@HV!@cH?m{x0S72mNF8 zQ}6{GuL)&0gzJL)Id*bf%kc*8zXQCOLw~>GI59l)T)X1D)yG4^xuAzKD><&@IF|E` z;a-Jv@feYc-pV0)*56$Yrk8h8=19(O<@f~0bj~m1coB#G4(7Nwe4Y)~I2Lg2K8}Ck zcsu9sueDR&iX#J^jrD z-x5B*89X6;z7@oD``nz*eSCfq$0zvwLhzqCUd-p~beEtH*dOr7r>j|vU zeU4Xg;jD1+D)5~gmvVf7dvD{wWtvY|59;rET+`no@Ri_&ItkY>chMQ)vo0rpviUFP z`fcD*;Bg$U;#kYEm22{yw{ZL;$6gNojdD+a|HSb|jypN#aJ)2JzXyCD=ZnMnAfI#L z^J~GMbN&(z{k@g*Q^7jN?>I2S(VID5!u4;0FXgx?JbN^s@8|Pb;ha*D`!h0jNT z!{L4rT*C1su2ncb$!FR4?{O^P^IO2=ZzUg|!*LzgKLh@IxUq`!6@0#u<5?URactvw zJ=ZVi_)9+P?*)8*AICv_UI)I6V*|%R&fmpx9>?t*pXNB9<1!BUndI*kls$z*f5(6y z180GQ9GmQF6y3q+JNW!2@ISySIF|DHWN-zjzq>gu3ZFOgxytbm9E&+V$#FRMKEv^S zK0n5B2%irGKNz05gwMxue1#+Vdy)@lBq!hn9BVj!&2e9N?h!s;&GB81hdK0j3-|s6 z{4+cAxau^nJxkX)j^sFrdoSZy&T%eBo@+OAY~geE@A7c+Rj|ZyHf25zK092GIX^9Y z{y3i>51;P=`#HY}`~b%|$9p(W{{D^+U*>oZ$59-A!;$>`fDdPL{D|XPp1G0ZZQ!(C3J9ki9e35@=^Mv$)sg9OC7&w~jKn&r^iB&m3uEJ>g@HmfF4so$m6AOs`N4QeZbLpE%vE#o`dlR+mx^(h7d<;)%$IYcargA|m(N{w z&h)hU8QHG)QJ3oLPddIr9oLoSif6{-1^SF5vM~^($9uOz<4BA8R@AStt-`Bwc=Fhs%T7=YIz_xFp`hg z*M^4jWj)4?)~kJS*Qj_qTALBi(%nLFxDwB?t2!^0bHn*?K93T)jl;=VONHb4@=&Qf zmMaeA`{L13X+v$iQPGG*DOU|Ob#?LV{8G*M&@~w6%CuQ1#zQ$qH5iZPYQ=#OimVzb zRNz->xSShf7=_VlOcO2`6W(Jml^Hy|x;T<64ywNV=7IcpwE)AR8loBxj!7>4eUz$mD$qKT@kSn4r(?HLRTv?Zx7lr1 z)66)(F<*=eLorm|l%s0yF+K*Ii0bH;MuioKOg~!x77mP*VzjiNZgme9DkfGvJ)!s* zG?@`9sg`pC`PS#{+=r<9oyW5&hoPty2lGP(df1a#ib@<`z@2#02;;~V@kv1 z&LhWpfXm%8hQyZK?E($$T{aRu>0K#leCo39q-rcAHOe6|cudzJL3L9ePKLq^ zr8pQU?*mx2X4Qqu7p_&crCN2oR;AwJz?wOBbqboVq~u7sR4lv=FJTW$iN=fsW(;;UeOTam3ILl*aICh4qEeLNyqW z!OlH48lu-ASHs;G^`dyh~cncfPq+Fu0@N}!x4y9CXqNq$k zdSQwNSLAbpPRk~JbRv#u7$f=7@ph5~Gbs0knpEUMr2_fQg`mL&JzFqR_b~QSS-RwZ z&VV>vH6InMvNwBiyk@CsjwF4}oTV8bGk0{fv?*TdI*_a400#1>r2^oWHx;TQaj_(y z>-B9=R~kZ{bVGO^q8^*5yJfDFQ0`zsaiYcPRSDQwZZPjvjV4_iE#(G#a`1(btBY!4 zEVsEw*L6Mx*%y>lHAb(DMX8Ne3**>8Q|wxiu%|+J0bd~Q`n(O;TQ91Wi))ptyG)%8 zmbdhjYjy(~mWun-Zf>AjGpE6mGT^}}o))Wa4Svx)7@LbVXN+(Fvm!Vylq%{t`WY2|>DrM_Jy- zD;Pa;;<9&|$*%b!LYE32SK&r&TsDRpLv3Z%ma()pdGJa*TG}K!@mYrVh{;A0b9mnh z`6O0xvB+oQ6n~_ug4I%uSxoESD!ZD9Y@t}GN~7@?Mn-w)1}8VF8Yo^-q}cqI=rdEA zaKBg^TaTTkCJ!x|w3~=5WlBrj)~IQqRwkIK#%a`HgIS;$psNxEL#!V9e4v;^_ojDM zrdzREVNhZC;LLb9{iFy@k!V**MY;i8qeXSN=03P z4W+7eA~Ox;h72^45GjByRVwa+m^`*!K(KADl2DN{8hxe2WTM;~9UaGWlWxq6m&`qH zp*$n59PgIIO|vQ??nxbpKQ~GxVs52R)y&iMgT^G&I-g$}W3IzwMHF)Zv&RcO{`7Sn-@Y;;QSbne|VH+4l-BY^J7olHyK9nRE0nTfNdtudpds9Lxbx+GNtQ zvNkY)101SpQj_Jqn`sRpzd1ipt4c<@G>^+~EHGD-r6?3-AlC5F{;i$S7w=P{fl>_* z+c#JY_GWW_GDFV$Zw(NGs9G(tN)afYmEv!-<-I*K4RER?NQW}fF)PnmxOg#gra9tZ+^w0pTiGH}nm&=H z5RcsG4$g?@;hRW?F-;{_spdCVbReQNMUY(WZeTZpma%H$nccq)VMmNulb7XlKu~Ixn^S*d- zKDTl5jwK~J^=p;p&eh!5xaO}Gj7UOGiz~JD#9`H%CY?zyLrM(2R?KT-E-=p>hCe0G zY4!BPT?0;yLa>$XcfytFT?3+qyow@hqFf{q>M|K%mRYQNHECgr%3+MHFAUePXYF^* zagYI|v+Q5tpUZ3Z~rTquI|InQKLCYH3(`1|mkMwbRe( z(DA+vH{3U0o;VC|1rJs&r4opekjzy2wVa2a3cHBs$|b_;=BujE;*T`_*?b;So?Vs2 z*!m(FnX{KK-gwgSeeu~#SL<^cwVtH7N2!`}eELYWI^H*H)^M@bTPhFFBHgb?E3<~j zM|(%AW20w~F192q1eRGKrW&e}zr#LkDb)~}ykAB%-NYdTgG4-J4#^^~#|4p&?6pb= zFeFGzm&F&%U9n>B(p99}cuZLrjGTgClE-5OmJtS(x*5$WP0>{$iEYsaMJ>qAFwAs# zlKV5sb>s)VI+5PWuW{S5HeRS1H$E|3t*y-%l8J21ny#i|?RxD661|_inxs@~EhZ&U zDl@T)rYHFg6vHMHg^l^>xZ{qC=dx_W=MVt7og2$-(Ug3BX}DH7&8*&Fel!nV?TLBF znNm=CdV#LX&{&Y7hMO-p#fZ&iF36Es)sqmhX4xfM!O;Z0mp`jV>0HY6#l4G{U9fJ& z!j;PwuU^%^Z0WjH{Yw@$+LYhK*N!lQKy)glQH);_rkRPf%3$2ur!ic6Y=Uu)6*eOs z=>$}wOWtb?HMB`nPwInj^khPp430IJW>mI^hCOI_Hzl7>c z9*F9Dl>UY)GfjiUs}YhUQiXD!gqS7V=dW6^xaUG{uy$cY)*{7%`HNv&Zyc{A-Kb9s z7A~5*dhx1tXD^#egh8;7V{S|6i=tI|l*~^uDT#U)_s?VDY}LXQOIOA)U3T7uC3HBK zgx=9^wePlFO9*YM?O9LCCx#OBv#a+F}$=M8YHJ>ZiSaJzBLM9keD(s)Tu~Zn; zNKyuyA%USao8Ci0CSZLrv-ovk-m%X3E+%dwEjfH-tToRgiF0Zc?O(jAe`!2_fmLo% z+7?YyY#}L{r?|{T+QPP?*5RIimgOnP`qET~0`&6v>gl|4X#>-^aaLWTc}y8B?HA2o zzS^fMqXo<&MsmQcSu{UaG!cW?kd7EN&-A#QBS|C;ofgd>LC)fwF(;fT=Lo~*7s>-Q z=*bA;)A4~73Aj&Gx5R_x668fd=ZmVMn+yb^2GumOG{8sNSg+J-2`TWh$|RwG z=1!qF!3`uR+)-#0T-y5Fzy|3jE7z>hVI5M74Y7<1%i&!2jCAOE#$lt^P3wEgqSm2@ z{Ew!j(R@;ir7>jBa(tvnP&35|(;`$qd{B^BCd416AJM`kt74Yf#-oK}<5k#C;>9ed z5;EZ$t1s(Iqp_uEWU3WFTI{jVW{Bz>Vi0m-)1pQq!m_L3X-ZgnD1_yWLYfH1!=t73 z5G9ngg=lM`Q7oh@<-Z&3%d{2lci`|MO`gpmHV0=gzi~@*DwNI^J+SAwQJEnvRag<5 z4z;LIy5S%@gSQonj(rHb6Ktw2iZup78xYEPJkDy63_pq3lBVYnTWXryNNz_)y|rYz zARR4YN~Y{?i=h&`G;|HbN@P3hL}B1=rd5t&Sph&|HD8eXCB!+qU~?5zTAtO`KbwYe z4uVx1kNRgVi#^vyhx?ZW@#+tgjeb(6<(kP@)bHz!jb%dbk$9nD52?q!lwuTP?hO=* zqnunLav+_fkUChYbQ;D@&-66OvW+0Q!#uPwRvSyFE0A0>+U_nkFNkF6lZ-ljhQ+Ua zedb&un0(oiL!$+`$?hT2LY6JTptawvkc%H5k;$Gz}ja%d%FYlLU;or1qF-qEE3Q2?NDixL1U(7BV6%DR?Fh77z_a+GY6zV5y zb}&&-NoLzrS$dwNw`)NpHKlQc|8 zV_(4#dq1GTlH907T926)b=dJ_8yjrfLA1p3l2)e~Px!rl3yb72p%Fd;&f_Rlt5%ho z&0tXdrKN}|PICxj%4Ncy7P6_12a#i4IowepoYOk5_EjGFrKzFm3|Adex$yQ{#Ed zmPodmG-KLSg?#fR#WY=Pgk{Kxrm_m~R#qjy9Rp0w_L-Ma#4zsm;D1KrLY3Ixd|Jyj zpAK^|yIv$GLtZ-=oK*7E2b(Ie2!}*(@F*^|v7|z5my~3wXK`<|$|J}`$_Gm|BHW&V z67i<#t};5U{)Hy8kI9CI&a5ZLLLOAQYE$1z+CbVr^KZ%OTzE_y1X;noL>2pXWKD8c zq3zQN$_J-s(h4C|O2^Z|XXv@CklS>?2ACtZb3G2bTvlo8b0yyu8Lif?Bt_Tp8c%MMVq4>)u{QSVl%5Vz`f7a+yEelVG@eZz?N?9as=Ak~ z{fE_BbRH8SnyRBsCCbhAocre&%Cc!KJ}*rvE=p&Hk~LrN&93h@->Il(Iq+Qs|n`JE|e6?ajI)<3H^MtQJN4Xl)a_Bt}kvXaC88?BM+Zt(GMS4c6nAc3r3?nH#o3yYpJmI|%NuX9C+Xu5NmJW+Z)m2QUY}OVy zZ(cGQKx0g7G0W`fR=TU{l25zR2~}U*9g_5;ma~`<1$l}FYi5!g)rgT>$obexVX^`S z6O0*_4)GGHEA?xQt%Ol#E28Z@#<1ig7ADHMVqVMmM&Hc2t<2_zw2ETKdsfw2O6WZ;9&YN?CH>AcA&N2*IF+V(~b`&UbpiDWhORB%M!rpn@VL&b2>{O)69p!ZCJ7a zF)boLAsVvOQg?H1b4E1e`Qos(eX75S;f=^kVT{(YOst)Wds9< zjV$V7xTaw%#*IeTmydxY>v*4W;kW3@ zP-!NEZaizVS7d>ZCj^t@Z2Zw)5SGP>kv3)4o&3(UC~t5hObX1A33U5V07vd#5ZqGE}EzAhw_;LA#R_C}C7BL^Yt zk3l79k%vn1=KJ-8^6C5afaTeXrD6{%#P*H>jMfx}g8HW{%_>5*VOpA=sA%Ue^UAQt zA+0mZY0>MT#erYi2ha;E{oLKdOWWlV&A2&@-2!N)&R!>zFQW zY0?M(nv+bGa>h*M!qUMwGdrdEq=)V)(TTy9)3hfcdXlr%S7S8o#G5M?5mj9tqB1oy zTeCW*^t26=l1}Q9K1u`IZ46Srskm_*^P2UfCi`)^H?$Gm5G)+yv+4#p%#J8Y8U$Fz z%(5X`iy;7GflX0Xvv@ZZ9%j1CKDajM23)Y4r$o1r`;y#GQ{Wx&}Hu#YCOlA=7^O z3@!FFp0a(+`l6<8Cka)bsin&dn%SJcWMyPqp*?_262&>~pTty!8j>Q(7J`)AbUf@e zO^Rr>vz*sA%FqTps!iQ<<#pbNb-wMIhE+xK%#udx)0o((RUEOBEe>t8u-=w2tt0pf zQoekDFd1lY5?zB4SuZxC+8Q=mW+^QK(eaS|>uYhnwPM&brmy71qvT3hs|w#z#fm1q zPKx=Y*}jTo-_A>V>Xn3rH@<J-$zmE?sSVADJ&JwyUsN`82g?8{QODB>B2VM=gP; z&`jTW2zE_#rHoBz6mE1GQA!rt`oabV(mv3KZ)e8SkDo3!;K3EOd4z!>$dD&&uTi_c z_sS)^GEx|CP2o0L&pb3$M>~9%(I@*6Nl^l>%1I}#lW$S5)y+=V#9t@`T{kqC+Q?}g z%J;B>a+KRk#c|A)id~Km;9vQu!RqTgr&FD>AzN}{j8<({)phw?` z=!;K0;lvYqPMF zrH%3F%(Kthz!t__QQx%IR<|>Fj1^DPA3dw`Irf^*tBnrpW-&f}urN?Pi!W1>BJ3^Z ztBs;`a(LPj_AWKXHM{o&zQl~B<{NCQ_%bj1T?uh#VT=lhI;n;->NUr5hmCUTE8k-6 zS%{`;zR?$-y1r1I_9i1nU+nbJ%DxRrCd$Zf=`VSlrmiPjY)F~#J$Cl1)SuXU&ECuF zyY{}f{yBR>)ZEUQ{Nsxx%GBiJbrTPN7F~Q*FU#+YyE-x z4lBA#b?J0_eOLXl`UB0c0H{A|_a33nUCCrgaQ8UL<|WU79vn3tN%hY_Ys ztyHORd2F6W|8M~H&ruk;n!5P)^&ND2=ibXEE!y_N44S#EetrE$tnCf;n={{P#%VD& z`q{yv2U;<7h~b*J-2^A;r+6j}c~ov=@;7Q20TU85)dIzOHo33ZVIBn`d4MYSsB2A9 zAp%eFCF8wUB6z#;XSgItDtT`xPGIHslojTD)1FW8>JIBUys1BgE=p~}=xyv*as3JU zWjY#nPd>`Y^wjy2fL&u50w%*k_N4kF*hLr?l+o!$|;)ugye{6q>5*LE6;$(4a@H9hhlN zb}PJ8n#uL3e?kU^?;hLBTb>3Bn;dCk^tRU@hl7ubsdUB_zj?&ap<|CI?ovI;D_=UP zRxtH0NxKw=2BT)o-45}0%GriuL6u+}J)BBrL}6(i%Ch$gNtvow*deP4lc}7+%6V~; z=#9p~**CVDI4xU)OSz?fQ~L{N!u6^8U{8D7yDegp-B!oK#G>Kp_P(2*NgX8E7!34dxoaAje@b!;(lTZ6iIvu=O5KW0KBay;NLQRi?dDpnz5AI~dNq|@1F%@gB5Zz4X zH9rUzL1~D+ZB{tmPdhtB(=Aqbs7V@So#!MnBJoU2c6xD&+FRobw*nd-biDhoDeO-#Zy_STMtiI@#*k~b;^z1xA!cnpu08BRK} zfDgOzjLa^?5~E%S1$~5O-ryM%GSqXbfdtis4~xQdR}IYs}I2UOrPdG~K7T&8MasjR!P}q{W#a3e?K;JL4zc`>~}qs-l$nk9rZ* zgo@L|i696fEO}RpM?x0Gx=~6kfcnFlhQA#uF$=mF{2cf8+2({sJ#ugGv~?;GY>yJR zCQ6Sul@f87g3z!kc+=oHoxh|2QZCvMCwcqSL?l$El%Q1xL8+VIVIGA4=AtF<5*u!z z@orIxC_=K<8lB{wRf%qPU`a5}fq_}cqi~4YEZ?LKNcpC6YwD%kmHRei(fiGmO*5w? z`y@kjIi)-v_MmH$*JK&h_9fa2-dbWHBhp9{uv=!L_h)6P)5$AzHqw*4T?;BbXo|nR zZ4TBUx{>zBd#@Jjv7a#2){co3iQ%yU9zRXx{Jc3Sd>N3+lFVLm;ep!+eVo0#e<2B-01(!RiiqT6? zAYrnKlP2|83Ze?;I_v6pD1XO$dHn3g`kmq281N9iew+)*+rnT$(`3Tl8m8%sH|hOH zs3mR>s|&KeRuej`H+dz(^)MV#zk?;TTcNX-bwu+d06UbPp8O^w>28g@seGqBl_7(6+ePdW= zs+inm+iIPXGt;(ZIi6__c=dj>FhI-sG@ogTt`vT|)Uf6TZ7lv`n2H1J6hBL@!B(Lxdw@CS1@}E8uR5QG4cK<7HAJION#6F(x=CqT4qQUjj2;+ zT?6;M!*@bB8Dym=gNm3F5cPd+Fr7}>+zuW?Oz|7u5G9#Gfdp<0f)9366nAsigf!ND zq@Uc`C&->%Kf^k?ji#HI5GdVd%)FanrBQxM!;)z?8o9;Vj&(;wIuxbdv`+Q6LlM*M zeJDo}4Ow1ZxjLlU$E@{JWzj4q?ohuyr_e0xy1m@pj6pU}IueYEFAh^(mdBkujnPyF zSk8Paj$D=Oc_!*j2r@zC&EogKELUe(t;vB@8Kt~TeGyH9%g?MS_oa5yUJXZrQNq`7 zp=Jyere+o%C394+3=XR*DuLY%d)xgTbl3xX{apPHYh5KJ?X(}#E{LR^hKGIi#l-Li zGlr>E@B9!<Nyu?rL;F0@Bz#CrHy!V}#2hYnrDT*>QT5JW zMn`Z;qyj^=OrIFWuxQXEYbhoC#dk7^&VFe>OoUd6v76%Y@G`tc4R^L%g=awPy?6H@ z9a`%5Rl`;aSs9VHVU$n6$-q#ZmbYuM?ndr#v@ zQPvG$>hPq&=JH^e?T^4WOx81d6<@Y%`WkZjCcw^pn&6rJ>J4Vf78h+lx01Hd1-W-Q zYEhJym;ODSNB6mJ=!EHGpL)`nxVDT0WtbAl>b9rtvO%r(Dk96qg~sx}1ppYSeczV@ z6J?%a{+TpBCjXl;cd}ApgMqAuNo~66z&036RNP!_+k{<4ubCO9$YH|{cj*d-P|A^M zChD+1!aX^3wf7$;<|ddztJDk*W`STUHOR!Niq5!CJfl%3j9~%A^h^Rn)W}yX#3+-P zB<_&4u~0)Hfnsim6UHJNsOgbbRJ~(Uzfv(&Lg1d+anYx-YmzEsy;Y%fc*$Z*7SOgz zB)5Fu!6Tux?YOXEFaj%=yfjfO=7bTS)76?VvHfB{L2X!FHuM}}UU^7AOEW+0K!iVXBjF80%azZQ)B!qSr7_*yZ zXYQ;Jgdmu^(t^e>-%ezamLy^igtvWr)O%C<+D4ZhDoC{7f~MxO>c;?m!^W&>hT1gyYLz2o!k%oBA!H(i-lpmulr0q$Nphfd%Ez|Z zp}Uxl{d5smaE&!3t&^A}MT)&7 z+GKabb~B3HhTv)1z1z}oH)Zy>UV-1iq~PJrrRrl+P?~S=6YW0RUn;8pD)(s{bIoWx zLEr6pWxd>jT4bs`xGabA66rqNY1Zi`Z>Ki7u!kK|N}0;d+JcMCdAOm?fF}jNp6Qyj z)>9j#i)6pBNScy*u;O!5)SI}0yFI~-o6*Qr+&gWbUWi)1n-TlU8T?Durp$220Lq{S z*WEst-njlzZflXmqA5+*7!mcTN{f#axY)VURT_pB+$CqjfRj0(G659OO}$^Wez$5d z3p`0xG0SQ<*FUVF@)o5*IM~&o%*gfiJ2|%1@8t#;Scoz&_L%;s4R;7~r&;sNRr6SK z>dKZwPeNWgvyGk`Jv5-iL{nNKYU=Nz+p=C^V#Xdw3MD?owC0(s&ZKpZQO!pr^;cx& z8#a_^qJt8PrVgawvp14e6fw#Ks{49+c=VG)pPK{RG^1q zEaKhhmXhk>QR%5OUc!?mJre3<9-8PGg;JT+p3K~o)o3X^P5cF$D6UHivq?FOhAzqU zGJSn=>%9>KNr+3rN@>xX>i2|CAL8@PW+857z7uw5;B9TKq0^guVHOGf%p#cPOiJ|H z@*5u50ZE+uq!v8@yoO5oJO*AyilI=;zi27QD*~lC~cN94rxN3Kbr;TO7 z;DwvReQQ0#Cwp&j((wOX!Lz0(l9PlXDN!02m}8_a%B!YONuK= zJWFD&AJCjr96@N5TzpL4MR^Y{pc8V$mqk<)qH|qVmv}#N*iMI3%+iJC*CaP?N<}dEw+L08`i@YkT|Q~#S>zL6mP3F=>e%bI+3gC9nRDN zk(IbrLLFnk;N@~P7J@PHgN#O!SN2LGR8?~&4+r!;FH_SnK@cI;O6Kj)Y9ygNjx7DA z74LmE|D^`Qc4?0%xJu>TICZrxHb$qn2-u!8JRxLjD}e$G0_q2`j4&=D$Q26E=!+)J z0Hf9Z7eznUFm4k-P^s>8howmdw4ho&nLO8+VEZ=;{E58Z03{(4Bn2q4S@ z5!O=5B#WyIf9R6Eqgpy8@1kuK(xfncB%|XqRyN%_>ie&uc$lupAmFsFBSF-p-gLuP zn75iz@--06*@-_|)Lta>;4xKk$*9!m_WF(de?5`uw)*u=>twc8()NOElOc03&Nlg+ zY@`QkEbeCLSKysxLN3p~OB*BL4Z5SD$y@2eM=b!oi5@WM`3uyDrZZ{GWom48$GC6F zOP5*Y_EJA6wacgwJxt{*wVh^RBx5`#Su){+i_kLpo(;aE`32rnS1SpYfKFX8SbwZR47oO?Vzo$P4@wfZQDz5x-(`y3Bqd>L!9)%z(GmgF zWZ>AdG!dldk&yOW4YI2x46GOjCDJFT#8@3-1j%)nl}je+xQ#`IO1|O_T5YijUP|Up zQ~6F0-D|8>++g_>$&xz^_wnh{uw=%K-ji3E0Qm`n4MMMRLo}*kmDZeVi&h3*pJ;IV z$lA0Y5Cd{*DaCA9SZnHF4W8k4$u#f=jsH6Xl%j1nX?NF6(Ax6a;;4QnQp30A%t>{e z?;!)?WruK=VMu1kfzyt5N+MIz?#@otf}CV-Cduq1%4QoMMxeb8`Bt`Lb*PgLNg22M z%uqafM(Pv)&BE_*jmVPsJ?N*5p%l?nCj@)$F;F^14@yGFFldfo;kK(zcGhJpg?q1y zG`J3eD%v#6s*9;Cv%RQmxxJ`BHafhfHGOl9gFUV` z5MwzIipnqT);)zebj&hdF3wU1<6elXR66^0KruvO-?5xR@bJZ#&=)#H;p7W&aI&$z zAxdpxW2DXdV_>mO7?6!Uoefr7^)3fgn0AEzrwv(%nw(kEvy&B+=fOKcn@q%HHo_yR zhP;}ddOGqd;}~qbOpI%^?zz=Y&B*&;_EYE8B!9m0dU7Xws%a8BY zW83&JLAVeekZ|y5=z4JT=3Ef<#-<}PmMSLg@OjC^BNX=%AI@-+jYHbbR{ya05iT}y z3oUNSABh~s6jQb|u1mV6<^}Ph$5iSTZ;nVh|GZ^H+{=lvY9N> zoA*`(i(1~o09#l4OyZ|_?smGWmt`pVfq7C0)ifpNS|W?e@p39cW(T8|o#HYt9=Rp= ztwLRDG?CqlkWSbv{80yz2O-iervKKfb~{9skPhiVTg4QQ{@fX}l`Lau>NY|s$5$fM z^`|fY;@llH)w0s+66g-km|zp>sD6VfcL-S(apJIhZCMr!HOaMUC?Xv9(`jhj%@176 zFePpx|HS6|hL*2XDn#gHM>>w5E_ARVG5k*D)D*xvXyJXJWZPB~u}$eUoC>4T^AZlJ zxUJNtQ|OMAY)m00cS2e2Zi5|J0kzm3H;Tl$B~~x&VzNKLoKj{5m6@>pK!-_3v$r!T zOGL7r8=)=Da%A(L!Io|{(ow$x1JT;dE0L3AJ;*VaHSf_3zWH}Rn6ZlR;c3$y8Rto! zhE%q?jIomSvDZG-iJ+5b_!Rn~&ZMmx;nk3ZEg7OCc#jk7TSryeM1rm4^?Q`sQ&b|h zsj9@HVp~YD&`#&cR-F723F4)l*+I>@rI5yDP0vh8V}yqW$42TpAtcGA&^$M_iKsN)ahrYM@zl{M2b%!Z{l$}F3pJDcyt=%hKHY3yncrAd0_ z@2muiB?{P@0+FW~)ifH{Sdftr$);+iPP!VU^ih(lb3mZ--;M*feU<5&*+G%Oz zx6_VdqFwxOQ2lQ7M0+%l8)%5^1rKT+&?3i<=4BQ+E)OoG8;~PV%UwTw>baO~2m9MY zPD+zfszj@;X!;7RU|?x*Py0m4=PV7TGgP|LBi6aHH)~XbNDSx}4TsUBiEcHKmT-BX zE{}Dkzb-}2WXd+Yp=dRAZ8R0WmFtp^8M@5IjMI=CF_MZ_7H>MEo@QfaG}~1t@em8;Xr!i6M!N`K&nhr>dQX3K_iLqX9~+(Q!ADz zO(>*pTT8PzW||d`eNeQUb*_?5b&BpP+7w^4;376L3E-NA2(nI@uaoPZn-v}nUodDU ziT}RVM8imFC2Oo~fFk!vzZxhd>_8J+_*XAw{Vfy{9TO_01oiO|#)RMMQdLmv3ZsoS zGx4Zc5e$TPhmoiIoYK{)J?3AGq9QvVm}qJg%2X>Dc%*4S%zT`Z9aJvJ7__8LizWP5 zz?7UJ^0Zl?&MMCq1@mHW+DO zAljN=n%rK5Um=sbGs|f{#8{h1Z{zvSCcR6rp$>afvCjT(!=)MDF%>4Uw@&^g}zTWG!0G(T=BicINCfsdIR zk`D8Nxx|Gj9Zf_O>a+JB4^?tK>xb=C$>Oq0-2^X*GwoFjL!Z%OrAuTM>AU97n!np` zuwe%17SbhypA^8)n%a01Xs$V2I&Z#BITi7YjXWmOnWV3&lkrTNmh{l)O5qDS)`lk&?iiwJ3DynVq&ROMl6v@OsAv%}+%TsWy3}NLh@fnWs1@PlBVWW+{wFNfVJn-$ zEZNm$@m0Fa&*pU~f_+K~`Fg4sYx&No^s?hrJIJjCvy_;4m1kQz+?L6R=G56NmMOih z^dflZtdX!s8_oi`WKlEW6}nmqB}63p3nfX*qDf83x5KK(?H9XjOcm#n(_9@6$F)y@+VVb!euBa z;(PpLJ=uGCb|jhant8X)(P-&8GkIXzYu=^VQ?__$)U z(s_O~qu8dK4Xy6nr&d98Yn~891HZjl^^FVsm*gsJoWX5QT(rY1$RBK@w(2*^B(lh8 z@yl`J?P|eALmBy8kB>4-OsHV1hqAOKTA+|%r~HAI!Fk7-(%1TS#b?)2C+FeiOgdxW znsFviSg3$6G8e5ZqfJKf-A_zb&WuK~Phs{xmpn1dJ{ftKM7RNx^h;yPpco)AhYd#a_BMzj!&-{j#(^JK9j zv6AsK%d>=_$*6=inEV!#6iF{tM)n*G8R5v})p||pA@!bK2iy&*gkV`D$ovKaAz`8n zw(-!KPWpotHxHoM0#za@5{}R*5B@BO;)cDoCW(PCecZKxFqxasotxw?THY-rd#Lac zUg#dGAJK%OQ~yl~Gh=?i2(LjvmZXDX9sCOm!r9&>9?NHj_RX}wXH7jl1+HlmR&wI% zBLtwSurp@j2cAxUGQ*v`FUiC}L9j*KB8B&;oeCEGTV$r-Rc77x(`gxBOochAN0Wex z0lswO_TQM?o=EK|2;P8R7H<;Lp_`g_NFda(It+v5je`f%l}PvbU^hG}mmT#jMbe4H z1|{=|`i@Apn8%RFq^7`O@jmH=@!up{jbl;Vf?I#|s03=lnoO6ZW4?y#LM_Fi@A^NC z$~D2N;)l}Ay(b$JSq{+{W~hl)>&l?DRn50M$=4be#hYM@JWklB5vXffN{FTzYG}eE z%FzT07rL$W^`VFdC`7wL|Z?@V%K6HJX+9{ixA;B-3L-dfYltECmwF287HHHiT#%0_eAFHDHBq zNNi@gQv7k(E<+n4I#U`M7!yj=otRI8Xb(%-H3hL>zE!1^h6-s^VnWf_gTT~PD(+uX zvFGeZx%TBji?*ahmXv@gD7cmmXs*LRTrNToN{g(BNUdZN(iCm-3%XLzWPH#g*mECA zqO0l8?OOk_I6$NlP)*l3hpV^&QlQ+@qo}dKr znW&VdieyTZGU^9^r&7pkhp5Q~R8#t0skNNYr5SZ4F3Bv>e6w;HP2U;}ebP50{0A|N z5Rx1{`EbPb%;MO-jlliVgg(BF3hgwIJ!|`gW78(7nVVX^Y-6O#EdR(dYpak#620<; zpQj8JWq$xUXk{yn-9k_sCLuO5rAY*dd>SQ*F}8_4eUopasqj)weh&YCY!Hbnr6b%r4x4p0rTRwx;O|loBS4a3e2AFEd$BS>wcwbX*wJfSOVp5)WG2 zBLXE(uX)!&`Ymm!slj*j*s046QcEYZ9AZd{HWYyb&&NWrw^$g04=uOkma-xnPA$xD zHFDWXbuY~tyD8Pzvog(gEI~A=@RVZS`wsS2gRv0LYmHBJ$-q|Aq%3OKs|+diQwI9l zL0}v|G2PsOOct`~SM?(5!RGV4=k0CN}VtAHGAVVk65&$w4wZ*wd!?o^(l)gM}ILgSHa#O!h4VHEG^^B0K;8s9!Sr zQ+yq&t!KuV5J4por4$3{)f_Stq)zU%L+l0*_NPX<&WU3|{hGMhn6^4CJwx|8^>QEU zY!WBT8}m^4?B-qAHdB!GvgoLz0o5;?CyouvJ&_x34Ne==Z`t*h^#WIcRJz)7LrRq; z8x65L3QSs-`OVtMH6%ZM>pzvAdQSJb?iI|A$bf7$6GDY<#1r?{_%52PTr%~hMOE)V ztZwxZ`lj)t>JTH$nIw6DW~G)n!_Fu>rTL|ecFHQU#ZwYmuhQt5&O_|0k>M~7_de;& zM23E**VbUdXxot@Wd%d}2;YY_noIb(5OaWx%OqEa0o4$Ktw4rl$^1D$K4+dR!-p^FIvm1bZ0z!|r9 zD|I5h@w2wbCDhK{WHOt^XKA;s$6``=y@Y}dn?lMk$?r-8>OyS6=5osJ<>40dg!UwCq*VftF^>Tz8##OnB*^Wdu>Ogot`-w%v^2 z(=HAL-!c}Y_=15*Y7SItG8eL7v6YvJ*(wDv`!6eR!5)~@17#X5heeq%1*2X4k_Cl# zqD$%mwIEG>3 zwHmYbP$fgN?JMSiscr{44|M)PyQDiwAl0tOO>g%xUAK;BTCwWGvScLcXv$;b@Pv<2 zSGD43p{SpW6Q3~T6Xv{pt)lr`O|qJhM0A%prrV>vu4V$8f+nLPB_nnv`B7c=9J7WX z!m9yj?wee#xWUEnDw&?McGZI>bcO(NdQKSi(bD{g#5$(9Dpw~8bUM`c^j zdoJ!${!_0#x|5FEUN5sLwA~zZ1epzWFfw@;byBT0?_Qalc>kYtQ(qjBx1qaXyI8z* zHNU5csYzy#Hj_7rbVjGyI++rWC(N#+E}4zLQ?Su%=aCRJ>e)=73H?(e6BrRT&zSllJIWE6+-m?y#xcZ+JR9<2Q;NNM-Z2R+9e{}hcg7=^XbT+dT;@WaX$pQA zWjfYxWKUV+ZHShc5OQDJkfOKDu&leCjFYk7H|j*xzo}3hEN!ZsbmF?wc)mEEyw$_g z)jsEfAC0%ybh5EjlT6wQ#X@!6&|vorC}VHZXs@3;`&;{h+W2T;AXm+wlPeC6=DU~G zs%juk=Xo6m@(eW8Uu}U37$s{ND0Qfb9Sg@{Z#Vii#GdUBO?`4 G@_z&1r#=P% literal 0 HcmV?d00001 diff --git a/third_party/make/po/bg.po b/third_party/make/po/bg.po new file mode 100644 index 00000000000..641201e7f91 --- /dev/null +++ b/third_party/make/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 , 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 \n" +"Language-Team: Bulgarian \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 "" +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 \n" +msgstr "" +"Съобщавайте за програмни грешки на .\n" +"За грешки в българския превод на .\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 \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" +"\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)" diff --git a/third_party/make/po/boldquot.sed b/third_party/make/po/boldquot.sed new file mode 100644 index 00000000000..4b937aa517b --- /dev/null +++ b/third_party/make/po/boldquot.sed @@ -0,0 +1,10 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g +s/“/“/g +s/”/”/g +s/‘/‘/g +s/’/’/g diff --git a/third_party/make/po/cs.gmo b/third_party/make/po/cs.gmo new file mode 100644 index 0000000000000000000000000000000000000000..a59c5728008f7b135778a1b9069e8dc6bc476de8 GIT binary patch literal 45689 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, 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) +# chain → řetězec +# jobserver → správce úloh +# make (verb) → vyrobit +# make (substantivum) → (program) make (skloňovat, nelze-li jinak) +# makefile → makefile (nepřekládat, ale skloňovat) +# (archive) member → prvek +# (C structure) member → člen +# pattern → vzor (nikoliv vzorek) +# prerequisite → prerekvizita (předpoklad se nehodí jako duální slovo +# k target) +# reap (child) → uklidit potomka +# recipe → návod +# target → cíl +# token → token (nepřekládat) +# +# SECONDARY, INTERMEDIATE, PRECIOUS apod. nepřekládat, i když jsou použity +# jako přívlastek. Jedná se o identifikátory jazyka make. +# +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 17:47+01:00\n" +"Last-Translator: Petr Pisar \n" +"Language-Team: Czech \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" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "pokus použít nepodporovanou vlastnost: „%s“" + +#: 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é" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Archiv „%s“ neexistuje" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: „%s“ není platným archivem" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Prvek „%s“ v „%s“ neexistuje" + +#: 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“" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "funkce lbr$ini_control() selhala se stavem = %d" + +#: 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 +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (název může být zkrácen)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: 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" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Návod má příliš mnoho řádků (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Přerušeno.\n" + +#: 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" + +#: 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" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Maže se soubor „%s“" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Maže se soubor „%s“" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# spustitelný návod" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (vestavěný):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (z „%s“, řádek %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Adresáře\n" + +#: 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" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "# %s (klíč %s, čas změny obsahu %I64u): nebylo možné otevřít.\n" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (klíč %s, čas změny obsahu %I64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (zařízení %d, iuzel [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (zařízení %ld, iuzel %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Žádný" + +# TODO: Pluralize +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " souborů, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "žádný " + +# TODO: Pluralize +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " nemožností " + +#: src/dir.c:1154 +msgid " so far." +msgstr " zatím." + +# TODO: Pluralize +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " nemožností v %lu adresářích.\n" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekurzivní proměnná „%s“ odkazuje na sebe (nakonec)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "neukončený odkaz na proměnnou" + +#: 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," + +#: 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," + +#: 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“." + +#: 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“." + +#: 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" + +#: 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" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "Maže se mezilehlý soubor „%s“ " + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Odstraňují se mezilehlé soubory…\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Aktuální čas" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Časový údaj mimo rozsah, nahrazuje se %s" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Není cílem:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Cenný soubor (prerekvizita k .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Falešný cíl (prerekvizita k .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Cíl příkazové řádky." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Default, MAKEFILES nebo -include/sinclude makefile." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Vestavěné pravidlo" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Hledalo se za pomoci implicitních pravidel." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Nehledalo se za pomoci implicitních pravidel." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Kořen implicitního/statického vzoru: „%s“\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Soubor je mezilehlá prerekvizita." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Rovněž vyrábí:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Čas změny obsahu se nikdy nekontroluje." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Soubor neexistuje." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Soubor je velmi starý." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Obsah naposledy změněn v %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Soubor byl aktualizován." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Soubor nebyl aktualizován." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Návod se právě vykonává (TOTO JE CHYBA)." + +#: 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)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Úspěšně aktualizováno." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Je třeba aktualizovat (-q je nastaveno)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Aktualizace selhala." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Neplatná hodnota v členu „command_state“!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Soubory" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# Statistika hašovací tabulky souborů:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Položka „%s“ není v keši: %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "nečíselný první argument funkce „word“" + +#: 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" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "nečíselný první argument funkce „wordlist“" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "nečíselný druhý argument funkce „wordlist“" + +#: src/function.c:1533 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(vstup) selhalo (chyba=%ld)\n" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() selhalo (chyba=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() selhalo\n" + +#: 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" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "soubor: chybí název souboru" + +#: src/function.c:2234 src/function.c:2265 +#, c-format +msgid "open: %s: %s" +msgstr "otevření: %s: %s" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "zápis: %s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "zavření: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "soubor: příliš mnoho argumentů" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "čtení: %s: %s" + +#: src/function.c:2290 +#, c-format +msgid "file: invalid file operation: %s" +msgstr "soubor: neplatná operace na souboru: %s" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "nedostatečný počet argumentů (%d) funkce „%s“" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "na této platformě neimplementováno: funkce „%s“" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "neukončené volání funkce „%s“: chybí „%c“" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Prázdný název funkce" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Neplatný název funkce: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Název funkce je příliš dlouhý: %s" + +#: 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" + +#: 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" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: přepínač „%s“ není jednoznačný\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: nerozpoznaný přepínač „--%s“\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: nerozpoznaný přepínač „%c%s“\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: zakázaný přepínač – %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: neplatný přepínač – %c\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expanduje se „%s“\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Vyhodnocuje se „%s“\n" + +# TODO: Pluralize +#: 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" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Zátěž = %lu/%lu = %.0f %%, " + +#: src/hash.c:282 +#, c-format +msgid "Rehash=%u, " +msgstr "Přehašováno = %u, " + +#: src/hash.c:283 +#, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Kolizí = %lu/%lu = %.0f %%" + +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Hledá se implicitní pravidlo pro „%s“.\n" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Zabraňuje se rekurzi implicitního pravidla.\n" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Kořen je příliš dlouhý: „%s%.*s“.\n" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Zkouší se pravidlo vzoru s kořenem „%.*s“.\n" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Zamítá se nemožná prerekvizita pravidla „%s“.\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Zamítá se nemožná implicitní prerekvizita „%s“.\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Zkouší se prerekvizita pravidla „%s“.\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Zkouší se implicitní prerekvizita „%s“.\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Nalezena prerekvizita „%s“ jako VPATH „%s“\n" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Dočasný soubor nelze vytvořit\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (obraz paměti uložen)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (ignorováno)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Chyba %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Čeká se na nedokončené úlohy…" + +#: 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 +#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644 +#, c-format +msgid " (remote)" +msgstr " (vzdálený)" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Uvolněn token pro potomka %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() nedokázala spustit proces (chyba=%ld)\n" + +# FIXME: Pluralize +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Napočítáno %d argumentů v selhaném spuštění\n" + +#: 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" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Získán token pro potomka %p (%s).\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: cíl „%s“ neexistuje" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: aktualizovat cíl „%s“ potřebný pro %s" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "omezení zátěže nelze vynutit: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Standardní vstup nelze obnovit\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Standardní výstup nelze obnovit\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Chybový výstup nelze obnovit\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: možná byl vyčerpán prostor pro prostředí" + +#: 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" + +#: 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" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Obsah dávkového souboru:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Obsah dávkového souboru:%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 (řádek %d) Chybný kontext shellu (!unixy && !batch_mode_shell)\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Pokus zavést prázdný název symbolu: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Zavádí se symbol %s z %s\n" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Přepínače:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoruje se kvůli kompatibilitě.\n" + +#: 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" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C ADRESÁŘ, --directory=ADRESÁŘ\n" +" Před děláním čehokoliv se přepne do ADRESÁŘE.\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Vypisuje mnoho ladicích údajů.\n" + +#: 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" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Proměnné prostředí přebijí ty z makefilu.\n" + +#: src/main.c:350 +msgid "" +" -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" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f SOUBOR, --file=SOUBOR, --makefile=SOUBOR\n" +" Načte SOUBOR coby makefile.\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Vypíše tuto zprávu a skončí.\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignoruje chyby z návodů.\n" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I ADRESÁŘ, --include-dir=ADRESÁŘ\n" +" Vložené makefily hledá v ADRESÁŘI.\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] Dovolí nejvíce N úloh najednou;\n" +" nekonečno úloh bez argumentu.\n" + +#: 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" + +#: 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" +" Nespouští souběžné úlohy, dokud zátěž\n" +" neklesne pod 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 Použije nejnovější čas změny obsahu z časů\n" +" symbolických odkazů a cíle.\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" +" Ve skutečnosti nevykoná žádný návod, pouze\n" +" jej vypíše.\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 SOUBOR, --old-file=SOUBOR, --assume-old=SOUBOR\n" +" Považuje SOUBOR za velmi starý a znovu jej\n" +" nevyrobí.\n" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" +" -O[DRUH], --output-sync[=DRUH]\n" +" Synchronizuje výstup souběžných úloh podle " +"DRUHU.\n" + +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Nespustí žádný návod. Návratový kód řekne,\n" +" jestli je aktuální.\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Neopisuje návod.\n" + +#: 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" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Vypne -k.\n" + +#: 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" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr " --trace Vypisuje trasovací údaje.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Vypisuje aktuální adresář.\n" + +#: 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" + +#: 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 SOUBOR, --what-if=SOUBOR, --new-file=SOUBOR, --assume-new=SOUBOR\n" +" Považuje SOUBOR za nekonečně nový.\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Upozorní, kdykoliv je odkazováno na\n" +" nedefinovanou proměnnou.\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "prázdný řetězec není platný název souboru" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "zadána neznámá úroveň ladění „%s“" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "neznámý druh synchronizace výstupu „%s“" + +#: 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" + +#: 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" +"Filtr neošetřených výjimek zavolán z programu %s\n" +"Kód výjimky = %lx\n" +"Příznaky výjimky = %lx\n" +"Adresa výjimky = 0x%p\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/main.c:1609 +#, c-format +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 „+“." + +#: 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." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefile na standardním vstupu uveden dvakrát." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (dočasný soubor)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (dočasný soubor)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Návrat k jednoúlohovému režimu (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "Symbolické odkazy nejsou podporovány: vypíná se -L." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Soubory makefile se aktualizují…\n" + +#: 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" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Výroba nového makefilu „%s“ selhala." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Vložený makefile „%s“ nebyl nalezen." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefile „%s“ nebyl nalezen" + +#: 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." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Znovu se spouští [%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (dočasný soubor): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL obsahuje více než jeden cíl" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Žádné cíle" + +#: 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" + +#: 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é." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Použití: %s [PŘEPÍNAČE] [CÍLE]…\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Tento program byl sestaven pro %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Tento program byl sestaven pro %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Chyby v programu hlaste anglicky na . Nedostatky\n" +"v překladu hlaste česky na .\n" + +#: 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" + +#: 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" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sSestaveno pro %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%s Sestaveno pro %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLicence GPLv3+: GNU GPL verze 3 nebo novější \n" +"%sToto je svobodné programové vybavení: máte právo jej měnit a dále šířit.\n" +"%sNesposkytuje se ŽÁDNÁ ZÁRUKA, jak jen zákon dovoluje.\n" + +# FIXME: i18n %s (time) +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Databáze maku vypsána v %s" + +# FIXME: i18n %s (time) +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Konec databáze maku v %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Přístup zahájen" + +#: src/misc.c:743 +msgid "User access" +msgstr "Přístup uživatelem" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Přístup makem" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Přístup potomkem" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Vstupuje se do neznámého adresáře\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s Opouští se neznámý adresář\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Vstupuje se do adresáře „%s“\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Opouští se adresář „%s“\n" + +#: 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" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Opouští se neznámý adresář\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Vstupuje se do adresáře „%s“\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Opouští se adresář „%s“\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "chyba zápisu: standardní výstup" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Konec.\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 "" +"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" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "duplikace roury úloh" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "inicializace roury správce úloh" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "vnitřní chyba: neplatný řetězec --jobserver-auth „%s“" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Klient správce úloh (deskriptory %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "kolona správce úloh" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "zápis správce úloh" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "čtení z roury úloh" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Čtou se makefily…\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Čte se makefile „%s“" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (žádný výchozí cíl)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (vyhledávací cesta)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (nestarat se)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (žádný expanze ~)" + +#: 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" + +#: 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" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "neplatná syntaxe podmínky" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: zavedení selhalo" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "návod zahájen před prvním cílem" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "před návodem chybí pravidlo" + +#: 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?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "chybí oddělovač" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "chybí vzor cíle" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "více vzorů cíle" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "vzor cíle neobsahuje „%%“" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "chybí „endif“" + +#: 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é" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "nadbytečný text po klíčovém slovu „define“" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "chybí „endef“, neukončený „define“" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "nadbytečný text po klíčovém slovu „endef“" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "nadbytečný text po klíčovém slovu „%s“" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "nadbytečný „%s“" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "pouze jeden „else“ na podmínku" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Chybě utvořená definice proměnné specifické pro cíl" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "prerekvizitu nelze definovat v návodu" + +#: 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ů" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "smíšené implicitní a normální pravidla" + +#: src/read.c:2107 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "cíl „%s“ neodpovídá vzoru cíle" + +#: 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 ::" + +#: 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" + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "pozor: návod pro cíl „%s“ bude přebit" + +#: 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" + +#: src/read.c:2254 +#, c-format +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "*** smíšená implicitní a normální pravidla: zastaralá skladba" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Pro „%s“ nebude nic uděláno." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "„%s“ je aktuální." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Uklízí se soubor „%s“.\n" + +#: 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" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sŽádné pravidlo jak vyrobit cíl „%s“%s" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Zvažuje se cílový soubor „%s“.\n" + +#: src/remake.c:432 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Nedávná aktualizace souboru „%s“ selhala.\n" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Soubor „%s“ již byl uvážen.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Stále se aktualizuje soubor „%s“.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Aktualizace soubor „%s“ dokončena.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Soubor „%s“ neexistuje.\n" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Pozor: Soubor .LOW_RESOLUTION_TIME „%s“ má časový údaj ve vysokém " +"rozlišení" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Pro „%s“ se použije výchozí návod.\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Kruhová závislost „%s ← %s zahozena." + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Prerekvizity cílového souboru „%s“ dokončeny.\n" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Prerekvizity „%s“ se vyrábějí.\n" + +#: 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" + +#: 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." + +#: 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" + +#: src/remake.c:756 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Prerekvizita „%s“ cíle „%s“ neexistuje.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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 +#: 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" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Cíl „%s“ není třeba znovu vyrábět" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; použije se název „%s“ z VPATH" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Cíl „%s“ je třeba znovu vyrobit.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ignoruje se název „%s“ z VPATH.\n" + +#: 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" + +#: 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" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Cílový soubor „%s“ byl úspěšně znovu vyroben.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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. +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs nebude exportovat: %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" +"# Implicitní pravidla" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Žádná implicitní pravidla." + +# FIXME: Pluralize +#: src/rule.c:548 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u implicitních pravidel, %u (%.1f %%) koncových" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "CHYBA: num_pattern_rules je chybný! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "neznámý signál" + +# Keep signal names in sync with GNU libc translations. +#: src/signame.c:92 +msgid "Hangup" +msgstr "Odpojen terminál (SIGHUP)" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Přerušení (SIGINT)" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Konec (SIGQUIT)" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Nedovolená instrukce (SIGILL)" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Trasovací/ladící past (SIGTRAP)" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Neúspěšně ukončen (SIGABRT)" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "IOT past (SIGIOT)" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "EMT past (SIGEMT)" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Výjimka práce s pohyblivou řádovou čárkou (SIGFPE)" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Zabit (SIGKILL)" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Chyba na sběrnici (neplatná adresa) (SIGBUS)" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Neoprávněný přístup do paměti (SIGSEGV)" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Chybné volání systému (SIGSYS)" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Roura přerušena (SIGPIPE)" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Budík (SIGALRM)" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Ukončen (SIGTERM)" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Uživatelem definovaný signál 1 (SIGUSR1)" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Uživatelem definovaný signál 2 (SIGUSR2)" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Potomek skončil (SIGCHLD)" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Výpadek napájení (SIGPWR)" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Pozastaven (SIGTSTP)" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Pozastaven (vstup TTY) (SIGTTIN)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Pozastaven (výstup TTY) (SIGTTOU)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Pozastaven (SIGSTOP)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Překročen časový limit pro procesor (SIGXCPU)" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Překročen limit délky souboru (SIGXFS2)" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtuální časovač vypršel (SIGVTALRM)" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Profilovací časovač vypršel (SIGPROF)" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Okno se změnilo (SIGWINCH)" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Je pokračováno (SIGCONT)" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Naléhavá I/O situace (SIGURG)" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "Vstup/Výstup možný (SIGIO)" + +# SIGWIND exists on Darwin +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "Okno se změnilo (SIGWIND)" + +# SIGPHONE exists on Unix PC (3B1) +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "Změna stavu linky (SIGPHONE)" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Prostředek byl ztracen (SIGLOST)" + +# SIGDANGER exists on AIX +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Nebezpečí nedostatku paměti (SIGDANGER)" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Žádost o informaci (SIGINFO)" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Koprocesor pro práci s pohyblivou řádkou není dostupný (SIGNOFP)" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Žádná keš řetězců\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 užito z keše řetězců: %lu (%lu) / řetězců = %lu / úložiště = %lu B / " +"prům. = %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 současná keš: velikost = %hu B / užito = %hu B / počet = %hu / prům. = " +"%u B\n" + +#: 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" + +#: 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 volno dalších: celkem = %lu B / max. = %lu B / min. = %lu B / prům. = " +"%hu B\n" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s vytížení keše řetězců: dotazů = %lu / poměr nálezů = %lu %%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# Statistika hašovací tabulky:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automatická" + +#: src/variable.c:1656 +msgid "default" +msgstr "výchozí" + +#: src/variable.c:1659 +msgid "environment" +msgstr "prostředí" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "prostředí z přepínače -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "příkazový řádek" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "klíčové slovo „override“" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (z „%s“, řádek %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# statistika hašovací tabulky pro množinu proměnných:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Proměnné\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Hodnoty proměnných specifických pro vzor" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Žádné hodnoty proměnných specifických pro vzor." + +# FIXME: Pluralize +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# Hodnot proměnných specifických pro vzor: %u" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "pozor: nedefinovaná proměnná „%.*s“" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "volání sys$search() selhalo s %d\n" + +#: 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" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "VESTAVĚNÝ PŘÍKAZ 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 "Výstup připojen k %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Připojit %.*s a uklidit\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Místo toho se spustí %s\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Vyhledávací cesty VPATH\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Žádné vyhledávací cesty „vpath“." + +# FIXME: Pluralize +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"$ Vyhledávacích cest „vpath“: %u\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Žádná obecná vyhledávací cesta (proměnná „VPATH“)." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Obecná vyhledávací cesta (proměnná „VPATH“):\n" +"# " + +#: 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" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "vytváření semaforu správce úloh: (Chyba %ld: %s)" + +#: 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)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Klient správce úloh (semafor %s)\n" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "uvolnění semaforu správce úloh: (Chyba %ld: %s)" + +#: 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" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] Chyba 0x%x%s" + +#~ msgid "%s[%s] %s%s%s" +#~ msgstr "%s[%s] %s%s%s" + +#~ msgid "dup jobserver" +#~ msgstr "služba dup() nad správcem úloh" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Pozor: Prázdné přesměrování\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "vnitřní chyba: command_state pro „%s“" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "VESTAVĚNÝ [%s][%s]\n" + +#~ msgid "BUILTIN ECHO %s->%s\n" +#~ msgstr "VESTAVĚNÝ PŘÍKAZ ECHO %s → %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Neznámý vestavěný příkaz „%s“\n" + +#~ msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +#~ msgstr "Vestavěný příkaz není v ONESHELL znám nebo podporován: „%s“\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Chyba, prázdný příkaz\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Vstup přesměrován z %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Chyby přesměrovány do %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Výstup přesměrován do %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Chyba oddělení podprocesu, %d\n" + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "vnitřní chyba: více přepínačů --sync-mutex" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "vnitřní chyba: více přepínačů --jobserver-fds" + +#~ msgid "virtual memory exhausted" +#~ msgstr "virtuální paměť vyčerpána" + +#~ msgid "write error" +#~ msgstr "chyba zápisu" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "VESTAVĚNÝ RM %s\n" + +#~ msgid "# Invalid value in 'update_status' member!" +#~ msgstr "# Neplatná hodnota v členu „update_status“!" + +#~ msgid "unknown trace mode '%s'" +#~ msgstr "neznámý režim trasování „%s“" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Chyba 0x%x (ignorováno)" + +#~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +#~ msgstr "Za účelem aktualizace cíle „%3$s“ se volá se návod z %1$s:%2$lu.\n" + +#~ msgid "Invoking builtin recipe to update target `%s'.\n" +#~ msgstr "Za účelem aktualizace cíle „%s“ se volá vestavěný návod.\n" + +#~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +#~ msgstr "" +#~ "%s počet vyrovnávacích pamětí keše řetězců: %d (* %d B/buffer = %d B)\n" + +#~ msgid "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# statistika hašovací tabulky keše řetězců:\n" +#~ "# " diff --git a/third_party/make/po/da.gmo b/third_party/make/po/da.gmo new file mode 100644 index 0000000000000000000000000000000000000000..41d50a294df0277269b86a442c08dea7e8498260 GIT binary patch literal 41220 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 NP-Bt^>^Yrj{y(p5J3asa literal 0 HcmV?d00001 diff --git a/third_party/make/po/da.po b/third_party/make/po/da.po new file mode 100644 index 00000000000..423809eb566 --- /dev/null +++ b/third_party/make/po/da.po @@ -0,0 +1,2430 @@ +# Danish messages for make +# Copyright (C) 2001, 2016 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# +# Byrial Ole Jensen , 2001 +# Ask Hjorth Larsen , 2010, 2016. +# +# Ordliste +# -------- +# +# archive -> arkiv +# member (i arkiv) -> element +# library -> bibliotek +# recipe -> opskrift? +# pipe -> pipe +# +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-04 18:52+0100\n" +"Last-Translator: Ask Hjorth Larsen \n" +"Language-Team: Danish \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" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "forsøg på at bruge funktion som ikke understøttes: \"%s\"" + +#: src/ar.c:123 +#, c-format +msgid "touch archive member is not available on VMS" +msgstr "\"touch arkivelement\" er ikke tilgængelig på VMS" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Arkivet \"%s\" findes ikke" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: \"%s\" er ikke et gyldigt arkiv" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Elementet \"%s\" findes ikke i \"%s\"" + +#: 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\"" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() fejlede med status = %d" + +#: 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 slå elementstatus %d op" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (navnet kan være forkortet)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Tidsstempel %s" + +#: src/arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modus = 0%o.\n" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Opskriften har for mange linjer (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Afbrydelse.\n" + +#: 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" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Arkivmedlemmet \"%s\" er måske falsk; ikke slettet" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Sletter filen \"%s\"" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Sletter filen \"%s\"" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# kommandoer der skal køres" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (indbyggede):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (fra \"%s\", linje %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Filkataloger\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: kunne ikke undersøges med stat.\n" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "# %s (nøgle %s, mtime %I64u): kunne ikke åbnes.\n" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (nøgle %s, mtime %I64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (enhed %d, inode [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (enhed %ld, inode %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Ingen" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " filer, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "ingen" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " umuligheder" + +#: src/dir.c:1154 +msgid " so far." +msgstr " indtil videre." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " umuligheder i %lu kataloger.\n" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekursiv variabel \"%s\" refererer (i sidste ende) til sig selv" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "uafsluttet variabelreference" + +#: src/file.c:278 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Opskrift blev angivet for filen \"%s\" i %s:%lu," + +#: src/file.c:283 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Opskrift for filen \"%s\" blev fundet ved implicit regelsøgning," + +#: 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\"." + +#: src/file.c:290 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" +"Opskriften for \"%s\" vil blive ignoreret til fordel for den for \"%s\"." + +#: 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\"" + +#: 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\"" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Sletter mellemfil \"%s\"" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Sletter mellemfiler ...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Aktuel tid" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tidsstempel i forkert område; bruger %s" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Ikke et mål:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Værdifuld fil (forudsætning for .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Falsk mål (forudsætning for .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Kommandolinjemål." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Et forvalg, MAKEFILES, eller -include/sinclude makefile." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Indbygget regel" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Der er udført implicit regelsøgning." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Der er ikke udført implicit regelsøgning." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Implicit/statisk mønsterstamme: \"%s\"\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Filen er en mellemfil." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Skaber også:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Ændringstid ikke tjekket." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Filen findes ikke." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Filen er meget gammel." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Sidst ændret %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Filen er blevet opdateret." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Filen er ikke blevet opdateret." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Der køres kommandoer nu (DETTE ER EN FEJL)." + +#: src/file.c:1065 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Kommandoer for afhængigheder køres nu (DETTE ER EN FEJL)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Opdateret med godt resultat." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Behøver opdatering (-q er sat)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Opdatering mislykkedes." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Ugyldig værdi i \"command_state\"-felt!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Filer" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# Statistik for fil-hash-spande:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Feltet \"%s\" er ikke i cache: %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "ikke-numerisk første argument til \"word\"-funktionen" + +#: src/function.c:799 +#, c-format +msgid "first argument to 'word' function must be greater than 0" +msgstr "første argument til \"word\"-funktionen skal være større end 0" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "ikke-numerisk første argument til \"wordlist\"-funktionen" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "ikke-numerisk andet argument til \"wordlist\"-funktionen" + +#: src/function.c:1533 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) mislykkedes (e=%ld)\n" + +#: src/function.c:1557 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(Err) mislykkedes (e=%ld)\n" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() mislykkedes (e=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() mislykkedes\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Afrydder midlertidig batchfil %s\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "fil: mangler filnavn" + +#: src/function.c:2234 src/function.c:2265 +#, c-format +msgid "open: %s: %s" +msgstr "åbn: %s: %s" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "skriv: %s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "luk: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "fil: for mange argumenter" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "læs: %s: %s" + +#: src/function.c:2290 +#, c-format +msgid "file: invalid file operation: %s" +msgstr "fil: ugyldig filoperation: %s" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "utilstrækkeligt antal argumenter (%d) til funktionen \"%s\"" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "ikke implementeret på denne platform: funktionen \"%s\"" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "uafsluttet kald til funktionen \"%s\"; manglende \"%c\"" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Tomt funktionsnavn" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Ugyldigt funktionsnavn: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Funktionsnavn er for langt: %s" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "utilstrækkeligt antal argumenter (%u) til funktionen \"%s\"" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "Utilstrækkeligt antal argumenter (%u) til funktionen \"%s\"" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: tilvalget \"%s\" er flertydigt\n" + +#: src/getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: tilvalget \"--%s\" tillader ikke et argument\n" + +#: src/getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: tilvalget \"%c%s\" tillader ikke et argument\n" + +#: src/getopt.c:705 src/getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s tilvalget \"%s\" kræver et argument\n" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: ukendt tilvalg \"--%s\"\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: ukendt tilvalg \"%c%s\"\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ulovligt tilvalg -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ugyldigt tilvalg -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: tilvalget \"-W %s\" er flertydigt\n" + +#: src/getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: tilvalget \"-W %s\" tillader ikke et argument\n" + +# 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 "guile: Udskriver \"%s\"\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Evaluerer \"%s\"\n" + +#: 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" + +#: src/hash.c:280 +#, fuzzy, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Fyldning=%ld/%ld=%.0f%%, " + +#: src/hash.c:282 +#, fuzzy, c-format +msgid "Rehash=%u, " +msgstr "Omgrupperinger=%d, " + +#: src/hash.c:283 +#, fuzzy, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Sammenstød=%ld/%ld=%.0f%%" + +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Kigger efter en implicit regel for \"%s\".\n" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Undgår rekursion i implicitte regler.\n" + +#: 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" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Afviser umulig regelforudsætning \"%s\".\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Afviser umulig implicit forudsætning \"%s\".\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Prøver regelforudsætning \"%s\".\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Prøver implicit forudsætning \"%s\".\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Fandt forudsætning \"%s\" som VPATH \"%s\"\n" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Kan ikke oprette midlertidig fil\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (core-fil efterladt)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr "(ignoreret)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Fejl %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Venter på uafsluttede job...." + +#: src/job.c:704 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Levende underproces %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 " (eksternt)" + +#: 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" + +#: 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 "Rydder midlertidig batchfil %s\n" + +#: src/job.c:956 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Oprydning af midlertidig batchfil %s mislykkedes (%d)\n" + +#: 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" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Frigav symbol for underproces %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() fejlede ved igangsætning af proces (e=%ld)\n" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Talte %d argumenter i fejlet igangsætning\n" + +#: 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" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Fik symbol for underproces %p (%s).\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: målet \"%s\" findes ikke" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: opdatér målet \"%s\" på grund af: %s" + +#: src/job.c:2108 +#, c-format +msgid "cannot enforce load limits on this operating system" +msgstr "kan ikke gennemtvinge belastningsgrænser på dette styrestystem" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "kan ikke gennemtvinge belastningsgrænse: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Kunne ikke gendanne stdin\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Kunne ikke gendanne stdout\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Kunne ikke gendanne stdin\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: miljøplads er måske opbrugt" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL ændret (var \"%s\", nu \"%s\")\n" + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Opretter midlertidig batchfil %s\n" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Indhold af batchfil:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Indhold af batchfil:%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 (linje %d) Forkert skal-kontekst (!unixy && !batch_mode_shell)\n" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Kunne ikke åbne global symboltabel: %s" + +#: src/load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Det indlæste objekt %s er ikke erklæret som GPL-kompatibelt" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Kunne ikke indlæse symbolet %s fra %s: %s" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Tomt symbolnavn ved indlæsning: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Indlæser symbol %s fra %s\n" + +#: src/load.c:256 +#, c-format +msgid "The 'load' operation is not supported on this platform." +msgstr "Operationen indlæs ('load') understøttes ikke på denne platform." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Tilvalg:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoreret af hensyn til kompabilitet.\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Skab alle mål betingelsesløst.\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C KATALOG, --directory=KATALOG\n" +" Skift allerførst til KATALOG.\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Udskriv en masse fejlsøgningsinformation.\n" + +#: src/main.c:345 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAG] Udskriv forskellige slags " +"fejlsøgningsinformation.\n" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Miljøvariable har forrang for makefiler.\n" + +#: src/main.c:350 +#, fuzzy +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=STRENG Evaluér STRENG som en makefil-erklæring.\n" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FIL, --file=FIL, --makefile=FIL\n" +" Læs FIL som en makefil.\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Udskriv denne besked og afslut.\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignorér fejl fra kommandoer.\n" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I KATALOG, --include-dir=KATALOG\n" +" Søg i KATALOG efter inkluderede makefiler.\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] Tillad N samtidige job; uendelig mange job " +"uden argument.\n" + +#: 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" + +#: 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" +" Start ikke flere job medmindre belastningen er " +"under 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 Brug sidste mtime mellem symbolske lænker og " +"mål.\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" +" Udfør ikke nogen kommandoer; udskriv dem " +"bare.\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 FIL, --old-file=FIL, --assume-old=FIL\n" +" Anse FIL som værende meget gammel og genskab " +"den ikke.\n" + +#: 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" + +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Udfør ingen kommandoer; afslutningskoden " +"angiver\n" +" om målet er tidssvarende.\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Udskriv ikke kommandoer.\n" + +#: 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" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Slår -k fra.\n" + +#: 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" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr " --trace Udskriv trace-information.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Udskriv det aktuelle katalog.\n" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Slå -w fra, selv hvis det var slået til " +"automatisk.\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 FIL, --what-if=FIL, --new-file=FIL, --assume-new=FIL\n" +" Anse FIL som værende nyskabt.\n" + +#: 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" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "en tom streng er ugyldig som filnavn" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "ukendt specifikation af fejlsøgningsniveau \"%s\"" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "ukendt type \"%s\" af output-sync" + +#: 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" + +#: 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" +"Uhåndteret undtagelsesfilter kaldt fra program %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 "Adgangskrænkelse: skriveoperation på adresse 0x%p\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/main.c:1609 +#, c-format +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"advarsel: jobserver ikke tilgængelig: bruger -j1. Tilføj \"+\" til " +"ophavsmakeregel." + +#: 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." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefil fra standard-ind er angivet to gange." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (midlertidig fil)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (midlertidig fil)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Sætter tilbage til enkelt job-tilstand (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "Symbolske lænker understøttes ikke: Deaktiverer -L." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Opdaterer makefiler....\n" + +#: 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 køre i ring; genskaber den ikke.\n" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Genskabelse af makefilen \"%s\" mislykkedes." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Inkluderet makefil \"%s\" blev ikke fundet." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefilen \"%s\" blev ikke fundet" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Kunne ikke skifte tilbage til det originale katalog." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Udfører igen[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (midlertidig fil): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL indeholder mere end et mål" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Ingen mål" + +#: 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" + +# build? +#: src/main.c:2610 +#, c-format +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"advarsel: Der blev registreret en uoverensstemmelse i urets tid. Din " +"kompilering kan være ufuldstændig." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Brug: %s [tilvalg] [mål] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Dette program er bygget til %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Dette program er bygget til %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "Send fejlmeldinger (på engelsk) til .\n" + +#: 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" + +#: src/main.c:2965 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "\"-%c\"-tilvalget kræver et positivt heltalligt argument" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sBygget til %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sBygget til %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLicens GPLv3+: GNU GPL v3 eller nyere \n" +"%sDette er frit programmel: Du kan frit ændre og videredistribuere det.\n" +"%sDer gives INGEN GARANTI i den grad, som dette tillades af loven.\n" + +# %s giver dato og klokkeslæt +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Makedatabase, udskrevet %s" + +# %s giver dato og klokkeslæt +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Afsluttet makedatabase %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Indledende adgang" + +#: src/misc.c:743 +msgid "User access" +msgstr "Brugeradgang" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Make-adgang" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Barneadgang" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Går til et ukendt katalog\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Forlader et ukendt katalog\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Går til katalog \"%s\"\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Forlader katalog \"%s\"\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Går til et ukendt katalog\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Forlader et ukendt katalog\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Går til katalog \"%s\"\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Forlader katalog \"%s\"\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "skrivefejl: stdout" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Stop.\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" + +# 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 "opretter job-pipe" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "kopierer job-pipe" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "klargøring af jobserver-pipe" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "intern fejl: ugyldig \"--jobserver-auth\"-streng \"%s\"" + +# fd = fildeskriptor +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Jobserverklient (fd'er %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "jobserver-pipe" + +# ? +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "skriv jobserver" + +#: src/posixos.c:300 +#, c-format +msgid "job server shut down" +msgstr "" + +#: src/posixos.c:303 +msgid "pselect jobs pipe" +msgstr "pselect job-pipe" + +# ? +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "læs job-pipe" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Læser makefiler...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Læser makefilen \"%s\"" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (ingen standard-endemål)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (søgesti)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (ikke nødvendig)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ingen ~-udfoldning)" + +#: src/read.c:655 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "Springer UTF-8-BOM over i makefilen \"%s\"\n" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Springer UTF-8-BOM over i makefilbuffer\n" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "ugyldig syntaks i betingelse" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: kunne ikke indlæse" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "kommandoer begynder før første mål" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "manglende regel før kommandoer" + +#: src/read.c:1136 +#, c-format +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr "manglende skilletegn (mente du TAB i stedet for 8 mellemrum?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "manglende skilletegn" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "manglende målmønster" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "flere målmønstre" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "målmønster indeholder ingen \"%%\"" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "mangler \"endif\"" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "tomt variabelnavn" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "overskydende tekst efter \"define\"-direktiv" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "manglende \"endef\", uafsluttet \"define\"" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "overskydende tekst efter \"endef\"-direktiv" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "overskydende tekst efter \"%s\"-direktiv" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "overskydende \"%s\"" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "kun én \"else\" per betingelse" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Misdannet målspecifik variabeldefinition" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "der kan ikke defineres forudsætninger i kommandoer" + +#: 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" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "blandede implicitte og normale regler" + +#: src/read.c:2107 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "målet \"%s\" passer ikke til målmønstret" + +#: 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 :- og ::-angivelser" + +#: src/read.c:2128 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "målet \"%s\" optræder mere end én gang i samme regel" + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "advarsel: tilsidesætter opskrift for målet \"%s\"" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "advarsel: ignorerer gammel opskrift for målet \"%s\"" + +#: src/read.c:2254 +#, c-format +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "*** blandede implicitte og normale regler: forældet syntaks" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Ingenting at gøre for \"%s\"." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "\"%s\" er tidssvarende." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Beskærer fil \"%s\".\n" + +#: src/remake.c:389 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sIngen regel til at skabe målet \"%s\" som behøves af \"%s\"%s" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sIngen regel til at skabe målet \"%s\"%s" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Overvejer målfilen \"%s\".\n" + +#: 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" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Filen \"%s\" er allerede overvejet.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Opdaterer stadig fil \"%s\".\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Opdatering af fil \"%s\" afsluttet.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Filen \"%s\" findes ikke.\n" + +#: 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 " +"opløsning" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Bruger standardopskrift for \"%s\".\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Cirkulær %s <- %s afhængighed opgivet." + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Afsluttede forudsætningerne for målfilen \"%s\".\n" + +#: 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" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Opgiver målfil \"%s\".\n" + +#: src/remake.c:699 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Målet \"%s\" ikke genskabt på grund af fejl." + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:789 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "Ingen opskrift til \"%s\", og ingen forudsætninger har ændret sig.\n" + +#: src/remake.c:794 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Skaber \"%s\" pga. \"always-make\"-flag.\n" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Ingen grund til at genskabe målet \"%s\"" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; bruger VPATH-navnet \"%s\"" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Skal genskabe målet \"%s\".\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ignorerer VPATH-navnet \"%s\".\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Opskriften for \"%s\" er ved at blive kørt.\n" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Genskabelse af målfilen \"%s\" mislykkedes.\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Målfilen \"%s\" genskabt.\n" + +#: src/remake.c:852 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Det er nødvendigt at genskabe målfilen \"%s\" med -q.\n" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Bruger standardkommandoer for \"%s\".\n" + +#: src/remake.c:1422 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Advarsel: Filen \"%s\" har modifikationstidspunkt %s s i fremtiden" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +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... +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs kan ikke eksporteres: %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" +"# Implicitte regler" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Ingen implicitte regler." + +#: src/rule.c:548 +#, fuzzy, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u implicitte regler, %u" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FEJL: forkert num_pattern_rules! %u != %u" + +#: 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. +#: src/signame.c:92 +msgid "Hangup" +msgstr "Læg på" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Afbrudt" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Afslut" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Ulovlig instruktion" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Sporings-/stoppunkts-fælde" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Afbrudt" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "IOT_fælde" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "Emulatorfælde" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Undtagelsestilfælde ved flydendetals-operation" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Dræbt" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Busfejl" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Lagersegmentfejl" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Ugyldigt systemkald" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Pipe blev brudt" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Alarmen gik" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Termineret" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Brugerdefineret signal 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Brugerdefineret signal 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Barnet afsluttet" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Strømmen gik" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Stoppet" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Stoppet (ville læse fra tty)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Stoppet (ville skrive til tty)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Stoppet (signal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Begrænsning af CPU-tid overskredet" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Grænse for filstørrelse overskredet" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtuel tidsgrænse overskredet" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Profileringstiden udløb" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Vinduet blev ændret" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Fortsættes" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Kritisk I/O-tilstand" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "I/O mulig" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Resurse tabt" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Faresignal" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Informationsforespørgsel" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Flydendetalshjælpeprocessor ikke tilgængelig" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Ingen strcache-buffere\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-buffere: %lu (%lu) / strenge = %lu / lager = %lu B / middel = " +"%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 nuværende buf: størrelse = %hu B / brugt = %hu B / antal = %hu / middel = " +"%hu B\n" + +# 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 øvrigt brugt: i alt = %lu B / antal = %lu / middel = %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 øvrigt frit: i alt = %lu B / maks = %lu B / min = %lu B / middel = %hu B\n" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s strcache-ydelse: opslag = %lu / træffere = %lu%%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# statistik for hashtabel:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automatisk" + +#: src/variable.c:1656 +msgid "default" +msgstr "forvalgt" + +#: src/variable.c:1659 +msgid "environment" +msgstr "miljø" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "makefil" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "miljø med -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "kommandolinje" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "\"override\"-direktiv" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (fra \"%s\", linje %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# Statistik for variabelsæt-hash-spande:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabler\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Mønsterspecifikke variabelværdier" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Ingen mønsterspecifikke variabelværdier." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u mønsterspecifikke variabelværdier" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "advarsel: udefineret variabel \"%.*s\"" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() mislykkedes med %d\n" + +#: 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" + +#: 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 "Tilføj uddata til slutningen af %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Tilføj %.*s og ryd op\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Udfører i stedet %s\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-søgestier\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Ingen \"vpath\"-søgestier." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u \"vpath\"-søgestier.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Ingen generel (\"VPATH\"-variabel) søgesti." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Generel (\"VPATH\"-variabel) søgesti:\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Jobserverpladser begrænset til %d\n" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "opretter jobserver-semafor: (Fejl %ld: %s)" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "intern fejl: kan ikke åbne jobserver-semafor \"%s\": (Fejl %ld: %s)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Jobserverklient (semafor %s)\n" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "frigiv jobserver-semafor: (Fejl %ld: %s)" + +#: src/w32/w32os.c:194 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +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!" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Fejl 0x%x (ignoreret)" + +#~ msgid "*** [%s] Error 0x%x" +#~ msgstr "*** [%s] Fejl 0x%x" + +#~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +#~ msgstr "Kører kommandoer fra %s:%lu for at opdatere målet '%s'.\n" + +#~ msgid "Invoking builtin recipe to update target `%s'.\n" +#~ msgstr "Kører indbyggede kommandoer for at opdatere målet '%s'.\n" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "intern fejl: flere '--jobserver-fds'-tilvalg" + +#~ msgid "dup jobserver" +#~ msgstr "dup jobserver" + +#~ msgid "virtual memory exhausted" +#~ msgstr "virtuel hukommelse opbrugt" + +#~ msgid "write error" +#~ msgstr "skrivefejl" + +#~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +#~ msgstr "%s # strcache-buffere: %d (* %d B/buffer = %d B)\n" + +#~ msgid "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# statistik for strcache-hashtabeller:\n" +#~ "# " + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Advarsel: Tom omdirigering\n" + +#~ msgid "internal error: `%s' command_state" +#~ msgstr "intern fejl: '%s' command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "BUILTIN [%s][%s]\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BUILTIN RM %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Ukendt indbygget kommando '%s'\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Fejl, tom kommando\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Omdirigeret inddata from %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Omdirigeret fejl to %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Omdirigeret uddata til %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Fejl ved spawn, %d\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Syntaksfejl, stadig inden i '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Fik et SIGCHLD; %u uhøstede børn.\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-advarsel, CTRL-Y vil efterlade underproces(ser).\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Angiv ikke -j eller --jobs hvis sh.exe ikke er tilgængelig." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Sætter make tilbage til enkelt job-tilstand." + +#~ 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 "" +#~ "%sDette er frit programmel; se kildeteksten for kopieringsbetingelser.\n" +#~ "%sDer er INGEN garanti; end ikke for SALGBARHED eller EGNETHED TIL NOGET\n" +#~ "%sBESTEMT FORMÅL.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "fremmed 'endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "tomt 'override'-direktiv" + +#~ msgid "invalid `override' directive" +#~ msgstr "ugyldigt 'override'-direktiv" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "intet filnavn for '%sinclude'" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "mål '%s' efterlader forudsætningsmønstret tomt" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Ingen filer." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u filer i %u hash-spande .\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# %.3f filer per spand i gennemsnit, maks. %u filer i en spand.\n" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Stands proces for at tillade et fejlsøgningsprogram at hænge sig på" + +#~ msgid "# No variables." +#~ msgstr "# Ingen variabler." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# %.1f variabler per spand i gennemsnit, maks. %u i en spand.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# %d.%d variabler per spand i gennemsnit, maks. %u i en spand.\n" diff --git a/third_party/make/po/de.gmo b/third_party/make/po/de.gmo new file mode 100644 index 0000000000000000000000000000000000000000..4d9301bd519c5cd73d71486b9592273152812d3f GIT binary patch literal 45198 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 literal 0 HcmV?d00001 diff --git a/third_party/make/po/de.po b/third_party/make/po/de.po new file mode 100644 index 00000000000..8359f3b6fe3 --- /dev/null +++ b/third_party/make/po/de.po @@ -0,0 +1,2547 @@ +# German message translation file for GNU make +# Copyright © 1996, 1997, 2002, 2013, 2016 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Philipp Thomas 2013, 2016 +# Karl Eichwalder , 2002, 2005. +# Alexander Mader , 2000. +# Alexander Mader , 1997. +# Jochen Hein , 1996. +# +# Vereinheitlichen: +# ================= +# command(s) -> Befehl(e)? (nicht: Kommando(s)) +# target(s) -> Ziel(e) (nicht: Target(s)) +# +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-06-20 15:03+0200\n" +"Last-Translator: Philipp Thomas \n" +"Language-Team: German \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" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "Versuch, eine nicht unterstützte Funktionalität zu verwenden: „%s“" + +#: 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" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Archiv „%s“ existiert nicht" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: „%s“ ist kein gültiges Archiv" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Eintrag „%s“ existiert nicht in „%s“" + +#: 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“" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "„lbr$ini_control()“ scheiterte mit Status = %d" + +#: 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" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (der Name ist möglicherweise abgeschnitten)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: 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" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Die Regel hat zu viele Zeilen (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Abbruch.\n" + +#: 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" + +#: 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" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Datei „%s“ wird gelöscht" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Datei „%s“ wird gelöscht" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# Auszuführende Regel" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (eingebaut):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (aus „%s“, Zeile %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Verzeichnisse\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: Status konnte nicht festgestellt werden.\n" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "" +"# %s ( Schlüssel %s, letzte Änderung %I64u): Öffnen scheiterte.\n" +"Konnte nicht geöffnet werden.\n" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (Schlüssel %s, letzte Änderung %%I64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (Gerät %d, Inode [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (Gerät %ld, Inode %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Keine" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " Dateien, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "keine" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " Unmöglichkeiten" + +#: src/dir.c:1154 +msgid " so far." +msgstr " bisher." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " Unmöglichkeiten in %lu Verzeichnissen.\n" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekursive Variable „%s“ referenziert sich (schließlich) selbst" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "Nicht abgeschlossene Variablenreferenz" + +#: 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," + +#: 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," + +#: 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." + +#: 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." + +#: 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" + +#: 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" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Löschen der übergangsweise angelegten Datei „%s“" + +#: src/file.c:412 +#, fuzzy, c-format +msgid "Removing intermediate files...\n" +msgstr "Die übergangsweise angelegte Datei „%s“ wird gelöscht...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Aktuelle Zeit" + +#: 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" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Dies ist kein Ziel:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Wertvolle Datei (benötigt von .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Vorgetäuschtes Ziel (benötigt von .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Kommandozeilen-Ziel (target)." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Eine standardmässige, MAKEFILES oder -include/sinclude Makedatei." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Eingebaute Regel" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Die Suche nach impliziten Regeln wurde durchgeführt." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Die Suche nach impliziten Regeln wurde nicht durchgeführt." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Wurzel impliziter/statischer Muster: „%s“\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Datei ist ein Zwischenschritt in den Abhängigkeiten." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Erzeugt außerdem:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Zeit der letzten Änderung wurde nicht überprüft." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Die Datei existiert nicht." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Datei ist sehr alt." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Zuletzt geändert %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Datei wurde aktualisiert." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Datei wurde nicht aktualisiert." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Derzeit laufende Regel (DAS IST EIN FEHLER)." + +#: 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)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Erfolgreich aktualisiert." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Eine Aktualisierung ist notwendig (-q ist angegeben)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Aktualisierung ist fehlgeschlagen." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Ungültiger Wert im „command_state“-Strukturelement!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Dateien" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# Statistik der Hash-Tabelle für Dateien:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Feld „%s“ wird nicht zwischengespeichert: %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "Nicht-numerisches erstes Argument für die „word“-Funktion" + +#: 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" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "Nicht-numerisches erstes Argument für die „wordlist“-Funktion" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "Nicht-numerisches zweites Argument zur „wordlist“-Funktion" + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "„CreatePipe()“ schlug fehl (e=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() schlug fehl\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Die temporäre Stapelverarbeitungsdatei %s wird gelöscht\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "Datei: fehlender Dateiname" + +#: src/function.c:2234 src/function.c:2265 +#, c-format +msgid "open: %s: %s" +msgstr "Öffnen: %s: %s" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "Schreiben: %s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "schließend: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "Datei: zu viele Argumente" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "Lesen: %s: %s" + +#: src/function.c:2290 +#, c-format +msgid "file: invalid file operation: %s" +msgstr "Unzulässige Dateioperation: %s" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "Zuwenig Argumente (%d) für die Funktion „%s“" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "Auf dieser Rechnerkonfiguration nicht implementiert: Funktion „%s“" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "Nicht beendeter Aufruf der Funktion „%s“: „%c“ fehlt" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Leerer Funktionsname" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Unzulässiger Funktionsname: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Der Funktionsname ist zu lang: %s" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "Ungültige minimale Anzahl von Argumenten (%u) für die Funktion „%s“" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "Ungülte maximale Anzahl an Argumenten (%u) für die Funktion „%s“" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: Option „%s“ ist mehrdeutig\n" + +#: src/getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: Option „--%s“ erlaubt kein Argument\n" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: unbekannte Option „--%s“\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: unbekannte Option „%c%s“\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: unzulässige Option -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ungültige Option -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: Option „-W %s“ ist mehrdeutig\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Verarbeite „%s“\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: begutachte „%s“\n" + +#: 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" + +#: src/hash.c:280 +#, fuzzy, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Auslastung=%ld/%ld=%.0f%%, " + +#: src/hash.c:282 +#, fuzzy, c-format +msgid "Rehash=%u, " +msgstr "Rehash=%d, " + +#: src/hash.c:283 +#, fuzzy, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Kollisionen=%ld/%ld%.0f%%" + +#: 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" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Rekursion in den impliziten Regeln wird vermieden.\n" + +#: src/implicit.c:484 +#, fuzzy, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Wurzel zu lang: „%.*s“.\n" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Muster-Regel mit Wurzel „%.*s“ wird probiert.\n" + +#: 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" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Unmögliche implizite Voraussetzung „%s“ wird abgelehnt.\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Regel-Voraussetzung „%s“ wird auprobiert.\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Implizite Voraussetzung „%s“ wird ausprobiert.\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Die Voraussetzung „%s“ wurde als VPATH „%s“ gefunden\n" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Eine temporäre Datei kann nicht erzeugt werden\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (Speicherauszug erstellt)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (ignoriert)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Fehler %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Es wird auf noch nicht beendete Prozesse gewartet...." + +#: src/job.c:704 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Aktiver Kindprozess %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 " (entfernt)" + +#: src/job.c:898 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Sammle erfolgreichen Kindprozess %p PID %s %s\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Token des Kindprozesses %p PID (%s) freigegeben.\n" + +#: 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" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"%d Argumente gehörten zum fehlgeschlagenen Prozessstart\n" + +#: 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" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Token für den Kindprozess %p (%s) erhalten.\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: Archiv „%s“ existiert nicht" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: Ziel „%s“ wird aktualisiert wegen: %s" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "Lasteinschränkung kann nicht erzwungen werden: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Die Standardeingabe konnte nicht wieder hergestellt werden\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Die Standardausgabe konnte nicht wieder hergestellt werden\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Standardfehler konnte nicht wieder hergestellt werden\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: der Platz in der Programmumgebung könnte erschöpft sein" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL gewechselt (war „%s“, ist jetzt „%s“)\n" + +#: 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" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Inhalt der Stapelverarbeitungsdatei:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Inhalt der Stapelverarbeitungsdatei:%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 (Zeile %d) Falscher Shell-Kontext (!unixy && !batch_mode_shell)\n" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Die globale Symboltabelle konnte nicht geöffnet werden: %s" + +#: 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" + +#: 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" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Zu ladedender Symbolname ist leer: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Symbol %s wird aus %s geladen\n" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Optionen:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m Wird aus Kompatibilitätsgründen ignoriert\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Alle Ziele ohne Bedingungen erstellen\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C VERZEICHNIS, --directory=VERZEICHNIS\n" +" In VERZEICHNIS wechseln, bevor etwas getan " +"wird\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Viele Informationen zur Fehlersuche ausgeben.\n" + +#: src/main.c:345 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=KENNUNGEN] Verschiedene Arten von Debug-Information " +"ausgeben\n" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Umgebungsvariablen überschreiben „make“-" +"Steuerdateien\n" + +#: src/main.c:350 +#, fuzzy +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=ZEIENKETTE ZEICHENKETTE wie einen Makedatei-Eintrag " +"auswerten.\n" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f DATEI, --file=DATEI, --makefile=DATEI\n" +" DATEI als Makefile lesen\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Diese Meldung ausgeben und beenden\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Fehler in Regeln werden irgnoriert\n" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I VERZEICHNIS, --include-dir=VERZEICHNIS\n" +" VERZEICHNIS nach eingebundenen\n" +" Makedateien durchsuchen\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 Jobs gleichzeitig erlauben; unbegrenzte " +"Anzahl \n" +" von Jobs ohne Argument\n" + +#: 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" + +#: 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" +" Keine Jobs starten bevor die Auslastung nicht " +"unter N ist.\n" + +#: src/main.c:369 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Den neueste Modifizierungszeit zwischen\n" +" symbolischer Verküpfung und dem Ziel " +"verwenden.\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" +" Keine Regel ausführen, nur ausgeben.\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 DATEI, --old-file=DATEI, --assume-old=DATEI\n" +" DATEI als sehr alt ansehen und nicht neu " +"erzeugen.\n" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" +" -O[TYP], --output-sync[=TYP]\n" +" Synchronisiert die Ausgabe paralleler Jobs per " +"TYP.\n" + +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Keine Regel ausführen; der Exit-Status gibt " +"an, ob die Dateien\n" +" aktuell sind\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Regeln nicht ausgeben.\n" + +#: 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" +msgstr "" +" -S, --no-keep-going, --stop\n" +" -k abschalten.\n" + +#: 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" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr "" +" --trace Viele Informationen zur Fehlersuche ausgeben\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Das aktuelle Verzeichnis ausgeben\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 abschalten, selbst wenn es implizit " +"eingeschaltet wurde.\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 DATEI, --what-if=DATEI, --new-file=DATEI, --assume-new=DATEI\n" +" DATEI als unendlich neu erachten.\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Eine Warnung ausgeben, wenn eine undefinierte\n" +" Variable referenziert wird.\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "Eine leere Zeichenkette ist als Dateiname ungültig" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "Unbekannte Debug-Level angegeben „%s“" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "unbekannter Typ von Ausgabesynchronisierung „%s“" + +#: 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" + +#: 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" +"Das Programm %s rief einen Ausnahmefilter auf, \n" +"der nicht bearbeitet wurde\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 "Zugriffsverletzung: Schreiboperation an Adresse 0x%p\n" + +#: src/main.c:865 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Zugriffsverletzung: Leseoperation an Adresse 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 setzt 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 Suche im Pfad setzte default_shell = %s\n" + +#: src/main.c:1609 +#, c-format +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"Warnung: Kein Jobserver verfügbar: -j1 wird gesetzt. Fügen Sie der " +"Ursprungsregel\n" +"„+“ hinzu." + +#: 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." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Das Makefile wurde zweimal über die Standardeingabe angegeben." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (temporäre Datei)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (temporäre Datei)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Umstellung auf Einzel-Job-Verarbeitung (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "" +"Symbolische Verknfungen werdfen nicht unterstützt: -L wird abgeschaltet." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Aktualisiere „make“-Steuerdateien...\n" + +#: 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" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Konnte die „make“-Steuerdatei „%s“ nicht neu erstellen." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Die eingebundene „make“-Steuerdatei „%s“ wurde nicht gefunden." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Die „make“-Steuerdatei „%s“ wurde nicht gefunden" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Konnte nicht in das ursprüngliche Verzeichnis wechseln." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Erneute Ausführung[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (temporäre Datei): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL beinhaltet mehr als ein Ziel" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Keine Ziele" + +#: 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" + +#: 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." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Aufruf: %s [Optionen] [Ziele] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Diese Programm wurde für %s gebaut\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Diese Programm wurde für %s (%s) gebaut\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "Fehlermeldungen (auf Englisch) an senden.\n" + +#: 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" + +#: 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" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sGebaut für %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sGebaut für %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLizenz GPLv3+: GNU GPL Version 3 oder später \n" +"%sDies ist freie Software: Sie können sie nach Belieben ändern und weiter " +"verteilen.\n" +"%sSoweit es die Gesetze erlauben gibt es KEINE GARANTIE.\n" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# „Make“-Datenbank; erstellt am: %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# „Make“-Datenbank beendet am: %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Initialisierter Zugriff" + +#: src/misc.c:743 +msgid "User access" +msgstr "Zugriff durch Benutzer" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Zugriff durch „make“" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Kindprozess" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: ein unbekanntes Verzeichnis wird betreten\n" + +#: 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!!! +#: 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!!! +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Verzeichnis „%s“ wird verlassen\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Ein unbekanntes Verzeichnis wird betreten\n" + +#: 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!!! +#: 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!!! +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Verzeichnis „%s“ wird verlassen\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "Schreibfehler: Standardausgabe" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Schluss.\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[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" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "Öffnen der Pipe für die Jobs" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "Initialisierung der Pipe für den Jobserver" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "Interner Fehler: ungültige --jobserver-auth Angabe „%s“" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Jobserver-Klient (fds %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "Initialisierung der Pipe für den Jobserver" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "Job-Server wird geschrieben" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "Lese Pipe für die Jobs" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "„make“-Steuerdateien werden gelesen...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "„make“-Steuerdatei „%s“ wird gelesen" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (kein Standard-Ziel)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (Suchpfad)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (macht nichts)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (keine ~-Auflösung)" + +#: 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" + +#: 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" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "Ungültige Syntax in der Bedingung" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: konnte nicht geladen werden" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "Rezept beginnt vor dem ersten Ziel" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "Es fehlt eine Regel vor der Regel" + +#: 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?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "Fehlender Trenner" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "Es fehlt ein Ziel-Muster" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "Mehrfache Ziel-Muster" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "Ziel-Muster enthält kein „%%“" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "Fehlendes „endif“" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "Leerer Variablenname" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "Überflüssiger Text nach einer „define“-Anweisung" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "Fehlendes „endef“, nicht abgeschlossenes „define“" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "Überflüssiger Text nach einer „endef“-Anweisung" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "Überflüssiger Text nach einer „%s“-Anweisung" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "Überflüssiges „%s“" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "Es ist nur ein „else“ pro Bedingung erlaubt" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Falsche Ziel-bezogene Variablendefinition" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "Voraussetzungen können nicht in Regeln definiert werden" + +#: 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" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "Implizite und normale Regeln wurden vermischt" + +#: src/read.c:2107 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "Target „%s“ passt nicht zum Ziel-Muster" + +#: 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" + +#: 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." + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "Warnung: Die Befehle für das Ziel „%s“ werden überschrieben" + +#: 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" + +#: src/read.c:2254 +#, c-format +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "*** Implizite und normale Regeln wurden vermischt" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Für das Ziel „%s“ ist nichts zu tun." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "„%s“ ist bereits aktuell." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Die Datei „%s“ wird \"gestutzt\" (der Abhängigkeitsgraph).\n" + +#: 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" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sKeine Regel, um „%s“ zu erstellen%s" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Betrachte Ziel-Datei „%s“.\n" + +#: 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" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Die Datei „%s“ wurde bereits betrachtet.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Die Datei „%s“ wird immer noch aktualisiert.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Aktualisierung der Datei „%s“ beendet.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Die Datei „%s“ existiert nicht.\n" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Warnung: mit .LOW_RESOLUTION_TIME gekennzeichnete Datei „%s“ hat einen\n" +" hochaufgelösten Zeitstempel" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Die Standard-Regel für „%s“ wird verwendet.\n" + +#: 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." + +#: 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" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Die Voraussetzungen von „%s“ werden fertiggestellt.\n" + +#: 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" + +#: src/remake.c:699 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Das Ziel „%s“ wurde wegen Fehlern nicht aktualisiert." + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Es ist nicht notwendig, das Ziel „%s“ neu zu erzeugen" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; benutze VPATH-Name „%s“" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Das Target „%s“ muss neu erzeugt werden.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Der VPATH-Name „%s“ wird ignoriert.\n" + +#: 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" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Fehler beim Aktualisieren der Ziel-Datei „%s“.\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Die Zieldatei „%s“ wurde erfolgreich aktualisiert.\n" + +#: 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" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Die Standard-Kommandos für „%s“ werden verwendet.\n" + +#: 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" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS Element „%s“ ist kein Muster" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs wird nicht exportieren: %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" +"# Implizite Regeln" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Keine impliziten Regeln vorhanden." + +#: src/rule.c:548 +#, fuzzy, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u implizite Regeln, %u" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: „num_pattern_rules“ falsch! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "Unbekanntes Signal" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Aufgelegt" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Abgebrochen (Interrupt)" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Quit" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Illegaler Befehl" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Verfolgen/anhalten abfangen (Trace/breakpoint trap)" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Abgebrochen (Aborted)" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "IOT abfangen (IOT trap)" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "EMT abfangen (EMT trap)" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Gleitkommafehler" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Abgebrochen (Killed)" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Bus-Fehler" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Adressierungsdefekt" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Falscher Systemaufruf" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Zerstörte Pipe" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Wecksignal" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Abgebrochen (Terminated)" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Nutzersignal 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Nutzersignal 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Kindprozess beendet" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Stromausfall" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Angehalten" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Angehalten (tty input)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Angehalten (tty output)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Angehalten (signal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU-Zeitschranke überschritten" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Dateigrößenschranke überschritten" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtueller Timer erloschen" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Profiling Timer erloschen" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Fenster hat sich verändert" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Fortgesetzt" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Dringende I/O-Bedingung" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "I/O möglich" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Ressource verloren gegangen" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Gefahrensignal" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Informationsanforderung" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Es ist kein Koprozessor für Fließkommaoperationen vorhanden" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Keine Puffer für 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 Puffer für strcache: %lu (%lu) / Zeichenketten = %lu / Speicher = %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 aktueller Puffer: Größe = %hu B / benutzt = %hu B / Anzahl = %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 andere verwendete: Summe = %lu B / Anzahl = %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 andere freie: Summe = %lu B / Max = %lu B / Min = %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 Leistung von strcache: Suchen = %lu / Trefferrate = %lu%%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# Statistik für Hashtabelle:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automatisch" + +#: src/variable.c:1656 +msgid "default" +msgstr "Standard" + +#: src/variable.c:1659 +msgid "environment" +msgstr "Umgebung" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "Makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "Umgebung per -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "Kommandozeile" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "„override“-Anweisung" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (aus „%s“, Zeile %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "" +"# Hashtabellen-Statistik für Variablen:\n" +"\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variablen\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Musterspezifische Variablenwerte" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Keine musterspezifischen Variablenwerte." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u musterspezifische Variablenwerte" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "Warnung: undefinierte Variable „%.*s“" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "„sys$search“ schlug mit %d fehl\n" + +#: 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" + +#: 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 "Ausgabe nach %s umgeleitet\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "%.*s anhängen und aufräumen\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s wird stattdessen ausgeführt\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-Suchpfade\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Keine „vpath“-Suchpfade." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u „vpath“-Suchpfade.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Kein allgemeiner Suchpfad (Variable „VPATH“)." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Allgemeiner Suchpfad (Variable „VPATH“):\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Zeitschlitze der Jobservers auf %d begranzt\n" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "Jobserver-Semaphore wird erzeugt: (Fehler %ld: %s)" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" +"interner Fehler: die Semaphore „%s“ des Jobservers kann nicht geöffnet " +"werden:\n" +" (Fehler %ld: %s)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Jobserver-Klient (Semaphore %s)\n" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "Freigabe der Jobserver-Semaphore: (Fehler %ld: %s)" + +#: 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" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] Fehler 0x%x%s" + +#~ msgid "%s[%s] %s%s%s" +#~ msgstr "%s[%s] %s%s%s" + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "Interner Fehler: mehrfache --sync-mutex Optionen" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "Interner Fehler: mehrfache --jobserver-fds Optionen" + +#~ msgid "dup jobserver" +#~ msgstr "Jobserver verdoppelt" + +#~ msgid "virtual memory exhausted" +#~ msgstr "Der virtuelle Speicher ist verbraucht" + +#~ msgid "write error" +#~ msgstr "Schreibfehler" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Warnung: Umleitung ins Leere!\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "Interner Fehler: „%s“ command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "BUILTIN [%s][%s]\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BUILTIN RM %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Unbekanntes eingebautes Kommando „%s“\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Fehler: Leere Anweisung\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Datei %s auf Standardeingabe umgeleitet\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Fehlerausgabe nach %s umgeleitet\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Ausgabe nach %s umgeleitet\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Fehler %d beim Starten eines Kindprozesses\n" + +#~ msgid "# Invalid value in `update_status' member!" +#~ msgstr "# Ungültiger Wert in „update_status“-Eintrag!" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Fehler 0x%x (ignoriert)" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "" +#~ "Wenn „sh.exe“ nicht vorhanden ist, \n" +#~ "sollten Sie nicht „-j“ oder „--jobs“ angeben." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "„make“ wird so umgestellt, dass nur ein Job laufen kann." + +#, fuzzy +#~ 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 "" +#~ ", von Richard Stallman und Roland McGrath.\n" +#~ "%sErstellt für %s\n" +#~ "%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n" +#~ "%s\tFree Software Foundation, Inc.\n" +#~ "%sDies ist Freie Software; siehe die Programmquellen für " +#~ "Vervielfältigungsbedingungen.\n" +#~ "%sEs gibt KEINE Gewährleistung; nicht einmal für VERMARKTUNG oder " +#~ "NUTZBARKEIT FÜR EINEN\n" +#~ "%sBESONDEREN ZWECK.\n" +#~ "\n" +#~ "%sFehlermeldungen (auf Englisch) an .\n" +#~ "\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "Überflüssiges „endef“" + +#~ msgid "empty `override' directive" +#~ msgstr "Leere „override“-Anweisung" + +#~ msgid "invalid `override' directive" +#~ msgstr "Ungültige „override“-Anweisung" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-Warnung: STRG-Y wird Unterprozesse übriglassen!\n" + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u Dateien zu %u hash-Werten.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# durchschnittlich %.3f Dateien je hash-Wert,\n" +#~ "max. %u Dateien zu einem hash-Wert.\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Syntaxfehler, immer noch in '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Erhielt Signal „SIGCHLD“; %u unbeendete Kindprozesse.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "VERZEICHNIS" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "In das VERZEICHNIS wechseln, bevor etwas anderes ausgeführt wird" + +#~ msgid "FLAGS" +#~ msgstr "FLAGS" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Prozess aussetzeb, um das Einklinken eines Debuggers zu ermöglichen" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "Umgebungsvariablen überschreiben „make“-Steuerdateien" + +#~ msgid "FILE" +#~ msgstr "DATEI" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "DATEI als „make“-Steuerdatei lesen" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Das VERZEICHNIS nach eingebundenen „make“-Steuerdateien durchsuchen" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Nur bei Belastung unterhalb N mehrere Prozesse starten" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "Befehle nur anzeigen, nicht ausführen" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "DATEI als sehr alt betrachten und sie nicht neu erzeugen" + +#~ msgid "Don't echo commands" +#~ msgstr "Die Kommandos nicht ausgeben" + +#~ msgid "Turns off -k" +#~ msgstr "-k abschalten" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Die DATEI stets als neu betrachten" + +# !!! Attention: concatenated with the following messages!!! +#~ msgid "Entering" +#~ msgstr "Wechsel in das Verzeichnis" + +# !!! Attention: concatenated with the following messages!!! +#~ msgid "Leaving" +#~ msgstr "Verlassen des Verzeichnisses" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "Kein Dateiname für „%sinclude“" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "Target „%s“ lässt Voraussetzungs-Muster leer" + +#~ msgid "# No variables." +#~ msgstr "# Keine Variablen vorhanden." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# Durchschnittlich %.1f Variablen pro Wert, max %u je Wert.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# Durchschnittlich %d.%d Variablen pro Wert, max %u je Wert.\n" + +#~ msgid "the `word' function takes a positive index argument" +#~ msgstr "Die „word“-Funktion erwartet als Argument einen positiven Index" diff --git a/third_party/make/po/en@boldquot.header b/third_party/make/po/en@boldquot.header new file mode 100644 index 00000000000..fedb6a06d12 --- /dev/null +++ b/third_party/make/po/en@boldquot.header @@ -0,0 +1,25 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# +# This catalog furthermore displays the text between the quotation marks in +# bold face, assuming the VT100/XTerm escape sequences. +# diff --git a/third_party/make/po/en@quot.header b/third_party/make/po/en@quot.header new file mode 100644 index 00000000000..a9647fc35c3 --- /dev/null +++ b/third_party/make/po/en@quot.header @@ -0,0 +1,22 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# diff --git a/third_party/make/po/es.gmo b/third_party/make/po/es.gmo new file mode 100644 index 0000000000000000000000000000000000000000..9effe87e90a9a0a708005d239cc47192be3f2c29 GIT binary patch literal 45980 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 D7rTe5 literal 0 HcmV?d00001 diff --git a/third_party/make/po/es.po b/third_party/make/po/es.po new file mode 100644 index 00000000000..359648bea34 --- /dev/null +++ b/third_party/make/po/es.po @@ -0,0 +1,2884 @@ +# Mensajes en español para GNU make. +# 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 , 1996, 2011. +# Antonio Ceballos , 2013, 2014, 2016, 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-03 15:38+0100\n" +"Last-Translator: Antonio Ceballos \n" +"Language-Team: Spanish \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" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "Se intentó utilizar una característica no implementada: '%s'" + +# Sugerencia: touch -> `touch'. sv +# Ok, aceptada. A falta de cursivas... mm +# No veo porqué no se ha de usar 'tocar' en vez de touch em+ +# El mensaje además hace referencia a un touch de un objeto dentro +# de una librería, y de eso no se dice nada en el mensaje. Creo que +# hay que tener cuidado con estas cosas. +# El programa para tocar un miembro de un archivo ... , y ahi estamos +# ya en problemas con el dichoso archivo/fichero. +# A ver que se os ocurre em+ +# 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. +#: 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" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: El archivo '%s' no existe" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: '%s' no es un archivo válido" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: El miembro '%s' no existe en '%s'" + +#: 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'" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "fallo en lbr$ini_control() con estado = %d" + +#: 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" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (el nombre puede estar truncado)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Fecha %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 "Las instrucciones tienen demasiadas líneas (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Interrumpir.\n" + +#: 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" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "" +"*** El miembro del archivo '%s' podría estar incorrecto; aunque no se elimina" + +# Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv +# Ok. mm +#: 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 +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Se borra el archivo '%s'" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# las instrucciones para ejecutar" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (integrado):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (de '%s', linea %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directorios\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +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 +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\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 +#: src/dir.c:1094 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" +"# %s (dispositivo %d, nodo-i [%d,%d,%d]): posiblemente no se pueda abrir.\n" + +# ¿No sobraría el "posiblemente"? +# Propongo dejarlo en " no se pudo abrir ". sv +# Ok. Es consistente con otras traducciones. mm +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (llave %s, mtime %I64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (dispositivo %d, nodo-i [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (dispositivo %ld, nodo-i %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "No" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " archivos, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "no" + +#: 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 +#: src/dir.c:1154 +msgid " so far." +msgstr " hasta ahora." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " imposibilidades en %lu directorios.\n" + +# Creo que eventually sería "finalmente" o algo así. sv +# Si, es finalmente no a veces. Ok. mm +# referencia me parece que no lleva tilde. sv +# No, no lleva acento. Me emocioné con elos. mm +# Creeis de veras que tiene sentido 'finalmente'em+ +# yo pondría ser termina autoreferenciando, por +# ejemplo em+ +# Mejor lo eliminamos. Es de alguna forma reiterativo e innecesario. +# Lo de `al final' puede ser más confuso. mm +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +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. +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "la referencia a la variable está sin terminar" + +#: 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 +#: src/file.c:283 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" +"Las instrucciones para el archivo '%s' se encontraron por búsqueda en reglas " +"implícitas," + +# "now" es "ahora". ¿te lo has comido consciente o inconscientemente? sv +# inconscientemente. mm +#: 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'." + +# Lo repetiré una y mil veces... :-) +# "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 +#: src/file.c:290 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" +"Las instrucciones para '%s' no serán tenidas en cuenta en favor de las que " +"están en '%s'." + +# 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 +#: 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 +#: 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 +#: 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 +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "*** Se borran los archivos intermedios...\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: Fecha fuera de intervalo; sustituyéndola %s" + +#: 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 +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Archivo valioso (es una dependencia de .PRECIOUS)." + +# Lo mismo. Y traducir por falso es poco menos que poco exacto. +# Los phony target de make son aquellos que se ejecutan siempre +# sin tener en cuenta si existe un archivo con el nombre del objetivo +# y de si es actual. Propondría incondicional en vez de falso, ya que +# explica exactamente qué es un phony target em+ +# 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 +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# objetivo falso (dependencia de .PHONY)." + +# FUZZY +# Pondria línea de comandos +# Y creo que no sé exactamente a que se refiere, No creo que haya visto +# este mensaje nunca en make lo marco con FUZZY em+ +# 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 +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Objetivo en línea de instrucciones." + +# Habría que entender esto +# Creo que esto es lo que significa. El fuente no es demasiado claro. mm +# Se refiere a que el fichero makefile es uno que encuentra por +# defecto ( en este orden GNUmakefile, Makefile y makefile ) o uno +# que está definido en la variable de entorno MAKEFILE em+ +# 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 +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Por omisión, MAKEFILES, o -include/sinclude makefile." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Regla incorporada" + +# Propongo efectuada en lugar de terminada. sv +# 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 +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# La búsqueda de reglas implícitas ha sido efectuada." + +# Propongo efectuada en lugar de terminada. sv +# 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 +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# La búsqueda de reglas implícitas ha sido efectuada." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Tema del patrón implícita/estática: '%s'\n" + +#: 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. +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# También hace:" + +# ¿y "comprobó"? sv +# Ok. Mejora. mm +# No pondría nunca, sino simplemente 'no se comprobó 'em+ +# Si, es lo mismo pero es más español. mm +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# La fecha de modificación no se comprobó." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# El archivo no existe." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# El archivo es muy viejo." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Última modificación %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# El archivo ha sido actualizado." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# El archivo ha sido actualizado." + +#: 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 +#: 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)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Actualizado con éxito." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Necesita ser actualizado (la opción -q está activa)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Fallo al ser actualizado." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# ¡Valor inválido en el miembro 'command_state'!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Archivos" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# estadísticas de la tabla «hash» de los archivos:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: El campo '%s' no está en «cache»: %s" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "Fallo en CreatePipe(), (e=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): fallo en process_init_fd()\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Limpiando el archivo temporal %s\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "archivo: falta el nombre del archivo" + +#: src/function.c:2234 src/function.c:2265 +#, c-format +msgid "open: %s: %s" +msgstr "abrir: %s: %s" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "escribir: %s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "cerrar: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "archivo: demasiados argumentos" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "leer: %s: %s" + +#: src/function.c:2290 +#, c-format +msgid "file: invalid file operation: %s" +msgstr "archivo: operación de archivo no válida: %s" + +#: 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'" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "No implementado en esta plataforma: función '%s'" + +#: 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'" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Nombre de función vacío" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Nombre de función no válido: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Nombre de función demasiado largo: %s" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "Número insuficiente de argumentos (%u) para la función %s" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "El número máximo de argumentos (%u) no es válido para la función %s" + +#: 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 +#: 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 +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: opción no reconocida '--%s'\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: opción no reconocida '%c%s'\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción inválida -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción inválida -- %c\n" + +#: 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" + +#: 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 +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expandiendo '%s'\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Evaluando '%s'\n" + +#: 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" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Carga=%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 "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 +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +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 +#: 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" + +# Pues si ilegal le suena a cárcel a Enrique, "evade" me suena a mí a +# escaparse de la cárcel... (fuga de alcatraz :-) +# te voy a dar yo a tí fuga ... em+ +# ¿Qué te parecería "se evita"? sv +# 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 +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitando la recursión en la regla implícita.\n" + +#: src/implicit.c:484 +#, c-format +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 +# he visto, pero en cristiano no se si podría entenderlo. +# se refiere a las reglas del tipo % , lo pongo FUZZY , tendré +# que pensar un poco en ello em+ +# 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 +#: 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" + +# ## Corrijo la palabra "dependencia". sv +# Cuando aparezca este mensaje tendrá poco menos que sentido +# testimonial. Date cuenta que los argumentos estan cambiados. +# Pon el orden correcto, siempre será más lógico que lo que vaya a +# aparecer tal y como está ahora (Se rechaza la dependencia imposible +# `%s' `%s )'em+ +# Ok. mm +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Se rechaza la regla de dependencia imposible '%s'.\n" + +# ## Corrijo la palabra "dependencia". sv +# Cuando aparezca este mensaje tendrá poco menos que sentido +# testimonial. Date cuenta que los argumentos estan cambiados. +# Pon el orden correcto, siempre será más lógico que lo que vaya a +# aparecer tal y como está ahora (Se rechaza la dependencia imposible +# `%s' `%s )'em+ +# Ok. mm +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Se rechaza la dependencia implícita imposible '%s'.\n" + +# FUZZY +# Esto me suena fatal. Se a que se refiere, porque lo +# he visto, pero en cristiano no se si podría entenderlo. +# se refiere a las reglas del tipo % , lo pongo FUZZY , tendré +# que pensar un poco en ello em+ +# 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 +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Intentando la regla de dependencia '%s'.\n" + +# Pues si ilegal le suena a cárcel a Enrique, "evade" me suena a mí a +# escaparse de la cárcel... (fuga de alcatraz :-) +# te voy a dar yo a tí fuga ... em+ +# ¿Qué te parecería "se evita"? sv +# 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 +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Probando la dependencia implícita '%s'.\n" + +#: 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" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "No se puede crear un archivo temporal\n" + +# Sugerencia: " (volcado de `core')". sv +# 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 +#: 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 +#: src/job.c:553 +msgid " (ignored)" +msgstr " (no tiene efecto)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +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 +#: 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 +#: src/job.c:704 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Hijo activo %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)" + +# Lo mismo, pon Proceso hijo, y quita lo que hay +# entre paréntesis em+ +#: src/job.c:898 +#, c-format +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+ +#: src/job.c:899 +#, c-format +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 +#: 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 +#: 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. +#: 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+ +#: 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" + +#: 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" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Se contaron %d argumentos en el lanzamiento fallido\n" + +# Proceso hijo em+ +# Ok. +#: 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+ +#: 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" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: el objetivo '%s' no existe" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: actualizar el objetivo '%s' a causa de: %s" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "no se puede forzar la carga límite: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "No se puede restaurar stdin\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "No se puede restaurar stdout\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "No se puede restaurar stderr\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: el espacio ambiental podría estar agotado" + +#: 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" + +#: 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" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Contenido del archivo de lotes:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Contenido del archivo de lotes:%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 (linea %d) Contexto de shell erróneo (!unixy && !batch_mode_shell)\n" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Fallo al abrir tabla global de símbolos: %s" + +#: 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" + +#: 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" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Nombre de símbolo vacío en la carga: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Cargando símbolo %s desde %s\n" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Opciones:\n" + +# Lo mismo de arriba con "ignorar". sv +# Ok. mm. +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m No se tendrá en cuenta por compatibilidad.\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Hace incondicionalmente todos los objetivos.\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORIO, --directory=DIRECTORIO\n" +" Se cambia al DIRECTORIO antes de hacer nada.\n" + +# ¿"depurado" o "depuración"? sv +# Puse de depurado para evitar la cacofonía información depuración. +# Sugerencias bienvenidas. mm +#: 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" + +# ¿"depurado" o "depuración"? sv +# Puse de depurado para evitar la cacofonía información depuración. +# Sugerencias bienvenidas. mm +#: 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" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Las variables ambientales se imponen a las de los " +"makefiles.\n" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" -E CADENA, --eval=CADENA Evalúa la CADENA como una instrucción de un " +"makefile.\n" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f ARCHIVO, --file=ARCHIVO, --makefile=ARCHIVO\n" +" Lee al ARCHIVO como un makefile.\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Muestra este mensaje y finaliza.\n" + +# Ojo con ignorar. sv +# Ok. mm +# Por favor, si has traducido commands como instrucciones , hazlo aqui +# tambien. +# No me gusta este mensaje, preferiría: Se ignoran los errores obtenidos +# en la ejecución de las instrucciones em+ +#: 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" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIRECTORIO, --include-dir=DIRECTORIO\n" +" Busca dentro del DIRECTORIO los makefiles incluidos.\n" + +# Yo traduciría "infinite" por "infinitos", no por "una infinidad", que +# parece que son muchos menos... sv +# Ok. mm +#: 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] Se permiten N trabajos a la vez; si no se " +"especifica un\n" +"argumento son infinitos.\n" + +# No entiendo por qué aquí empleas subjuntivo: "pudieron". sv +# Es incorrecto. Es una de las opciones `k' que dice... mm +#: 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" + +#: 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" +" No inicia con trabajos múltiples a menos que la carga esté por debajo " +"de 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 Utiliza el último mtime entre los enlaces " +"simbólicos y los objetivos.\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" +" No ejecuta ninguna instrucción; sólo las " +"muestra.\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 ARCHIVO, --old-file=ARCHIVO, --assume-old=ARCHIVO\n" +" Supone que ARCHIVO es muy viejo y no lo " +"reconstruye.\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 la salida de tareas paralelas por " +"tipo.\n" + +# de 'make' em+ +# ok. mm +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question No se ejecutan las instrucciones; el estado de " +"salida\n" +" indicará si están actualizados.\n" + +# ¿desabilitan o deshabilitan? sv +# Error de dedo. mm +# ¡ Por favor ! , ¿ pero qué es eso de interconstruidas ? +# Pon almacenadas internamente, que es exactamente lo que son :) em+ +# Bueno, bajo protesta. mm +#: 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 " +"almacenadas internamente.\n" + +# ¿desabilitan o deshabilitan? sv +# Error de dedo. mm +# ¡ Por favor ! , ¿ pero qué es eso de interconstruidas ? +# Pon almacenadas internamente, que es exactamente lo que son :) em+ +# Bueno, bajo protesta. mm +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\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" + +#: src/main.c:392 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Desactiva la opción -k.\n" + +# Se *tocan*, ¿no? sv +# Si. mm +# +# Pues entonces cámbialo arriba tambien em+ +# En donde? mm +#: src/main.c:395 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Se tocan los objetivos en vez de " +"reconstruirlos.\n" + +# ¿"depurado" o "depuración"? sv +# Puse de depurado para evitar la cacofonía información depuración. +# Sugerencias bienvenidas. mm +#: 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 +#: 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 +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Muestra el directorio actual.\n" + +# Lo mismo. sv +# Turn off , desactiva o deshabilita , pero no apaga em+ +# 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 +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Desactiva -w, aún cuando haya sido activado " +"implícitamente.\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 ARCHIVO, --what-if=ARCHIVO, --new-file=ARCHIVO, --assume-new=ARCHIVO\n" +" Supone que ARCHIVO es infinitamente " +"reciente.\n" + +# Lo mismo. sv +# Todas estas parecen descripciones de opciones. +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Advierte cuando se hace una referencia a una " +"variable no definida.\n" + +#: 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" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "se especificó un nivel de depuración desconocido '%s'" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "tipo de sincronización de salida desconocido '%s'" + +#: 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" + +#: 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" +"Se ha llamado un filtro de excepción no manejado desde el programa %s\n" +"Código de la excepción = %lx\n" +"Banderas de la excepción = %lx\n" +"Dirección de la excepción = 0x%p\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/main.c:1609 +#, c-format +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." + +#: src/main.c:1617 +#, c-format +msgid "warning: -j%d forced in submake: resetting jobserver mode." +msgstr "" +"atención: se fuerza a -j%d en el submake: se restablece el modo de servidor " +"de tareas." + +#: 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" + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (archivo temporal)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (archivo temporal)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Reajustando al modo monotarea (-j1)." + +#: 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 +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Actualizando archivos makefiles....\n" + +# Me comería el "archivo" inicial. +# Ok. mm +# "El Makefile `%s' ..." sv +# 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. +#: 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 +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Fallo al reconstruir el makefile '%s'." + +# Lo mismo. sv +#: 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 +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "No se encontró el makefile '%s'" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "No se pudo regresar al directorio original." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Re-ejecutando[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (archivo temporal)" + +#: 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 +#: 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" + +#: src/main.c:2586 +#, c-format +msgid "Updating goal targets....\n" +msgstr "Actualizando los objetivos finales....\n" + +#: 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 " +"estar incompleta." + +# ¿Y Modo de empleo? sv +# Soy medio bestia. Debería hacerlo automático. mm +# "target" es "objetivo", no "objetivos". Fíjate que lleva puntos +# suspensivos, permitiendo así varios objetivos. sv +# Ok. mm +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Modo de empleo: %s [opciones] [objetivo] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Este programa fue construido para %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Este programa construido para %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "Informe sobre los errores a \n" + +# Me comería el "de" de "requiere de" sv +# Ok. mm +#: 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 +#: 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" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sEste programa fue construido para %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sEste programa fue construido para %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLicencia GPLv3+: GNU GPL versión 3 o posterior \n" +"%sEste es software libre: cualquiera es libre para redistribuirlo y " +"modificarlo.\n" +"%sNo existe GARANTÍA ALGUNA, hasta los límites permitidos por las leyes " +"aplicables.\n" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Base de datos del Make, mostrada en %s" + +# make -> Make. sv +# Ok. mm +# Porqué 'del', o pones 'del programa' Make o pones +# 'de Make' em+ +# Ok. mm +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Se termina la base de datos de Make en %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Acceso inicializado" + +#: src/misc.c:743 +msgid "User access" +msgstr "Acceso del usuario" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Acceso del Make" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Acceso del hijo" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: se ingresa a un directorio desconocido\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: se sale del directorio desconocido\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: se entra en el directorio '%s'\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: se sale del directorio '%s'\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: se ingresa a un directorio desconocido\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: se sale del directorio desconocido\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: se entra en el directorio '%s'\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: se sale del directorio '%s'\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: 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 +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Alto.\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]) no está configurado para este «build»." + +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "creando una tubería de tareas" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "duplicando una tubería de tareas" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "se inicializa la tubería al servidor de tareas" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "error interno: cadena --jobserver-auth inválida '%s'" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Cliente del servidor de tareas (fds %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "tubería al servidor de tareas" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "escribir en el servidor de tareas" + +#: 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»" + +#: 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 +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Leyendo makefiles...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Leyendo makefile '%s'" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (no hay objetivo por defecto)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (ruta de búsqueda)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (no importa)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (no hay expansión del ~)" + +#: 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" + +#: 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 +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "sintaxis no válida en condicional" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: fallo al cargar" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "las instrucciones comenzaron antes del primer objetivo" + +# "falta una regla". sv +# (es que extraviada me suena muy raro). +# 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 +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "falta una regla antes de las instrucciones" + +#: 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?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "falta un separador" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "falta un patrón de objetivos" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "hay varios patrones de objetivos" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "el patrón de objetivo no contiene '%%'" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "falta un 'endif'" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "nombre de variable vacío" + +#: 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'" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "falta un 'endef', no se terminó un 'define'" + +#: 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'" + +#: 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'" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "irrelevante o mal colocado '%s'" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "sólo se admite un 'else' por condicional" + +#: 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" + +#: 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" + +#: 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 +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "las reglas implícitas y las normales están mezcladas" + +#: 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" + +#: 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 +#: 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" + +# 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: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 +#: 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 +#: 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" + +# 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "No se hace nada 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 "Se poda el archivo '%s'.\n" + +#: src/remake.c:389 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "" +"%sNo hay ninguna regla para construir el objetivo '%s', necesario para '%s'%s" + +# Sugerencia: No hay ninguna regla... sv +# Como una no hay ninguna. mm +#: 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" + +# ¿target file no sería "archivo objetivo"? sv +# Literalmente si pero un archivo make puede tener varios objetivos. mm +# Max , pero no existe un archivo de objetivos. Esta línea, que es +# 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 +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Se considera el archivo objetivo '%s'.\n" + +# Un compañero mío dice que una buena regla es poner siempre que se pueda +# un número par de comas. +# Es decir: "Se intentó, sin éxito, actualizar ..." +# o bien "Se intentó sin éxito actualizar ..." +# ¿Qué te parece? sv +# Bien y tiene razón. mm +#: 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" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Ya se ha tenido en cuenta el archivo '%s'.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Se continúa actualizando el archivo '%s'.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Se terminó de actualizar el archivo '%s'.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "El archivo '%s' no existe.\n" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Atención: el archivo .LOW_RESOLUTION_TIME '%s' tiene una marca de tiempo " +"de alta resolución" + +#: 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 +#: 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 +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Se utilizan las instrucciones por omisión para '%s'.\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +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 +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Se terminaron las dependencias del archivo objetivo '%s'.\n" + +#: 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 +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Se abandona el archivo objetivo '%s'.\n" + +#: 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ó." + +#: 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" + +#: 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" + +#: 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" + +#: 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 +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "No es necesario reconstruir el objetivo '%s'." + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +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 +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Se debe reconstruir el objetivo '%s'.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Se ignora el nombre del VPATH '%s'.\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +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 +#: 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 +#: 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 +#: 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 +#: 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 +#: 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" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "El elemento .LIBPATTERNS '%s' no es un patrón" + +# ¿Las aduanas? sv +# Si, las aduanas de exportación de procesos. Suena rarísimo pero +# revisé el código y todo parece apuntar a que así son las cosas. +# Creo que esto es otra cosa. Custom se refiere a los valores dados +# por el usuario ( customizables ) , y que no se exportarán se refiere +# a que al llamar a otros makefiles, no serán pasados como valores +# que se antepongan ( otro término para override ) a los que make +# tiene por defecto . +# La traducción exacta por tanto es, los valores definidos por el usuario +# 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 +#: 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" + +#: 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" +"# Reglas implícitas." + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# No hay reglas implícitas." + +#: src/rule.c:548 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u reglas implícitas, %u (%.1f%%) terminal." + +# ## Añado ¡ con tu permiso. sv +# Gracias. mm +# ¿ qué tal erróneo ? em+ +# Si, suena mejor. mm +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: ¡num_pattern_rules erróneo! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "señal desconocida" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Colgado" + +# ¿ Y por qué no Interrupción ? em+ +# 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 +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Interrumpir" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Finalizar" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Instrucción no válida" + +# Los trap los hemos dejado como traps, simplemente. em+ +# Ok. mm +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Trace/breakpoint trap" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Abortado" + +# Ponte de acuerdo con Enrique en cómo se traduce esto. +# Enrique tiene esta misma frase en glibc. sv +# Eso es :) IOT trap em+ +# Ok. mm +#: src/signame.c:112 +msgid "IOT trap" +msgstr "IOT trap" + +# Otra em+ +# Ok. mm +#: src/signame.c:115 +msgid "EMT trap" +msgstr "EMT trap" + +# Coma flotante, por favor. sv +# Creeme que aquí lo de coma flotante no vale. Somos pro-yanquis y +# por eso usamos el punto flotante. Debemos llegar a un acuerdo. +# Por ahora pongo coma flotante para facilitar las cosas, pero bajo +# protesta ;-) mm +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Excepción de coma flotante" + +# "Terminado por la señal kill" quedaría un poco más suave ... sv +# Enrique tiene en glibc "Terminado (killed)". sv +# 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 +#: src/signame.c:121 +msgid "Killed" +msgstr "Terminado (killed)" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Error en el bus" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Fallo de segmentación" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Llamada al sistema errónea" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Tubería rota" + +# ¿Temporizador? (así lo tradujo Enrique en glibc). sv +# Suena como StarTrek. Mejor lo platico con él. A lo mejor +# hasta lo convenzo. mm +# Pues tendrás que darme razones em+ +# 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 +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Alarma del reloj" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Finalizado" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Señal 1 definida por el usuario" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Señal 2 definida por el usuario" + +# Proceso hijo terminado em+ +# Ok. mm +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Proceso hijo terminado" + +# Fallo. sv +# Alimentación eléctrico em+ +# Ok. mm +#: src/signame.c:156 +msgid "Power failure" +msgstr "Falla de alimentación eléctrica" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Detenido" + +# Enrique hizo una preciosa traducción de este mensaje que, según él, +# mejora el original. Era algo así como: +# "Detenido (requiere entrada de terminal)". sv +# Tiene razón se ve bien. mm +# Requiere 'de';) , como te vea Santiago que le metes +# otro 'de' otra vez ... em+ +# Ok. mm +#: 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 +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Detenido (se requiere salida de terminal)" + +# idem em+ +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Detenido (se requiere una señal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Se agotó el tiempo de CPU permitido" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Se excedió el tamaño máximo de archivo permitido" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "El contador de tiempo virtual ha expirado" + +# Nunca me enteré de cómo se traducía profile, pero perfil me suena raro. +# ¿De dónde lo has sacado? sv +# Es lo que quiere decir, ni modo. Perfil de un avión es plane profile. +# Por cierto, lo más probable es que esta "traducción" haya que +# modificarla para que sea entendible. mm +# 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 +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "El contador de tiempo para la generación del perfil ha expirado" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "La ventana ha cambiado" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Continuado" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Condición urgente de I/O" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "Posible 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 "Señal de peligro" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Petición de información" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Coprocesador de punto flotante no disponible" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s No hay «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) / cadenas = %lu / almacenamiento = %lu B / " +"promedio = %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: tamaño = %hu B / utilizado = %hu B / número = %hu / " +"promedio = %u B\n" + +#: 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" + +#: 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 otros libre: total = %lu B / máx = %lu B / mín = %lu B / promedio = %hu " +"B\n" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s rendimiento de strcache: búsquedas = %lu / coincidencias = %lu%%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# estadísticas de la tabla «hash»:\n" +"# " + +# Lo he cmabiado em+ +# Ok. Deberíamos platicarlo con Ulrich. mm +#: src/variable.c:1653 +msgid "automatic" +msgstr "automática/o" + +#: src/variable.c:1656 +msgid "default" +msgstr "por defecto" + +#: src/variable.c:1659 +msgid "environment" +msgstr "entorno" + +# Sugerencia: No poner archivo. sv +# Ok. mm +#: 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 +#: 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 +#: 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 +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "directiva 'override'" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (de '%s', línea %lu):" + +# Bueno. Aquí un punto de discusión. Traduzco buckets por cubetas o +# mejor las dejo tal cual? Opiniones bienvenidas. mm +# 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 +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# estadísticas del conjunto de variables de la tabla «hash»:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variables\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valores de variables específicas al patrón" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# No hay valores de variables específicas al patrón." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valores de variables específicas al patrón" + +# ¿Qué te parece "atención"? Lo hemos usado mucho en otros programas. sv +# Pero que bestia soy. Perdón por el desbarre. mm +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "atención: la variable '%.*s' no ha sido definida" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "fallo en sys$search() con %d\n" + +#: 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" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "CD INTEGRADO %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 "Salida redirigida a %s\n" + +#: 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 +#: 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 +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Rutas de búsqueda VPATH\n" + +# Rutas creo que queda mejor. sv +# Ok. Es más común. mm +#: 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 +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u rutas de búsqueda 'vpath'.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# No hay ruta de búsqueda general (variable 'VPATH')." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Ruta de búsqueda general (variable 'VPATH'):\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Ranuras del servidor de tareas limitads a %d\n" + +#: 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)" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" +"error interno: no se pudo abrir el semáforo del servidor de tareas '%s': " +"(Error %ld: %s)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Cliente del servidor de tareas (semáforo %s)\n" + +#: 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)" + +#: 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+ +# Aunque no me acaba de convencer, que te parece ésto? mm +#~ msgid "%s: recipe for target '%s' failed" +#~ msgstr "%s: fallo en las instrucciones para el objetivo '%s'" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] Error 0x%x%s" + +#~ msgid "%s[%s] %s%s%s" +#~ msgstr "%s[%s] %s%s%s" + +#~ msgid "dup jobserver" +#~ msgstr "servidor de tareas duplicado" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Atención: redirección vacía\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "error interno: '%s' command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "INTEGRADA(S) [%s][%s]\n" + +#~ msgid "BUILTIN ECHO %s->%s\n" +#~ msgstr "ECO INTEGRADO %s->%s\n" + +# Por defecto, como haces arriba em+ +# en efecto, mm +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Instrucción integrada desconocida '%s'\n" + +#~ msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +#~ msgstr "" +#~ "La instrucción integrada se desconoce o no funciona en .ONESHELL: '%s'\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Error, comando vacío\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Entrada redirigida desde %s\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#~ msgid "Redirected error to %s\n" +#~ msgstr "Se redirecciona el error a %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Salida redirigida a %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Error al lanzar el proceso %d\n" + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "error interno: hay varias opciones --sync-mutex" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "error interno: hay varias opciones --jobserver-fds" + +# Propongo eliminar la palabra virtual. sv +# Pero si es muy bonita. :) Bueno. Como ya platicamos puede que sea +# una buena idea pero, por ahora la dejaría. mm +#~ msgid "virtual memory exhausted" +#~ msgstr "memoria virtual agotada" + +#~ msgid "write error" +#~ msgstr "error al escribir" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "RM INTERCONSTRUIDO %s\n" diff --git a/third_party/make/po/fi.gmo b/third_party/make/po/fi.gmo new file mode 100644 index 0000000000000000000000000000000000000000..1c367cdb4c4fd69d67a9d17567e9ec1fdffe0d32 GIT binary patch literal 31939 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 ZPiXkW=?Eu+vDYy6I?B7q+w;}h{{@_?$>jh5 literal 0 HcmV?d00001 diff --git a/third_party/make/po/fi.po b/third_party/make/po/fi.po new file mode 100644 index 00000000000..5b820457f0d --- /dev/null +++ b/third_party/make/po/fi.po @@ -0,0 +1,2362 @@ +# Finnish messages for make. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Lauri Nurmi , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: make 4.2\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\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 \n" +"Language-Team: Finnish \n" +"Language: fi\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: Poedit 1.8.7\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "yritettiin käyttää ominaisuutta, jolle ei ole tukea: ”%s”" + +#: src/ar.c:123 +#, c-format +msgid "touch archive member is not available on VMS" +msgstr "arkistojäsenten kosketus ei ole mahdollista VMS:ssä" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Arkistoa ”%s” ei ole olemassa" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: ”%s” ei ole kelvollinen arkisto" + +#: 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”" + +#: 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”" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() epäonnistui, tila = %d" + +#: 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" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (nimi voi olla typistynyt)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Päiväys %s" + +#: src/arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, oikeudet = 0%o.\n" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Katkaisu.\n" + +#: 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" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Arkistojäsen ”%s” voi olla viallinen – ei poisteta" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Poistetaan tiedosto ”%s”" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Poistetaan tiedosto ”%s”" + +#: src/commands.c:684 +#, fuzzy +msgid "# recipe to execute" +msgstr "# käynnisetttävät komennot" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (sisäänrakennettu):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (tiedosto ”%s”, rivi %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Hakemistot\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: tilaa ei voitu lukea.\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +#, fuzzy +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (avain %s, maika %d: " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (laite %d, i-solmu [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (laite %ld, i-solmu %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Ei" + +# Juuri näin, muodostetaan käännöslause yksittäisistä sanoista... +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " tiedostoa, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "ei" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " mahdottomuutta" + +#: src/dir.c:1154 +msgid " so far." +msgstr " tähän mennessä." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " mahdottomuutta %lu hakemistossa.\n" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekursiivinen muuttuja ”%s” viittaa (lopulta) itseensä" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "päättämätön muuttujaviittaus" + +#: 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," + +#: 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," + +#: 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”." + +#: 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”." + +#: src/file.c:310 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" + +#: src/file.c:316 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Poistetaan aputiedosto ”%s”" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Poistetaan aputiedostot...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Tämänhetkinen aika" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Aikaleima ei ole sallitulla välillä, korvataan %s" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Ei kohde:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Arvokas tiedosto (ennakkoehto .PRECIOUS:ille)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Valekohde (ennakkoehto .PHONY:lle)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Komentorivikohde." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Oletus-, MAKEFILES- tai -include/sinclude -makefile-tiedosto." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Sisäänrakennettu sääntö" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Oletussääntöhaku on suoritettu." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Oletussääntöhakua ei ole suoritettu." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Tiedosto on välitason ennakkoehto." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Tuotetaan myös:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Muutosaikaa ei koskaan tarkastettu." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Tiedosto ei ole olemassa." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Tiedosto on hyvin vanha." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Viimeksi muutettu %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Tiedosto on päivitetty." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Tiedostoa ei ole päivitetty." + +#: src/file.c:1062 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Ajossa olevat komennot (TÄMÄ ON OHJELMISTOVIKA)." + +#: src/file.c:1065 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Ajossa olevat riippuvuuskomennot (TÄMÄ ON OHJELMISTOVIKA)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Päivitetty onnistuneesti." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Vaatii päivitystä (-q on asetettu)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Päivitys epäonnistui." + +#: src/file.c:1086 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Virheellinen arvo ”command_state”-jäsenessä!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Tiedostot" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# tilasto tiedostojen hajautustaulusta:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "ei-numeerinen ensimmäinen argumentti ”word”-funktiolle" + +#: 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" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "ei-numeerinen ensimmäinen argumentti ”wordlist”-funktiolle" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "ei-numeerinen toinen argumentti ”wordlist”-funktiolle" + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() epäonnistui (v=%ld)\n" + +#: src/function.c:1572 +#, fuzzy, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() epäonnistui\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Siivotaan väliaikainen komentotiedosto %s\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "tiedosto: tiedostonimi puuttuu" + +#: 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 "tiedosto: liian monta argumenttia" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "read: %s: %s" + +#: src/function.c:2290 +#, fuzzy, c-format +msgid "file: invalid file operation: %s" +msgstr "Virheellinen tiedostotoiminto: %s" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "liian vähän (%d) argumentteja funktiolle ”%s”" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "ei toteutettu tällä alustalla: funktio ”%s”" + +#: 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”" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Tyhjä funktionimi" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Virheellinen funktionimi: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Funktionimi on liian pitkä: %s" + +#: 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" + +#: src/function.c:2677 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "Virheellinen enimmäisargumenttimäärä (%d) funktiolle %s" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: valitsin ”%s” on moniselitteinen\n" + +#: src/getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: valitsin ”--%s” ei salli argumenttia\n" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: tunnistamaton valitsin ”--%s”\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: tunnistamaton valitsin ”%c%s”\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: virheellinen valitsin -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: virheellinen valitsin -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: valitsin ”-W %s” on moniselitteinen\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Lavennetaan ”%s”\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: 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" + +#: src/hash.c:280 +#, fuzzy, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Kuormitus=%ld/%ld=%.0f%%, " + +#: src/hash.c:282 +#, fuzzy, c-format +msgid "Rehash=%u, " +msgstr "Uudelleenhajautus=%d, " + +#: src/hash.c:283 +#, fuzzy, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Törmäykset=%ld/%ld=%.0f%%" + +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Etsitään oletussääntöä kohteelle ”%s”.\n" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Vältetään oletussääntörekursio.\n" + +#: src/implicit.c:484 +#, fuzzy, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Liian pitkä runko: ”%.*s”.\n" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Kokeillaan hahmosääntöä rungolla ”%.*s”.\n" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Hylätään mahdoton säännön ennakkoehto ”%s”.\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Hylätään mahdoton oletusennakkoehto ”%s”.\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Yritetään käyttää säännön ennakkoehtoa ”%s”.\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Yritetään käyttää oletusennakkoehtoa ”%s”.\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Löydettiin ennakkoehto ”%s”, joka on VPATH ”%s”\n" + +#: src/implicit.c:786 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Etsitään sääntöä aputiedostolla ”%s”.\n" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Väliaikaistiedoston luominen ei onnistu\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (muisti vedostettu)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (ei huomioida)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Virhe %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Odotetaan keskeneräisiä töitä...." + +#: src/job.c:704 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "" + +#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644 +#, c-format +msgid " (remote)" +msgstr " (etä)" + +#: src/job.c:898 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "" + +#: src/job.c:899 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: src/job.c:950 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Siivotaan väliaikainen komentotiedosto %s\n" + +#: src/job.c:956 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Siivotaan väliaikainen komentotiedosto %s\n" + +#: 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" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: 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" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Laskettiin %d argumenttia epäonnistuneessa käynnistyksessä\n" + +#: 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" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: kohde ”%s” ei ole olemassa" + +#: 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" + +#: 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ä" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "kuormarajaa ei voi ottaa käyttöön: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Vakiosyötettä ei voitu palauttaa\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Vakiotulostetta ei voitu palauttaa\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Vakiovirhetulostetta ei voitu palauttaa\n" + +#: src/job.c:2520 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: ympäristötila saattaa olla lopussa" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL muuttunut (oli ”%s”, nyt ”%s”)\n" + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Luodaan väliaikainen komentotiedosto %s\n" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Komentojonotiedoston sisältö:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Komentojonotiedoston sisältö:%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 (rivi %d) Väärä kuoriympäristö (!unixy && !batch_mode_shell)\n" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: src/load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Valitsimet:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m Yhteensopivuuden vuoksi jätetään huomiotta.\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Tuota kaikki kohteet ehdoitta.\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C HAKEMISTO, --directory=HAKEMISTO\n" +" Siirry HAKEMISTOon ennen jatkamista.\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Näytä runsaasti vianetsintätietoja.\n" + +#: src/main.c:345 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr " --debug[=LIPUT] Näytä monenlaisia vianetsintätietoja.\n" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Ympäristömuuttujat kumoavat makefile-" +"tiedostot.\n" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f TIEDOSTO, --file=TIEDOSTO, --makefile=TIEDOSTO\n" +" Käytä TIEDOSTOa makefile-tiedostona.\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Näytä tämä viesti ja poistu.\n" + +#: src/main.c:357 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Älä huomioi suoritettujen komentojen " +"virheitä.\n" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I HAKEMISTO, --include-dir=HAKEMISTO\n" +" Etsi sisällytettäviä makefile:ja " +"HAKEMISTOsta.\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] Salli N yhtäaikaista työtä; ilman N:ää " +"ääretön.\n" + +#: 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" + +#: 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" +" Älä aloita useita töitä ellei kuormitus alle " +"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 Käytä uusinta mtime-aikaa symlinkkien ja\n" +" kohteen välillä.\n" + +#: src/main.c:371 +#, fuzzy +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äytä ajettavat komennot, älä käynnistä " +"niitä.\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 TIEDOSTO, --old-file=TIEDOSTO, --assume-old=TIEDOSTO\n" +" Käsittele TIEDOSTO vanhana, älä tuota sitä.\n" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: 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" + +#: src/main.c:382 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Älä aja komentoja; paluuarvo kertoo ajan-\n" +" tasaisuuden.\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Älä kaiuta komentoja.\n" + +#: 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" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Kumoaa valitsimen -k.\n" + +#: src/main.c:395 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " -t, --touch Kosketa kohteita tuottamisen sijaan.\n" + +#: src/main.c:397 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr " -d Näytä runsaasti vianetsintätietoja.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Näytä nykyinen hakemisto.\n" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Kumoa -w, vaikka se olisi käytössä " +"oletuksena.\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 TIEDOSTO, --what-if=TIEDOSTO, --new-file=TIEDOSTO, --assume-" +"new=TIEDOSTO\n" +" Käsittele TIEDOSTO aina uutena.\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Varoita viittauksista määrittelemättömiin\n" +" muuttujiin.\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "tyhjä merkkijono ei kelpaa tiedostonimeksi" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "tuntematon vianetsintätason määritys ”%s”" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: 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" + +#: src/main.c:856 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Ohjelmasta %s kutsuttiin käsittelemätöntä poikkeussuodinta\n" +"Poikkeuskoodi = %x\n" +"Poikkeusliput = %x\n" +"Poikkeusosoite = %x\n" + +#: src/main.c:864 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Suojausvirhe: kirjoitusoperaatio osoitteeseen 0x%p\n" + +#: src/main.c:865 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Suojausvirhe: lukuoperaatio osoitteeseen 0x%p\n" + +#: 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" + +#: 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" + +#: 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." + +#: 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ä." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefile-tiedosto vakiosyötteestä määritelty kahdesti." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (väliaikaistiedosto)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (väliaikaistiedosto)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Palataan yhden työn (-j1) tilaan." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "Ei tukea symbolisille linkeille: poistetaan -L käytöstä." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Päivitetään makefile-tiedostoja....\n" + +#: 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" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Makefile-tiedoston ”%s” uudelleentuottaminen epäonnistui." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Sisällytettyä makefile-tiedostoa ”%s” ei löytynyt." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefile-tiedostoa ”%s” ei löytynyt" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Ei voitu siirtyä takaisin alkuperäiseen hakemistoon." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Uudelleenkäynnistetään[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (väliaikaistiedosto): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL sisältää yli yhden kohteen" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Ei kohteita" + +#: 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 "" + +#: 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." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Käyttö: %s [valitsimet] [kohde] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Tämä ohjelma on käännetty järjestelmälle %s.\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Tämä ohjelma on käännetty järjestelmälle %s (%s).\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Ilmoita ohjelmistovioista (englanniksi) osoitteeseen .\n" + +#: 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" + +#: src/main.c:2965 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "valitsin ”-%c” vaatii positiivisen kokonaislukuargumentin" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sTämä ohjelma on käännetty järjestelmälle %s\n" + +#: 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" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make-tietokanta, tulostettu %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Make-tietokanta saatu valmiiksi %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Alkuperäiset käyttöoikeudet" + +#: src/misc.c:743 +msgid "User access" +msgstr "Käyttäjän käyttöoikeudet" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Make-prosessin käyttöoikeudet" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Lapsiprosessin käyttöoikeudet" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Siirrytään tuntemattomaan hakemistoon\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Poistutaan tuntemattomasta hakemistosta\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Siirrytään hakemistoon ”%s”\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Poistutaan hakemistosta ”%s”\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Siirrytään tuntemattomaan hakemistoon\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Poistutaan tuntemattomasta hakemistosta\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Siirrytään hakemistoon ”%s”\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Poistutaan hakemistosta ”%s”\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "kirjoitusvirhe: vakiotuloste" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Seis.\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 "" + +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "luodaan työputki" + +#: src/posixos.c:98 src/posixos.c:251 +#, fuzzy +msgid "duping jobs pipe" +msgstr "luodaan työputki" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "alustetaan työpalvelimen putki" + +#: src/posixos.c:119 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "sisäinen virhe: virheellinen --jobserver-fds -merkkijono ”%s”" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: src/posixos.c:138 +#, fuzzy +msgid "jobserver pipeline" +msgstr "alustetaan työpalvelimen putki" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "työpalvelimen kirjoitus" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "työputken luku" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Luetaan makefile-tiedostoja...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Luetaan makefile-tiedosto ”%s”" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr "" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (hakupolku)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (ei välitetä)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ei ~-laajennusta)" + +#: src/read.c:655 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "Ohitetaan UTF-8-BOM makefile-tiedostossa ”%s”\n" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Ohitetaan UTF-8-BOM makefile-puskurissa\n" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "virheellinen syntaksi ehtolauseessa" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: src/read.c:986 +#, fuzzy, c-format +msgid "recipe commences before first target" +msgstr "komennot alkavat ennen ensimmäistä kohdetta" + +#: src/read.c:1035 +#, fuzzy, c-format +msgid "missing rule before recipe" +msgstr "puuttuva sääntö ennen komentoja" + +#: 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ä?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "puuttuva erotin" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "puuttuva kohdehahmo" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "useita kohdehahmoja" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "kohdehahmo ei sisällä ”%%”-merkkiä" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "puuttuva ”endif”" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "tyhjä muuttujan nimi" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "ylimääräistä tekstiä ”endef”-toimintaohjeen jälkeen" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "puuttuva ”endef”, päättämätön ”define”" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "ylimääräistä tekstiä ”endef”-toimintaohjeen jälkeen" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "ylimääräistä tekstiä ”%s”-toimintaohjeen jälkeen" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "ylimääräinen ”%s”" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "vain yksi ”else” ehtolausetta kohden" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Väärin muotoiltu kohdekohtainen muuttujamäärittely" + +# skripti? +#: src/read.c:1968 +#, fuzzy, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "ennakkoehtoja ei voi määritellä komentoskripteissä" + +#: 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 "kohde ”%s” ei täsmää kohdehahmon kanssa" + +#: 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" + +#: 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ä" + +#: src/read.c:2138 +#, fuzzy, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "varoitus: syrjäytetään kohteen ”%s” komennot" + +#: src/read.c:2141 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "varoitus: ei huomioida vanhoja komentoja kohteelle ”%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 "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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Kohteelle ”%s” ei tarvitse tehdä mitään." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "”%s” on ajan tasalla." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Karsitaan tiedosto ”%s”.\n" + +#: 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" + +#: src/remake.c:399 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sKohteen ”%s” tuottamiseen ei ole sääntöä%s" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Tarkastellaan kohdetiedostoa ”%s”.\n" + +#: 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" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Tiedostoa ”%s” on jo tarkasteltu.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Päivitetään edelleen tiedostoa ”%s”.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Tiedoston ”%s” päivitys valmistui.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Tiedosto ”%s” ei ole olemassa.\n" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Varoitus: .LOW_RESOLUTION_TIME-tiedostolla ”%s” on korkearesoluutioinen " +"aikaleima" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Käytetään oletuskomentoja kohteelle ”%s”.\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Kehäriippuvuus %s <- %s hylätty." + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Kohdetiedoston ”%s” ennakkoehdot täytetty.\n" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Kohteen ”%s” ennakkoehtoja täytetään.\n" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Luovutaan kohdetiedostosta ”%s”.\n" + +#: src/remake.c:699 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Kohdetta ”%s” ei tuotettu uudelleen virheiden vuoksi." + +#: 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" + +#: 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" + +#: src/remake.c:761 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Ennakkoehto ”%s” on uudempi kuin kohde ”%s”.\n" + +#: src/remake.c:764 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Ennakkoehto ”%s” on vanhempi kuin kohde ”%s”.\n" + +#: src/remake.c:782 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: src/remake.c:789 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" + +#: 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" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Ei tarvetta uudelleentuottaa kohdetta ”%s”" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; käytetään VPATH-nimeä ”%s”" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Kohde ”%s” on tuotettava uudelleen.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ei huomioida VPATH-nimeä ”%s”.\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Kohdetiedoston ”%s” uudelleentuottaminen epäonnistui.\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Kohdetiedosto ”%s” uudelleentuotettiin onnistuneesti.\n" + +#: src/remake.c:852 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Käytetään oletuskomentoja kohteelle ”%s”.\n" + +#: 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" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS-elementti ”%s” ei ole hahmo" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: 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" +"# Oletussäännöt" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Ei oletussääntöjä." + +#: src/rule.c:548 +#, fuzzy, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u oletussääntöä, %u" + +#: 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" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "tuntematon signaali" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Linjankatkaisu" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Keskeytys" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Lopetettu" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Virheellinen käsky" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Jäljitys/katkaisupisteansa" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Keskeytetty" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "IOT-ansa" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "EMT-ansa" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Liukulukupoikkeus" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Tapettu" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Väylävirhe" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Muistialueen ylitys" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Virheellinen järjestelmäkutsu" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Katkennut putki" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Herätyskello" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Päätetty" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Käyttäjän määrittelemä signaali 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Käyttäjän määrittelemä signaali 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Lapsi lopetti" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Sähkökatko" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Pysäytetty" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Pysäytetty (päätteen syöte)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Pysäytetty (päätteen tuloste)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Pysäytetty (signaali)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Suoritinaikaraja ylittynyt" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Tiedoston kokoraja ylitetty" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtuaaliajastin vanhentunut" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Profilointiajastin vanhentunut" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Ikkuna vaihtunut" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Jatkettu" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Kiireellinen I/O-tilanne" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "I/O mahdollista" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Resurssi menetetty" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Vaarasignaali" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Tietopyyntö" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Käytettävissä ei ole liukulukusuoritinta" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: src/strcache.c:304 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: src/strcache.c:308 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n" +msgstr "" + +#: src/strcache.c:319 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: src/strcache.c:322 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# tilasto tiedostojen hajautustaulusta:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automaattinen" + +#: src/variable.c:1656 +msgid "default" +msgstr "oletus" + +#: src/variable.c:1659 +msgid "environment" +msgstr "ympäristö" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "-e:n alainen ympäristö" + +#: src/variable.c:1668 +msgid "command line" +msgstr "komentorivi" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "”override”-toimintaohje" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (tiedosto ”%s”, rivi %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# muuttujajoukon hajautustaulutilastot:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Muuttujat\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Hahmokohtaisia muuttujien arvoja" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Ei hahmokohtaisia muuttuja-arvoja." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u hahmokohtaista muuttuja-arvoa" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "varoitus: määrittelemätön muuttuja ”%.*s”" + +#: src/vmsfunctions.c:91 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search epäonnistui, arvo %d\n" + +#: 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" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "SISÄÄNRAKENNETTU CD %s\n" + +#: src/vmsjobs.c:1224 +#, c-format +msgid "DCL: %s\n" +msgstr "DCL: %s\n" + +#: src/vmsjobs.c:1284 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Tuloste uudelleenohjattu kohteeseen %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Käynnistetään sen sijaan %s\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-hakupolut\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Ei ”vpath”-hakupolkuja." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u ”vpath”-hakupolkua.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Ei yleistä (”VPATH”-muuttuja) hakupolkua." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Yleinen (”VPATH”-muuttuja) hakupolku:\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: 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" + +#~ msgid "%s[%s] %s%s%s" +#~ msgstr "%s[%s] %s%s%s" + +#~ msgid "dup jobserver" +#~ msgstr "kaksinkertainen työpalvelin" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Varoitus: Tyhjä uudelleenohjaus\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "sisäinen virhe: ”%s” command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "SISÄÄNRAKENNETTU [%s][%s]\n" + +#, fuzzy +#~ msgid "BUILTIN ECHO %s->%s\n" +#~ msgstr "SISÄÄNRAKENNETTU CD %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Tuntematon sisäänrakennettu komento ”%s”\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Virhe, tyhjä komento\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Syöte uudelleenohjattu kohteesta %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Virhetuloste uudelleenohjattu kohteeseen %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Tuloste uudelleenohjattu kohteeseen %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Virhe käynnistyksessä, %d\n" + +#~ msgid "# Invalid value in `update_status' member!" +#~ msgstr "# Virheellinen arvo ”update_status”-jäsenessä!" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Virhe 0x%x (ei huomioida)" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Älä anna -j tai --jobs -valitsinta jos sh.exe ei ole käytettävissä." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Palautetaan make yhden työn tilaan." + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "sisäinen virhe: useitan --jobserver-fds -valitsimia" + +#~ 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 "" +#~ "%sTämä on vapaa ohjelmisto; katso kopiointiehdot lähdekoodista.\n" +#~ "%sTakuuta EI ole, ei edes KAUPALLISESTI HYVÄKSYTTÄVÄSTÄ LAADUSTA tai\n" +#~ "%sSOPIVUUDESTA TIETTYYN TARKOITUKSEEN.\n" + +#~ msgid "virtual memory exhausted" +#~ msgstr "virtuaalimuisti lopussa" + +#~ msgid "write error" +#~ msgstr "kirjoitusvirhe" + +#~ msgid "extraneous `endef'" +#~ msgstr "ylimääräinen ”endef”" + +#~ msgid "empty `override' directive" +#~ msgstr "tyhjä ”override”-toimintaohje" + +#~ msgid "invalid `override' directive" +#~ msgstr "virheellinen ”override”-toimintaohje" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-varoitus, Ctrl-Y jättää aliprosessi(n/t) käyntiin.\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "SISÄÄNRAKENNETTU RM %s\n" + +#~ msgid "Syntax error, still inside '”'\n" +#~ msgstr "Syntaksivirhe, edelleen ”:n sisällä\n" diff --git a/third_party/make/po/fr.gmo b/third_party/make/po/fr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..71682caadcd1a513adfa79f2e35ab86e3eaa9394 GIT binary patch literal 44911 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 literal 0 HcmV?d00001 diff --git a/third_party/make/po/fr.po b/third_party/make/po/fr.po new file mode 100644 index 00000000000..70d034939db --- /dev/null +++ b/third_party/make/po/fr.po @@ -0,0 +1,2686 @@ +# 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 , Frédéric Liné , 1996. +# Michel Robitaille , 1996-2006 +# Christophe Combelles , 2009, 2010 +# Kévin Raymond , 2012-2016, 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: GNU 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: 2018-08-28 17:59+0200\n" +"Last-Translator: Kévin Raymond \n" +"Language-Team: French \n" +"Language: fr\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: Poedit 2.1.1\n" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "tentative d'utiliser une fonctionnalité non prise en charge : « %s »" + +#: 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" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch : l'archive « %s » n'existe pas" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch : « %s » n'est pas une archive valide" + +#: 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 »" + +#: 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 »" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() a échoué avec un code = %d" + +#: 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 »" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (le nom peut être tronqué)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Date %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 "La recette contient trop de lignes (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Arrêt.\n" + +#: 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é" + +#: 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é" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Suppression du fichier « %s »" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Suppression du fichier « %s »" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# recette à exécuter" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (commande interne) :" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (de « %s », ligne %lu) : \n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Répertoires\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: « stat » impossible.\n" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "# %s (clé %s, mtime %I64u) : ouverture impossible.\n" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (clé %s, mtime %I64u) : " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (périphérique %d, inode [%d,%d,%d]) : " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (périphérique %ld, inode %ld) : " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Aucun" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " fichier(s), " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "aucune" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " impossibilité(s)" + +#: src/dir.c:1154 +msgid " so far." +msgstr " jusqu'ici." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilités dans %lu répertoires.\n" + +#: 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)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "référence incomplète à une variable" + +#: 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," + +#: 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 " +"implicite," + +#: 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 »." + +#: 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 »." + +#: 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 »" + +#: 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 »" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Suppression du fichier intermédiaire « %s »" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Suppression des fichiers intermédiaires...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Heure actuelle" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s : horodatage hors limite ; remplacement par %s" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Pas une cible :" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Fichier précieux (dépendance de .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Cible factice (dépendance de .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Cible de la ligne de commande." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Une valeur par défaut, MAKEFILES ou -include/sinclude makefile." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Pas de règle interne" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# La recherche de règle implicite a été effectuée." + +#: 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." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Préfixe de motif implicite ou statique : « %s »\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Le fichier est une dépendance intermédiaire." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Fabrique également :" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Heure de modification jamais vérifiée." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Le fichier n'existe pas." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Le fichier est très ancien." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Dernière modification %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Le fichier a été mis à jour." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Le fichier n'a pas été mis à jour." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Recette en cours d'exécution (CECI EST UNE ANOMALIE)." + +#: 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)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Mise à jour réussie." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# À besoin d'être mis à jour (l'option -q est activée)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# N'a pas pu être mis à jour." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Valeur non valable dans le membre « command_state » !" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Fichiers" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# stats des tables de hachage des fichiers :\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s : le champ « %s » n'est pas en cache : %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "le premier argument de la fonction « word » doit être numérique" + +#: 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" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "le premier argument de la fonction « wordlist » doit être numérique" + +#: 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" + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() a échoué (e=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe() : process_init_fd() a échoué\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Nettoyage du fichier de commandes temporaire %s\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "file : fichier manquant" + +#: 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 : trop d'arguments" + +#: 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 : opération invalide : %s" + +#: 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 »" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "non implémenté sur cette plateforme : fonction « %s »" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "appel à la fonction « %s » non terminé : « %c » manquant" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Nom de fonction absent" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Nom de fonction invalide : %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Nom de fonction trop long : %s" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "Nombre d'arguments insuffisant (%u) pour la fonction %s" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "Nombre d'arguments excessif (%u) pour la fonction %s" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s : l'option « %s » est ambiguë\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s : option non reconnue « --%s »\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s : option non reconnue « %c%s »\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s : option non admise -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s : option incorrecte -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s : l'option « -W %s » est ambiguë\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile : expansion de « %s »\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile : évaluation de « %s »\n" + +#: 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" + +#: src/hash.c:280 +#, fuzzy, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Charge=%ld/%ld=%.0f%%, " + +#: src/hash.c:282 +#, fuzzy, c-format +msgid "Rehash=%u, " +msgstr "Rehash=%d, " + +#: src/hash.c:283 +#, fuzzy, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Collisions=%ld/%ld=%.0f%%" + +#: 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" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Évitement de récursion dans une règle implicite.\n" + +#: src/implicit.c:484 +#, fuzzy, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Motif trop long : « %.*s ».\n" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Essai du motif avec « %.*s » comme radical.\n" + +#: 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" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Rejet d'une dépendance implicite impossible « %s ».\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Essai de la dépendance de règle « %s ».\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Essai de la dépendance implicite « %s ».\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Dépendance trouvée « %s » comme VPATH « %s »\n" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Impossible de créer un fichier temporaire\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (core dump créé)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (ignorée)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s : %s] Erreur %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Attente des tâches non terminées...." + +#: 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" + +#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644 +#, c-format +msgid " (remote)" +msgstr " (distant)" + +#: src/job.c:898 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Récolte du processus fils gagnant %p PID %s %s\n" + +#: src/job.c:899 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Récolte du processus fils perdant %p PID %s %s\n" + +#: src/job.c:950 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Nettoyage du fichier de commande temporaire %s\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Jeton obtenu pour le processus fils %p (%s).\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s : la cible « %s » n'existe pas" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s : mise à jour de la cible « %s » causée par : %s" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "impossible d'imposer des limites de charge : " + +#: 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" + +#: 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 " +"stdout\n" + +#: 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 " +"stderr\n" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Impossible de restaurer stdin\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Impossible de restaurer stdout\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Impossible de restaurer stderr\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe : l'espace d'environnement est peut-être épuisé" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL a été modifié (de « %s » à « %s »)\n" + +#: 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" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Contenu du fichier de commande :\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Contenu du fichier 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 (ligne %d) Mauvais contexte du shell (!unixy && !batch_mode_shell)\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Nom du symbole absent pour l'opération « load » : %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Chargement du symbole %s à partir de %s\n" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Options :\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoré pour compatibilité.\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Fabriquer toutes les cibles sans condition.\n" + +#: 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 " +"action.\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Afficher beaucoup d'informations de débogage.\n" + +#: 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" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Les variables d'environment sont prioritaires " +"sur les makefiles.\n" + +#: src/main.c:350 +#, fuzzy +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=CHAINE Évaluer la CHAÎNE comme une instruction de " +"makefile.\n" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FICHIER, --file=FICHIER, --makefile=FICHIER\n" +" Lire le FICHIER comme un makefile.\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Afficher ce message et quitter.\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Ignorer les erreurs venant des recettes.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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 " +"liens symboliques et la cible.\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'exécuter aucune recette ; seulement les " +"afficher.\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 FICHIER, --old-file=FICHIER, --assume-old=FICHIER\n" +" Considérer le FICHIER comme étant très ancien " +"et ne pas le refabriquer.\n" + +#: 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 " +"par TYPE.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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 " +"internes.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr " --trace Afficher les traces mémoire.\n" + +#: 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 " +"quitter.\n" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Afficher le répertoire courant.\n" + +#: 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" + +#: 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 " +"nouveau.\n" + +#: 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" + +#: 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" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "niveau de débogage inconnu « %s »" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "type de output-sync « %s » inconnu" + +#: 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" + +#: 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" +"Filtre d'exception non pris en charge appelé depuis le programme %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 "Violation d'accès : opération d'écriture à l'adresse 0x%p\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/main.c:1609 +#, c-format +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." + +#: 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." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefile depuis l'entrée standard spécifié deux fois." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (fichier temporaire)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (fichier temporaire)" + +#: 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 " +"plateforme." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "On revient en mode monotâche (-j1)." + +#: 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." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Mise à jour des makefiles....\n" + +#: 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" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Échec de refabrication du makefile « %s »." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Le makefile inclus « %s » est introuvable." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Le makefile « %s » est introuvable" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Impossible de revenir dans le répertoire d'origine." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Réexécution[%u] :" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (fichier temporaire) :" + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL contient plus d'une cible" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Pas de cible" + +#: 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" + +#: 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." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Utilisation : %s [options] [cible] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Ce programme est construit pour %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Ce programme est construit pour %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "Signaler les anomalies à .\n" + +#: 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" + +#: 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" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sConstruit pour %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sConstruit pour %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLicence GPLv3+ : GNU GPL version 3 ou ultérieure \n" +"%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" + +#: 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" + +#: 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" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Accès initialisé" + +#: src/misc.c:743 +msgid "User access" +msgstr "Accès utilisateur" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Accès de Make" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Accès des fils" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s : on entre dans un répertoire inconnu\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s : on quitte un répertoire inconnu\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s : on entre dans le répertoire « %s »\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s : on quitte le répertoire « %s »\n" + +#: 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" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u] : on quitte un répertoire inconnu\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u] : on entre dans le répertoire « %s »\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u] : on quitte le répertoire « %s »\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "erreur d'écriture : stdout" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Arrêt.\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[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" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "duplication d'un tube pour les tâches" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "initialisation du tube du serveur de tâches" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "erreur interne : chaîne --jobserver-auth incorrecte « %s »" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "client Jobserver (fds %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "pipeline du serveur de tâches" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "écriture vers le serveur de tâches" + +#: src/posixos.c:300 +#, c-format +msgid "job server shut down" +msgstr "" + +#: src/posixos.c:303 +msgid "pselect jobs pipe" +msgstr "pselect du tube de tâches" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "lecture du tube des processus" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Lecture des makefiles...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Lecture du makefile « %s »" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (pas d'objectif par défaut)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (chemin de recherche)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (peu importe)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (pas de remplacement du ~)" + +#: 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" + +#: 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" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "syntaxe incorrecte dans la condition" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s : echec du chargement" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "La recette commence avant la première cible" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "règle manquante avant la recette" + +#: 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 ?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "séparateur manquant" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "motif de cible manquant" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "motifs de cible multiples" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "le motif de cible ne contient pas « %% »" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "« endif » manquant" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "nom de variable vide" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "texte superflu après la directive « define »" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "« endef » manquant, « define » non terminé" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "texte superflu après la directive « endef »" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "texte superflu après la directive « %s »" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "« %s » superflu" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "un seul « else » par condition" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Définition malformée de variable spécifique à une cible" + +#: 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" + +#: 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 "mélange de règles implicites et statiques pour le motif" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "mélange de règles implicites et normales" + +#: 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" + +#: 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 ::" + +#: 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." + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "avertissement : surchargement de la recette pour la cible « %s »" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "avertissement : ancienne recette ignorée pour la cible « %s »" + +#: 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" + +#: 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 »" + +#: 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é" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "rien à faire pour « %s »." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "« %s » est à jour." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Élagage du fichier « %s ».\n" + +#: 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" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sAucune règle pour fabriquer la cible « %s »%s" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Étude du fichier cible « %s ».\n" + +#: 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" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Le fichier « %s » a déjà été étudié.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Mise à jour du fichier « %s » en cours.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Fin de la mise à jour du fichier « %s ».\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Le fichier « %s » n'existe pas.\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Utilisation de la recette par défaut pour « %s ».\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Dépendance circulaire %s <- %s abandonnée." + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Fin des dépendances du fichier cible « %s ».\n" + +#: 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" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Abandon du fichier cible « %s ».\n" + +#: 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." + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Inutile de refabriquer la cible « %s »" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr " ; utilisation du nom VPATH « %s »" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Il faut refabriquer la cible « %s ».\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " On ignore le nom VPATH « %s ».\n" + +#: 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" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Échec de refabrication du fichier cible « %s ».\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Refabrication réussie du fichier cible « %s ».\n" + +#: 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" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Utilisation des commandes par défaut pour « %s ».\n" + +#: 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 " +"futur" + +#: 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" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "« customs » n'exportera pas : %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" +"# Règles implicites" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Pas de règle implicite." + +#: src/rule.c:548 +#, fuzzy, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u règles implicites, %u" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ANOMALIE : num_pattern_rules est faux ! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "signal inconnu" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Raccroche" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Interrompt" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Quitte" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Instruction non admise" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Point de trace/arrêt" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Annulé" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "Appel IOT" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "Appel EMT" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Exception en virgule flottante" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Tué" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Erreur de bus" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Erreur de segmentation" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Mauvais appel système" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Tube cassé" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Alarme" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Terminé" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Signal utilisateur 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Signal utilisateur 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Processus fils terminé" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Coupure d'alimentation" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Arrêté" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Arrêté (entrée tty)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Arrêté (sortie tty)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Arrêté (signal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Limite du temps CPU dépassée" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Limite de taille de fichier dépassée" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Compteur virtuel expiré" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Compteur de profiling expiré" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Fenêtre modifiée" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Reprise" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Condition d'E/S urgente" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "E/S possible" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Ressource perdue" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Signal de danger" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Demande d'informations" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Coprocesseur en virgule flottante non disponible" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s pas de tampons 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 utilisé : %lu (%lu) / chaînes = %lu / espace = %lu o / moy = %lu " +"o\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 tampon courant : taille = %hu o / utilisé = %hu o / nombre = %hu / moy = " +"%hu o\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# stats des tables de hachage :\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automatique" + +#: src/variable.c:1656 +msgid "default" +msgstr "défaut" + +#: src/variable.c:1659 +msgid "environment" +msgstr "environnement" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "environnement avec l'option -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "ligne de commande" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "directive « override »" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (depuis « %s », ligne %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# stats des tables de hachage de la variable « set » :\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variables\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valeurs de variable spécifiques au motif" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# pas de valeurs de variable spécifiques au motif" + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valeurs de variable spécifiques au motif" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "avertissement : variable « %.*s » indéfinie" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() a échoué avec %d\n" + +#: src/vmsjobs.c:244 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-attention, vous pourriez avoir besoin de réactiver le traitement de CTRL-Y " +"par DCL.\n" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "COMMANDE CD INTERNE %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 "Sortie ajoutée à %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Ajoute %.*s et nettoie\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Exécution de %s à la place\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Chemins de recherche VPATH\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Aucun chemin de recherche « vpath »." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u chemins de recherche « vpath ».\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Aucun chemin de recherche général (variable « VPATH »)." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Chemin de recherche général (variable « VPATH ») :\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Nombre de clients jobserver limités à %d\n" + +#: 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)" + +#: 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) " + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "client jobserver (semaphore %s)\n" + +#: 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)" + +#: 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)" + +#~ 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é" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] Erreur 0x%x%s" + +#~ msgid "%s[%s] %s%s%s" +#~ msgstr "%s[%s] %s%s%s" + +#~ msgid "dup jobserver" +#~ msgstr "duplication du serveur de tâches" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "AVERTISSEMENT : redirection vide\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "erreur interne : « %s » command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "COMMANDE INTERNE [%s][%s]\n" + +#~ msgid "BUILTIN ECHO %s->%s\n" +#~ msgstr "COMMANDE ECHO INTERNE %s->%s\n" + +#~ msgid "Unknown builtin command '%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" + +#~ msgid "Error, empty command\n" +#~ msgstr "Erreur, commande vide\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Entrée redirigée depuis %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Erreur redirigée vers %s\n" + +#~ msgid "Redirected output to %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" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "erreur interne : options --jobserver-fds multiples" + +#~ msgid "virtual memory exhausted" +#~ msgstr "mémoire virtuelle épuisée" + +#~ msgid "write error" +#~ 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 » !" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Erreur 0x%x (ignorée)" + +#~ msgid "[%s] Error %d (ignored)" +#~ 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" + +#~ msgid "Invoking builtin recipe to update target `%s'.\n" +#~ msgstr "" +#~ "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" + +#~ msgid "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# stats des tables de hachage strcache :\n" +#~ "# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() n'a pas pu lancer de processus (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 "" +#~ "%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" + +#~ msgid "extraneous `endef'" +#~ msgstr "« endef » superflu" + +#~ msgid "empty `override' directive" +#~ msgstr "directive « override » vide" + +#~ msgid "invalid `override' directive" +#~ 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." + +#~ msgid "Resetting make for single job mode." +#~ 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" + +#~ 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" + +#~ msgid "no file name for `%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" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Pas de fichiers." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u fichiers dans %u tables de hachage.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# moyenne de %.3f fichiers par table, maximum de %u fichiers dans une " +#~ "table.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "RÉPERTOIRE" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ 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" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "" +#~ "Les variables d'environnement écrasent celles définies dans les makefiles" + +#~ msgid "FILE" +#~ msgstr "FICHIER" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Lit FICHIER en tant que makefile" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ 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" + +#~ msgid "Don't actually run any commands; just print them" +#~ 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" + +#~ msgid "Don't echo commands" +#~ msgstr "N'affiche pas les commandes" + +#~ msgid "Turns off -k" +#~ msgstr "Désactive -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Considère FILE comme étant infiniment récent" + +#~ msgid "Entering" +#~ msgstr "Entre dans" + +#~ msgid "Leaving" +#~ msgstr "Quitte" + +#~ msgid "# No variables." +#~ msgstr "# Pas de variables." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# moyenne de %.1f variables par table, maximum de %u dans une table.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# moyenne de %d.%d variables par table, maximum de %u dans une table.\n" + +#~ msgid "Error in lbr$ini_control, %d\n" +#~ 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" + +#~ msgid "Error getting module info, %d\n" +#~ msgstr "Erreur lors de l'obtention des informations du module, %d\n" + +#~ msgid "touch: " +#~ msgstr "touch: " + +#~ msgid " not" +#~ msgstr " non" + +#~ msgid "# Last modified %.24s (%0lx)\n" +#~ msgstr "# Dernière modification %.24s (%0lx)\n" + +#~ msgid "undefined" +#~ msgstr "indéfini" + +#~ msgid "file" +#~ msgstr "fichier" + +#~ msgid "environment override" +#~ msgstr "écrasement par l'environnement" + +#~ msgid "override" +#~ msgstr "écrasement" + +#~ msgid "the `word' function takes a one-origin index argument" +#~ msgstr "la fonction `word' prend un argument d'index à une seule origine" + +#~ msgid "implicit" +#~ msgstr "dépendance implicite" + +#~ msgid "rule" +#~ 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" + +#~ msgid "intermediate" +#~ msgstr "intermédiaire" + +#~ msgid "Unknown%s job %d" +#~ msgstr "Tâche%s inconnue %d" + +#~ msgid " remote" +#~ msgstr " distante" + +#~ msgid "%s finished." +#~ msgstr "%s terminée." + +#~ msgid "losing" +#~ msgstr "perdant" + +#~ msgid "winning" +#~ msgstr "gagnant" + +#~ msgid "%sGNU Make version %s" +#~ msgstr "%sGNU Make version %s" + +#~ msgid "Unknown error 12345678901234567890" +#~ msgstr "Erreur inconnue 12345678901234567890" + +#~ msgid "User" +#~ msgstr "utilisateur" + +#~ msgid "Make" +#~ msgstr "make" + +#~ msgid "Child" +#~ msgstr "enfant" + +#~ msgid "Dependency `%s' does not exist.\n" +#~ msgstr "La dépendance `%s' n'existe pas.\n" + +#~ msgid "newer" +#~ 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." + +#~ msgid "exporting: " +#~ msgstr "exportation : " + +#~ msgid "exporting: %s" +#~ msgstr "exportation : %s" + +#~ msgid "Job exported to %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" + +#~ msgid "1-minute: %f " +#~ msgstr "1 minute : %f " + +#~ msgid "5-minute: %f " +#~ msgstr "5 minutes : %f " + +#~ msgid "15-minute: %f " +#~ 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" + +#~ msgid "option %c\n" +#~ msgstr "option %c\n" + +#~ msgid "option a\n" +#~ msgstr "option a\n" + +#~ msgid "option b\n" +#~ msgstr "option b\n" + +#~ msgid "option c with value `%s'\n" +#~ 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" + +#~ msgid "non-option ARGV-elements: " +#~ 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" + +#~ msgid "%s: unknown signal" +#~ msgstr "%s : signal inconnu" + +#~ msgid "Signal 12345678901234567890" +#~ msgstr "Signal 12345678901234567890" + +#~ msgid "Signal %d" +#~ msgstr "Signal %d" diff --git a/third_party/make/po/ga.gmo b/third_party/make/po/ga.gmo new file mode 100644 index 0000000000000000000000000000000000000000..c6dbd0f5b6b72db5213cfb90d793ee60dcaf4bfa GIT binary patch literal 43490 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, 2005, 2017. +# +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: 2017-01-09 16:02-0500\n" +"Last-Translator: Kevin Patrick Scannell \n" +"Language-Team: Irish \n" +"Language: ga\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 "rinneadh iarracht ar ghné gan tacaíocht a úsáid: '%s'" + +#: src/ar.c:123 +#, c-format +msgid "touch archive member is not available on VMS" +msgstr "ní féidir 'touch' a dhéanamh ar bhall de chartlann ar VMS" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Níl an chartlann '%s' ann" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: Níl '%s' ina cartlann bhailí" + +#: 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'" + +#: src/ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: Tháinig droch-chód ar ais ó ar_member_touch ar '%s'" + +#: 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 eolas faoin mhodúl a fháil, stádas = %d" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "theip ar lbr$ini_control le stádas = %d" + +#: 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 stádas " +"baill %d" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (seans go dteascfar an t-ainm)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Dáta %s" + +#: 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" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "An iomarca línte san oideas (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Briseadh.\n" + +#: src/commands.c:628 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Seans gur ball bréige é '%s'; níor scriosadh é" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Seans gur ball bréige é '%s'; níor scriosadh é" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Comhad '%s' á scriosadh" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Comhad '%s' á scriosadh" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# oideas le rith" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (insuite):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (ó '%s', líne %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Comhadlanna\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: níorbh fhéidir é a stat.\n" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "# %s (eochair %s, mtime %I64u): níorbh fhéidir é a oscailt.\n" + +#: 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íorbh fhéidir é a oscailt.\n" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (eochair %s, mtime %I64u): " + +#: 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]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (gléas %ld, i-nód %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Níl" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " comhad, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "níl" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " rudaí neamhfhéideartha" + +#: src/dir.c:1154 +msgid " so far." +msgstr " go dtí seo." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " rudaí neamhfhéideartha i %lu comhadlann.\n" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Déanann an athróg athchúrsach '%s' tagairt di féin (ar deireadh)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "tagairt d'athróg gan chríochnú" + +#: src/file.c:278 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Sonraíodh oideas le haghaidh comhaid '%s' ag %s:%lu," + +#: src/file.c:283 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Aimsíodh oideas le haghaidh '%s' trí chuardach ar rialacha intuigthe," + +#: 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'." + +#: 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 an oideas le haghaidh '%s'; úsáidfear an ceann le " +"haghaidh '%s' ina ionad." + +#: 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'" + +#: 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'" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Comhad idirmheánach '%s' á scriosadh" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Comhaid idirmheánacha á mbaint...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "An t-am anois" + +#: 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" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Ní sprioc é:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Comhad luachmhar (réamhriachtanas de .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Sprioc bhréige (réamhriachtanas de .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Sprioc líne na n-orduithe." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Makefile réamhshocraithe, nó ó MAKEFILES, nó -include/sinclude." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Riail insuite" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Rinneadh cuardach ar rialacha intuigthe." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Ní dhearnadh cuardach ar rialacha intuigthe." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Stoc patrúin intuigthe/statach: '%s'\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Tá an comhad ina réamhriachtanas idirmheánach." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Déanann sé freisin:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Níor seiceáladh an t-am mionathraithe riamh." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Níl a leithéid de chomhad ann." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Tá an comhad an-aosta." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Athraithe %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Nuashonraíodh an comhad." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Níor nuashonraíodh an comhad." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Oideas á rith faoi láthair (IS FABHT É SEO)." + +#: src/file.c:1065 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Oideas spleáchais á rith (IS FABHT É SEO)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# D'éirigh leis an nuashonrú." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Tá gá le nuashonrú (-q sainithe)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Theip ar an nuashonrú." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Luach neamhbhailí sa bhall 'command_state'!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Comhaid" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# comhaid hais-tábla stait:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Níl réimse '%s' i dtaisce: %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "neamhuimhriúil an chéad argóint le feidhm 'word'" + +#: src/function.c:799 +#, c-format +msgid "first argument to 'word' function must be greater than 0" +msgstr "caithfidh an chéad argóint le feidhm 'word' a bheith deimhneach" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "neamhuimhriúil an chéad argóint le feidhm 'wordlist'" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "neamhuimhriúil an dara hargóint le feidhm 'wordlist'" + +#: src/function.c:1533 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: theip ar DuplicateHandle(In) (e=%ld)\n" + +#: src/function.c:1557 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: theip ar DuplicateHandle(Earr) (e=%ld)\n" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "Theip ar CreatePipe() (e=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): theip ar process_init_fd()\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Baisc-chomhad sealadach %s á ghlanadh\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "comhad: ainm comhaid ar iarraidh" + +#: src/function.c:2234 src/function.c:2265 +#, c-format +msgid "open: %s: %s" +msgstr "oscailt: %s: %s" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "scríobh: %s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "dúnadh: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "comhad: an iomarca argóintí" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "léamh: %s: %s" + +#: src/function.c:2290 +#, c-format +msgid "file: invalid file operation: %s" +msgstr "comhad: oibríocht neamhbhailí ar chomhad: %s" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "easpa argóintí (%d) ar fheidhm '%s'" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "níl feidhm '%s' ar fáil ar an chóras seo" + +#: 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" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Tá ainm na feidhme folamh" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Tá ainm na feidhme neamhbhailí: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Tá ainm na feidhme rófhada: %s" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "Íosmhéid argóintí neamhbhailí (%u) d'fheidhm %s" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "Uasmhéid argóintí neamhbhailí (%u) d'fheidhm %s" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: Tá an rogha '%s' débhríoch\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: rogha anaithnid '--%s'\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: rogha anaithnid '%c%s'\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: rogha neamhcheadaithe -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: rogha neamhbhailí -- %c\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: '%s' á leathnú\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: '%s' á luacháil\n" + +#: src/hash.c:50 +#, c-format +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" + +#: src/hash.c:280 +#, fuzzy, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Lód=%ld/%ld=%.0f%%, " + +#: src/hash.c:282 +#, fuzzy, c-format +msgid "Rehash=%u, " +msgstr "Ath-haiseáil=%d, " + +#: 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 lorg riail intuigthe le haghaidh '%s'.\n" + +#: src/implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Ag lorg riail intuigthe le haghaidh bhall cartlainne '%s'.\n" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Athchúrsáil de bharr rialacha intuigthe á seachaint.\n" + +#: 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" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Réamhriachtanas neamhfhéideartha rialach '%s' á dhiúltú.\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Réamhriachtanas intuigthe neamhfhéideartha '%s' á dhiúltú.\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Ag baint triail as réamhriachtanas rialach '%s'.\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Ag baint triail as réamhriachtanas intuigthe '%s'.\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Aimsíodh réamhriachtanas '%s' mar VPATH '%s'\n" + +#: src/implicit.c:786 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Ag lorg riail le comhad idirmheánach '%s'.\n" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Ní féidir comhad sealadach a chruthú\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (córdhumpa)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (rinneadh neamhshuim air)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Earráid %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Ag fanacht le jabanna neamhchríochnaithe..." + +#: src/job.c:704 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Mac beo %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 " (i gcéin)" + +#: src/job.c:898 +#, c-format +msgid "Reaping winning child %p PID %s %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" + +#: src/job.c:950 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Baisc-chomhad sealadach %s á ghlanadh\n" + +#: src/job.c:956 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Níorbh fhéidir baisc-chomhad sealadach %s a ghlanadh (%d)\n" + +#: src/job.c:1071 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Mac %p PID %s%s á bhaint ón slabhra.\n" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Saoradh ceadchomhartha le haghaidh mac %p (%s).\n" + +#: 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" + +#: 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ú teipthe\n" + +#: src/job.c:1642 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Mac %p (%s) PID %s%s á chur ar an slabhra.\n" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Fuarthas ceadchomhartha le haghaidh mac %p (%s).\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: níl sprioc '%s' ann" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: nuashonrú sprioc '%s' mar gheall ar: %s" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "ní féidir srian lóid a chur i bhfeidhm: " + +#: 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" + +#: 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" + +#: 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 stderr a chóipeáil\n" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Níorbh fhéidir stdin a athchóiriú\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Níorbh fhéidir stdout a athchóiriú\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Níorbh fhéidir stderr a athchóiriú\n" + +#: src/job.c:2520 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "bhain make mac le PID %s, ag feitheamh le PID %s fós\n" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: seans nach bhfuil aon spás fágtha sa timpeallacht" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "Athraíodh $SHELL (ba '%s' é, ach is '%s' é anois)\n" + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Baisc-chomhad sealadach %s á chruthú\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Níorbh fhéidir an tábla siombailí comhchoiteann a oscailt: %s" + +#: src/load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Níl an réad lódáilte %s comhoiriúnach leis an GPL" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Níorbh fhéidir siombail %s a lódáil ó %s: %s" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Tá ainm na siombaile le lódáil folamh: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Siombail %s á lódáil ó %s\n" + +#: src/load.c:256 +#, c-format +msgid "The 'load' operation is not supported on this platform." +msgstr "Níl an oibríocht 'load' ar fáil ar an gcóras seo." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Roghanna:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Déan neamhshuim (comhoiriúnacht)\n" + +#: 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" + +#: 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" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Taispeáin go leor eolas dífhabhtaithe.\n" + +#: 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" + +#: 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" + +#: src/main.c:350 +#, fuzzy +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=TEAGHRÁN Luacháil TEAGHRÁN mar ráiteas makefile.\n" + +#: 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" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Taispeáin an chabhair seo agus scoir.\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Déan neamhshuim ar earráidí ó oidis.\n" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I COMHADLANN, --include-dir=COMHADLANN\n" +" Cuardaigh i gCOMHADLANN ar makefileanna " +"breise.\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] Ceadaigh N jab le chéile; éigríoch mura " +"gceaptar arg.\n" + +#: 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" + +#: 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" + +#: 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 " +"nasc\n" +" siombalach nó ar an sprioc.\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á rith aon oideas; taispeáin na orduithe " +"amháin.\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 COMHAD, --old-file=COMHAD, --assume-old=COMHAD\n" +" Caith le COMHAD mar cheann cianaosta; ná " +"hathdhéan é.\n" + +#: 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" + +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Ná rith aon oideas; stádas scortha = 0 má tá " +"sé cothrom le dáta.\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\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" + +#: 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" + +#: 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" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr " --trace Taispeáin faisnéis dífhabhtaithe.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Taispeáin an chomhadlann reatha.\n" + +#: 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 " +"hintuigthe.\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 COMHAD, --what-if=COMHAD, --new-file=COMHAD, --assume-new=COMHAD\n" +" Caith le COMHAD mar cheann úrnua (go " +"héigríoch).\n" + +#: 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" + +#: 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" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "leibhéal dífhabhtaithe anaithnid '%s'" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "cineál anaithnid '%s' le haghaidh output-sync" + +#: 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%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" +"Cuireadh glaoch ar scagaire eisceachta gan láimhseáil ón chlár %s\n" +"CódEisceachta = %lx\n" +"BratachaEisceachta = %lx\n" +"SeoladhEisceachta = 0x%p\n" + +#: src/main.c:864 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Sárú cearta rochtana: oibríocht scríofa ag seoladh 0x%p\n" + +#: src/main.c:865 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Sárú cearta rochtana: oibríocht léimh ag seoladh 0x%p\n" + +#: 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" + +#: src/main.c:1009 +#, 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" + +#: src/main.c:1609 +#, c-format +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"rabhadh: níl an jabfhreastalaí ar fáil: ag úsáid -j1. Cuir '+' leis an " +"máthair-riail." + +#: 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ú." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Sonraíodh Makefile ón ionchur caighdeánach faoi dhó." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (comhad sealadach)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (comhad sealadach)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Á athshocrú le haghaidh jabanna aonair (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "ní thacaítear le naisc shiombalacha: -L á dhíchumasú." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Makefileanna á nuashonrú....\n" + +#: src/main.c:2226 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Seans go lúbfar an Makefile '%s'; ní athdhéanfar é.\n" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Níorbh fhéidir makefile '%s' a athdhéanamh." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Níor aimsíodh makefile '%s' atá san áireamh." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Níor aimsíodh makefile '%s'" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Níorbh fhéidir filleadh ar an gcomhadlann roimhe seo." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Á rith arís[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (comhad sealadach): " + +#: 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" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +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" + +#: src/main.c:2586 +#, c-format +msgid "Updating goal targets....\n" +msgstr "Cinn sprice á nuashonrú....\n" + +#: src/main.c:2610 +#, c-format +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "rabhadh: Clog ar sceabha. Seans nár chríochnaigh an tógáil." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Úsáid: %s [roghanna] [sprioc] ...\n" + +#: 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" + +#: 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" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "Seol tuairiscí fabhtanna chuig \n" + +#: src/main.c:2901 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "caithfidh tú teaghrán neamhfholamh a thabhairt mar argóint le '%s%s'" + +#: 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'" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sTógadh an clár seo le haghaidh %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sTógadh an clár seo le haghaidh %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sCeadúnas GPLv3+: GNU GPL leagan 3 nó níos déanaí \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" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Bunachar sonraí Make, priontáilte ar %s" + +#: 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" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Rochtain túsaithe" + +#: src/misc.c:743 +msgid "User access" +msgstr "Rochtain úsáideora" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Rochtain make" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Rochtain mic" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Ag dul isteach i gcomhadlann anaithnid\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Ag dul amach as comhadlann anaithnid\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Ag dul isteach i gcomhadlann '%s'\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Ag dul amach as comhadlann '%s'\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Ag dul isteach i gcomhadlann anaithnid\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Ag dul amach as comhadlann anaithnid\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Ag dul isteach i gcomhadlann '%s'\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Ag dul amach as comhadlann '%s'\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "earráid scríofa: stdout" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Stop.\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 "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ú" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "píopa na jabanna á chóipeáil" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "píopa an jabfhreastalaí á thúsú" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "earráid inmheánach: teaghrán neamhbhailí --jobserver-auth '%s'" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Cliant jabfhreastalaí (fds %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "píblíne an jabfhreastalaí" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "scríobh jabfhreastalaí" + +#: src/posixos.c:300 +#, c-format +msgid "job server shut down" +msgstr "" + +#: src/posixos.c:303 +msgid "pselect jobs pipe" +msgstr "pselect píopa na jabanna" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "léadh píopa na jabanna" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Makefile-anna á léamh...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Makefile '%s' á léamh" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (gan ceann sprice réamhshocraithe)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (conair chuardaigh)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (is cuma)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ná leathnaigh ~)" + +#: src/read.c:655 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "Ag dul thar BOM UTF-8 i Makefile '%s'\n" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Ag dul thar BOM UTF-8 i maolán Makefile\n" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "comhréir neamhbhailí i gcoinníollach" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: theip ar lódáil" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "tosaíonn an t-oideas roimh an chéad sprioc" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "riail ar iarraidh roimh an oideas" + +#: src/read.c:1136 +#, c-format +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr "deighilteoir ar iarraidh (ar mhian leat TÁB in ionad ocht spás?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "deighilteoir ar iarraidh" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "patrún sprice ar iarraidh" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "ilphatrúin sprice" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "níl aon '%%' sa phatrún sprice" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "'endif' ar iarraidh" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "ainm folamh athróige" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "téacs breise i ndiaidh treorach 'define'" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "'endef' ar iarraidh, 'define' gan chríochnú" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "téacs breise i ndiaidh treorach 'endef'" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "téacs breise i ndiaidh treorach '%s'" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "'%s' breise" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "ní cheadaítear ach aon 'else' amháin le gach ráiteas coinníollach" + +#: 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)" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "ní féidir réamhriachtanais a shonrú in oidis" + +#: 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" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "rialacha intuigthe agus gnáthrialacha measctha le chéile" + +#: src/read.c:2107 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "níl sprioc '%s' comhoiriúnach leis an bpatrún sprice" + +#: src/read.c:2122 src/read.c:2168 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "tá iontrálacha : agus :: sa chomhad sprice '%s'" + +#: src/read.c:2128 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "tá an sprioc '%s' ann níos mó ná uair amháin sa riail chéanna" + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "rabhadh: oideas le haghaidh sprioc '%s' á shárú" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "rabhadh: ag déanamh neamhshuim ar sheanoideas le haghaidh sprioc '%s'" + +#: src/read.c:2254 +#, c-format +msgid "*** mixed implicit and normal rules: deprecated syntax" +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ú" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Níl faic le déanamh i gcomhair '%s'." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "Tá '%s' cothrom le dáta." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Comhad '%s' á bhearradh.\n" + +#: src/remake.c:389 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sNíl aon riail chun sprioc '%s' a dhéanamh, rud a theastaíonn '%s'%s" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sNíl aon riail chun sprioc '%s' a dhéanamh%s" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Comhad sprice '%s' á scrúdú.\n" + +#: src/remake.c:432 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "" +"Rinneadh iarracht comhad '%s' a nuashonrú le déanaí, ach theip ar an " +"iarracht.\n" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Rinneadh scrúdú ar chomhad '%s' cheana.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Comhad '%s' á nuashonrú fós.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Nuashonraíodh comhad '%s'.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Níl comhad '%s' ann.\n" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "*** Rabhadh: Stampa ama ardtaifidh ar comhad .LOW_RESOLUTION_TIME `%s'" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Ag baint úsáid as oideas réamhshocraithe le haghaidh '%s'.\n" + +#: 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." + +#: 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" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Réamhriachtanais '%s' á ndéanamh anois.\n" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Comhad sprice '%s' á thréigean.\n" + +#: src/remake.c:699 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Ní dhearna an sprioc '%s' arís mar gheall ar earráidí." + +#: src/remake.c:751 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Is réamhriachtanas ord-amháin é '%s' le haghaidh sprice '%s'.\n" + +#: src/remake.c:756 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Níl réamhriachtanas '%s' den sprioc '%s' ann.\n" + +#: src/remake.c:761 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Tá réamhriachtanas '%s' níos nuaí ná sprioc '%s'.\n" + +#: src/remake.c:764 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Tá réamhriachtanas '%s' níos sine ná sprioc '%s'.\n" + +#: src/remake.c:782 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Is sprioc le dhá idirstad é '%s' agus níl aon réamhriachtanas aice.\n" + +#: src/remake.c:789 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" +"Níl aon oideas ann le haghaidh '%s' agus níor athraigh aon réamhriachtanas.\n" + +#: src/remake.c:794 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "'%s' á dhéanamh mar gheall ar bhratach --always-make.\n" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Ní gá an sprioc '%s' a athdhéanamh" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; ag baint úsáid as ainm VPATH '%s'" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Caithfidh an sprioc '%s' a athdhéanamh.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ag déanamh neamhshuim ar ainm VPATH '%s'.\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Oideas le haghaidh '%s' á rith.\n" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Níorbh fhéidir an comhad sprice '%s' a athdhéanamh.\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "D'éirigh linn an comhad sprice '%s' a athdhéanamh.\n" + +#: src/remake.c:852 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Ní mór comhad sprice '%s' a athdhéanamh le rogha -q.\n" + +#: 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" + +#: src/remake.c:1422 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Rabhadh: Tá am athraithe an chomhaid '%s' %s soicind sa todhchaí" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "Ní patrún é eilimint .LIBPATTERNS '%s'" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %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 "" + +#: src/rule.c:530 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Rialacha Intuigthe" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Níl aon riail intuigthe." + +#: src/rule.c:548 +#, fuzzy, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u riail intuigthe, %u" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FABHT: num_pattern_rules mícheart! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "comhartha anaithnid" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Croch suas" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Idirbhriseadh" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Scoir" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Treoir Neamhcheadaithe" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Rianaigh/brisphointe" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Tobscortha" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "Gaiste IOT" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "Gaiste EMT" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Eisceacht snámhphointe" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Maraithe" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Busearráid" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Fabht deighilte" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Drochghlao ar an gcóras" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Píopa briste" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Clog aláraim" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Scortha" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Comhartha saincheaptha 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Comhartha saincheaptha 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Scoir an mhacphróiseas" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Cliseadh cumhachta" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Stoptha" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Stoptha (ionchur tty)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Stoptha (aschur tty)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Stoptha (comhartha)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Teorainn ama LAP sáraithe" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Uasmhéid na gcomhad sáraithe" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Am fíorúil caite" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Am próifíle caite" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Athraíodh an fhuinneog" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Leanta" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Staid phráinneach A/I" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "A/I indéanta" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Acmhainn caillte" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Comhartha guaise" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Iarratas ar eolas" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Níl comhphróiseálaí snámhphointe ar fáil" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Gan maoláin 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 maolán strcache: %lu (%lu) / teaghráin = %lu / stóras = %lu B / meán = " +"%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 maolán reatha: méid = %hu B / úsáidte = %hu B / líon = %hu / meán = %hu " +"B\n" + +#: src/strcache.c:319 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s eile úsáidte: iomlán = %lu B / líon = %lu / meán = %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 eile saor: iomlán = %lu B / uas = %lu B / íos = %lu B / meán = %hu B\n" + +#: 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" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# staitisticí an hais-tábla:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "uathoibríoch" + +#: src/variable.c:1656 +msgid "default" +msgstr "réamhshocraithe" + +#: src/variable.c:1659 +msgid "environment" +msgstr "timpeallacht" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "timpeallacht le -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "líne na n-orduithe" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "treoir 'override'" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (ó '%s', líne %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# athróg tacar hais-tábla stait:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Athróga\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Luachanna Athróige sainiúil don phatrún" + +#: 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." + +#: 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" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "rabhadh: athróg gan sainmhíniú '%.*s'" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "Theip ar sys$search() le stádas %d\n" + +#: 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" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "CD INSUITE %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 "Iarcheangail aschur le %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Iarcheangal %.*s agus glanadh\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s á rith ina áit\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Conairí Cuardaigh\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Níl aon chonair chuardaigh 'vpath' ann." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u conair chuardaigh 'vpath'.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Níl aon chonair ghinearálta chuardaigh (athróg 'VPATH') ann." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Conair ghinearálta chuardaigh (athróg 'VPATH'):\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Sliotáin an jabfhreastalaí teoranta do %d\n" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "séamafór an jabfhreastalaí á chruthú: (Earráid %ld: %s)" + +#: 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)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Cliant an jabfhreastalaí (séamafór %s)\n" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "séamafór an jabfhreastalaí a fhuascailt: (Earráid %ld: %s)" + +#: src/w32/w32os.c:194 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +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'!" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Earráid 0x%x (rinneadh neamhshuim air)" + +#~ msgid "*** [%s] Error 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" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "earráid inmheánach: roghanna --jobserver-fds iomadúla" + +#~ msgid "dup jobserver" +#~ 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 " +#~ "ann\n" +#~ "%sd'INDÍOLTACHT nó FEILIÚNACHT D'FHEIDHM AR LEITH.\n" + +#~ msgid "virtual memory exhausted" +#~ msgstr "cuimhne fhíorúil ídithe" + +#~ msgid "write error" +#~ msgstr "earráid sa scríobh" + +#~ msgid "extraneous `endef'" +#~ msgstr "`endef' breise" + +#~ msgid "empty `override' directive" +#~ msgstr "treoir `override' folamh" + +#~ msgid "invalid `override' directive" +#~ 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" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Rabhadh: Atreorú folamh\n" + +#~ msgid "internal error: `%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" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "INSUITE [%s][%s]\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "RM INSUITE %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Ordú anaithnid insuite '%s'\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Earráid, ordú folamh\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Atreoraíodh ionchur ó %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Atreoraíodh earráidí go %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Earráid le linn sceitheadh, %d\n" diff --git a/third_party/make/po/gl.gmo b/third_party/make/po/gl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..5f703eeb19b22fb5bfc7f40336576d2498405102 GIT binary patch literal 21543 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 H?lb=%6epck literal 0 HcmV?d00001 diff --git a/third_party/make/po/gl.po b/third_party/make/po/gl.po new file mode 100644 index 00000000000..52b0ede1286 --- /dev/null +++ b/third_party/make/po/gl.po @@ -0,0 +1,2664 @@ +# Galician translation of GNU make. +# This file is distributed under the same license as the make package. +# Copyright (C) 2000, 2002 Free Software Foundation, Inc. +# Copyright (C) 2012 Leandro Regueiro. +# +# Jacobo Tarrio , 2000, 2002. +# Leandro Regueiro , 2012. +# +# Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas +# colaborar connosco, podes atopar máis información en http://www.trasno.net +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.82\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\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 \n" +"Language-Team: Galician \n" +"Language: gl\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" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "tentouse usar unha característica non admitida: «%s»" + +#: 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" + +#: src/ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: O arquivo «%s» non existe" + +#: src/ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: «%s» non é un arquivo válido" + +#: 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»" + +#: 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»" + +#: 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" + +#: 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" + +#: 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»" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (o nome pode quedar 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 "" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Interrompido.\n" + +#: 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" + +#: 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" + +#: src/commands.c:646 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Eliminando o ficheiro «%s»" + +#: src/commands.c:648 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Eliminando o ficheiro «%s»" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (incorporadas):" + +#: src/commands.c:689 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (desde «%s», liña %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directorios\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +#, fuzzy +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (clave %s, mtime %d): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (dispositivo %d, inodo [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (dispositivo %ld, inodo %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Non" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " ficheiros, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "non" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " imposíbeis" + +#: src/dir.c:1154 +msgid " so far." +msgstr " ata aquí." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " imposíbeis en %lu directorios.\n" + +#: 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)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "referencia a variábel non rematada" + +#: src/file.c:278 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "" + +#: src/file.c:283 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" + +#: 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»." + +#: src/file.c:290 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" + +#: 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" + +#: 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" + +#: src/file.c:408 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Eliminando o ficheiro intermedio «%s»" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Retirando os ficheiros intermedios...\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: Marca de tempo fóra de rango; substituíndo %s" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Non é un obxectivo:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Ficheiro precioso (prerrequisito de .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Obxectivo falso (prerrequisito de .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Obxectivo da liña de ordes." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Un ficheiro de make por defecto, MAKEFILES, ou -include/sinclude." + +#: src/file.c:1029 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# Non hai regras implícitas." + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Fíxose a busca de regras implícitas." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Non se fixo a busca de regras implícitas." + +#: 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" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# O ficheiro é un prerrequisito intermedio." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Tamén se fai:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Nunca se comprobou o tempo de modificación." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# O ficheiro non existe." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# O ficheiro é moi antigo." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Última modificación: %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 non foi actualizado." + +#: 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 "# Actualizado con éxito." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Ten que ser actualizado (-q está definido)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Produciuse un erro ao actualizar." + +#: src/file.c:1086 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Valor non vá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 táboa hash de ficheiros:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: src/function.c:794 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "primeiro argumento da función «word» non numérico" + +#: 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" + +#: src/function.c:819 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "primeiro argumento da función «wordlist» non numérico" + +#: src/function.c:821 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "segundo argumento da función «wordlist» non numérico" + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "A chamada a CreatePipe() fallou (e=%ld)\n" + +#: 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" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Limpando o ficheiro de lotes temporal %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 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: src/function.c:2242 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "erro de escritura: %s" + +#: src/function.c:2245 src/function.c:2282 +#, fuzzy, c-format +msgid "close: %s: %s" +msgstr "%s%s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "" + +#: src/function.c:2277 +#, fuzzy, c-format +msgid "read: %s: %s" +msgstr "%s: %s" + +#: src/function.c:2290 +#, fuzzy, c-format +msgid "file: invalid file operation: %s" +msgstr "%s: opción incorrecta -- %c\n" + +#: 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»" + +#: src/function.c:2417 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "non implementada nesta plataforma: función «%s»" + +#: src/function.c:2483 +#, fuzzy, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "chamada á función «%s» non rematada: falta «%c»" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: 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»" + +#: 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»" + +#: src/getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: a opción «%s» é ambigua\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: opción «--%s» non recoñecida\n" + +#: src/getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: opción «%c%s» non recoñecida\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción inaceptábel -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción incorrecta -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: a opción «-W %s» é ambigua\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: 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" + +#: src/hash.c:280 +#, fuzzy, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Carga=%ld/%ld=%.0f%%, " + +#: src/hash.c:282 +#, fuzzy, c-format +msgid "Rehash=%u, " +msgstr "Rehash=%d, " + +#: src/hash.c:283 +#, fuzzy, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Colisións=%ld/%ld=%.0f%%" + +#: 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" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitando a recursión de regras implícitas.\n" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "" + +#: 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" + +#: src/implicit.c:717 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Rexeitando o prerrequisito imposíbel «%s».\n" + +#: src/implicit.c:718 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Rexeitando o prerrequisito implícito imposíbel «%s».\n" + +#: src/implicit.c:732 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Probando o prerrequisito «%s».\n" + +#: src/implicit.c:733 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Probando o prerrequisito implícito «%s».\n" + +#: 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" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Non foi posíbel crear un ficheiro temporal\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (memoria envorcada)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (ignorado)" + +#: src/job.c:557 src/job.c:1892 +#, fuzzy +msgid "" +msgstr " (incorporadas):" + +#: src/job.c:573 +#, fuzzy, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "*** [%s] Erro %d" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Agardando por traballos non rematados...." + +#: 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" + +#: 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 "Colleitando o proceso fillo gañador %p PID %s %s\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Contáronse %d argumentos no inicio que fallou\n" + +#: 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" + +#: 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" + +#: src/job.c:1902 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: O arquivo «%s» non existe" + +#: 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" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "non é posíbel impoñer un límite de carga: " + +#: src/job.c:2200 +#, c-format +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: src/job.c:2212 +#, c-format +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: src/job.c:2226 +#, c-format +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: 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" + +#: 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" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: 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" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: src/load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Opcións:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorado por compatibilidade.\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Facer todos os obxectivos incondicionalmente.\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORIO, --directory=DIRECTORIO\n" +" Cambiar ao DIRECTORIO antes de facer nada.\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Mostrar moita información de depuración.\n" + +#: 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" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" As variábei de ambiente substitúen aos " +"makefiles.\n" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: 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" +" Ler o FICHEIRO como makefile.\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Mostrar esta mensaxe e saír.\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIRECTORIO, --include-dir=DIRECTORIO\n" +" Buscar os makefiles incluídos\n" +" no DIRECTORIO.\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] Permitir N traballos á vez; infinitos sen\n" +" un argumento.\n" + +#: 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" + +#: 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" +" Non iniciar varios traballos con carga\n" +" superior a N.\n" + +#: src/main.c:369 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: src/main.c:371 +#, fuzzy +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" +" Non executar ningún comando; só amosalos.\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" +" Tratar o FICHEIRO como moi antigo e non " +"refacelo.\n" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: 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\n" +" Desactiva -k.\n" + +#: 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" + +#: src/main.c:397 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr "" +" -d Mostrar moita información de depuración.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Mostrar o directorio 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 Desactivar -w, incluso se se activou\n" +" implicitamente.\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" +" Tratar o FICHEIRO como infinitamente novo.\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Avisar cando se faga referencia a\n" +" unha variábel non definida.\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "a cadea baleira non é válida como nome de ficheiro" + +#: src/main.c:754 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "especificación de nivel de depuración descoñecido «%s»" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: 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" + +#: 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 excepcións non manexadas chamado desde o 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 "Violación de acceso: operación de escritura no enderezo 0x%p\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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." + +#: 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." + +#: 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." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (ficheiro temporal)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (ficheiro temporal)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Reiniciando para entrar no modo de traballo único (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Actualizando os ficheiros de make....\n" + +#: 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" + +#: src/main.c:2303 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Produciuse un erro ao refacer o ficheiro de make «%s»." + +#: 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»." + +#: src/main.c:2328 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "Non se atopou o ficheiro de make «%s»" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Non foi posíbel volver ao directorio orixinal." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Re-executando[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (ficheiro temporal)" + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Non hai obxectivos" + +#: 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" + +#: 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." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uso: %s [opcións] [obxectivo] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Este programa compilou para %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Este programa compilou para %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Envíe informes de fallo no programa a .\n" +"Envíe informes de fallo na tradución a .\n" + +#: 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" + +#: 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" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sCompilado para %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sCompilado para %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLicenza GPLv3+: GNU GPL versión 3 ou posterior \n" +"%sIsto é software libre: pode modificalo e redistribuílo.\n" +"%sNon hai NINGUNHA GARANTÍA, ata onde o permita a lei.\n" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Base de datos de Make, imprimida en %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Base de datos de Make rematada en %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Acceso inicializado" + +#: src/misc.c:743 +msgid "User access" +msgstr "Acceso de usuario" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Acceso de make" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Acceso de fillo" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Entrando nun directorio descoñecido\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Saíndo dun directorio descoñecido\n" + +#: src/output.c:102 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Entrando no directorio «%s»\n" + +#: src/output.c:104 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Saíndo do directorio «%s»\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Entrando nun directorio descoñecido\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Saíndo dun directorio descoñecido\n" + +#: src/output.c:113 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Entrando no directorio «%s»\n" + +#: src/output.c:115 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Saíndo do directorio «%s»\n" + +#: src/output.c:442 src/output.c:444 +#, fuzzy, c-format +msgid "write error: stdout" +msgstr "erro de escritura: %s" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Detido.\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 "" + +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "creando a canalización de traballos" + +#: src/posixos.c:98 src/posixos.c:251 +#, fuzzy +msgid "duping jobs pipe" +msgstr "creando a canalización de traballos" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "inicializar a canalización do servidor de traballos" + +#: 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»" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: src/posixos.c:138 +#, fuzzy +msgid "jobserver pipeline" +msgstr "inicializar a canalización do servidor de traballos" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "lectura da canalización de traballos" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Lendo os ficheiros de make...\n" + +#: src/read.c:336 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Lendo o ficheiro de make «%s»" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (non hai unha meta por defecto)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (ruta de busca)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (non importa)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (non hai expansión de ~)" + +#: src/read.c:655 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "sintaxe non válida no condicional" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: 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 +#, fuzzy, c-format +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (quixo dicir TAB no canto de 8 espazos?)" + +#: src/read.c:1138 +#, fuzzy, c-format +msgid "missing separator" +msgstr "falta un separador%s" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "falta un patrón obxectivo" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "patróns de obxectivo múltiples" + +#: src/read.c:1289 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "o patrón obxectivo non contén «%%»" + +#: src/read.c:1404 +#, fuzzy, c-format +msgid "missing 'endif'" +msgstr "falta «endif»" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "nome de variábel baleiro" + +#: src/read.c:1478 +#, fuzzy, c-format +msgid "extraneous text after 'define' directive" +msgstr "texto superfluo trala directiva «define»" + +#: src/read.c:1503 +#, fuzzy, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "falta «endef», «define» sen rematar" + +#: src/read.c:1531 +#, fuzzy, c-format +msgid "extraneous text after 'endef' directive" +msgstr "Texto superfluo trala directiva «endef»" + +#: src/read.c:1603 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "Texto superfluo trala directiva «%s»" + +#: src/read.c:1604 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "«%s» superfluo" + +#: src/read.c:1632 +#, fuzzy, c-format +msgid "only one 'else' per conditional" +msgstr "só un «else» por condicional" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Definición dunha variábel por obxectivo mal formada" + +#: 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 "regras de patrón implícitas e estáticas mesturadas" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "regras implícitas e normais mesturadas" + +#: 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" + +#: 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 ::" + +#: 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." + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "" + +#: src/read.c:2254 +#, fuzzy, c-format +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "regras implícitas e normais mesturadas" + +#: 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" + +#: src/remake.c:226 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "Non hai nada que facer para «%s»" + +#: src/remake.c:227 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "«%s» está actualizado." + +#: src/remake.c:323 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Podando o ficheiro «%s».\n" + +#: 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" + +#: 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" + +#: src/remake.c:425 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "Considerando o ficheiro obxectivo «%s».\n" + +#: 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" + +#: src/remake.c:444 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "O ficheiro «%s» xa fora considerado.\n" + +#: src/remake.c:454 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "Aínda se está actualizando o ficheiro «%s».\n" + +#: src/remake.c:457 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Rematouse de actualizar o ficheiro «%s».\n" + +#: src/remake.c:486 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "O ficheiro «%s» non existe.\n" + +#: src/remake.c:494 +#, fuzzy, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Aviso: o ficheiro «%s» de .LOW_RESOLUTION_TIME ten unha marca de tempo " +"de alta resolución" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Usando as ordes por defecto para «%s».\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "A dependencia circular %s <- %s foi eliminada." + +#: 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" + +#: 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" + +#: src/remake.c:694 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Abandonando no ficheiro obxectivo «%s».\n" + +#: 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." + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:789 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" + +#: 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" + +#: src/remake.c:802 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Non é preciso refacer o obxectivo «%s»" + +#: src/remake.c:804 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr "; usando o nome de VPATH «%s»" + +#: src/remake.c:824 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "Debe refacerse o obxectivo «%s».\n" + +#: src/remake.c:830 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ignorando o nome VPATH «%s».\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:1047 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Usando as ordes por defecto para «%s».\n" + +#: 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" + +#: 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" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "A Aduana non exporta: %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" +"# Non hai regras implícitas." + +#: src/rule.c:548 +#, fuzzy, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u regras implícitas, %u" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FALLO: num_pattern_rules é incorrecto! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "sinal descoñecido" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Colgar" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Interrompido" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Saír" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Instrución inaceptábel" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Trampa de trazado/punto de detención" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Abortado" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "Trampa de IOT" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "Trampa EMT" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Excepción de coma flotante" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Matado" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Erro do bus" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Fallo de segmento" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Chamada ao sistema incorrecta" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Canalización rota" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Temporizador" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Terminado" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Sinal definido polo usuario 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Sinal definido polo usuario 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "O proceso fillo saíu" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Fallo de subministración eléctrica" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Detido" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Detido (entrada de consola)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Detido (saída de consola)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Detido (sinal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Excedeuse o límite de tempo de CPU" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Excedeuse o límite de tamaño do ficheiro" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Temporizador virtual esgotado" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "A xanela cambiou" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Continuado" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Condición de E/S urxente" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "A E/S é posíbel" + +#: 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 "Petición de información" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "O coprocesador de coma flotante non está dispoñíbel" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: src/strcache.c:304 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: src/strcache.c:308 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n" +msgstr "" + +#: src/strcache.c:319 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: src/strcache.c:322 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: src/strcache.c:328 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# estatísticas da táboa hash de ficheiros:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automático" + +#: src/variable.c:1656 +msgid "default" +msgstr "por defecto" + +#: src/variable.c:1659 +msgid "environment" +msgstr "ambiente" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "ficheiro de make" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "ambiente baixo -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "liña de ordes" + +#: src/variable.c:1671 +#, fuzzy +msgid "'override' directive" +msgstr "directiva «override»" + +#: src/variable.c:1682 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (desde «%s», liña %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# estatísticas da táboa hash de conxunto de variábeis:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variábeis\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valores de variábeis específicas do patrón" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Non hai valores específicos do patrón." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valores de variábeis específicos do patrón" + +#: src/variable.h:229 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "aviso: variábel non definida «%.*s»" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "a chamada a sys$search() fallou con %d\n" + +#: 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" + +#: 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 "" + +#: src/vmsjobs.c:1284 +#, c-format +msgid "Append output to %s\n" +msgstr "" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Executando %s no canto\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Rutas de busca VPATH\n" + +#: src/vpath.c:620 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# Non hai rutas de busca «vpath»" + +#: src/vpath.c:622 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u rutas de busca «vpath».\n" + +#: src/vpath.c:625 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Non hai unha ruta de busca xeral (variábel «VPATH»)." + +#: src/vpath.c:631 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Ruta de busca xeral (variábel «VPATH»):\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:194 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#~ msgid "# Invalid value in `update_status' member!" +#~ msgstr "# Valor non válido no membro «update_status»!" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Erro 0x%x (ignorado)" + +#~ msgid "*** [%s] Error 0x%x" +#~ msgstr "*** [%s] Erro 0x%x" + +#~ 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" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# estatísticas da táboa hash strcache:\n" +#~ "# " + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Aviso: Redirección baleira\n" + +#~ msgid "internal error: `%s' command_state" +#~ msgstr "erro interno: «%s» command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "BUILTIN [%s][%s]\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BUILTIN RM %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Orde incorporada descoñecida «%s»\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Erro, orde baleira\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Entrada redirixida desde %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Erros redirixidos a %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Saída redirixida a %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Erro ao lanzar, %d\n" + +#~ msgid "create_child_process: DuplicateHandle(In) failed (e=%d)\n" +#~ msgstr "" +#~ "create_child_process: a chamada a DuplicateHandle(In) fallou (e=%d)\n" + +#~ msgid "create_child_process: DuplicateHandle(Err) failed (e=%d)\n" +#~ msgstr "" +#~ "create_child_process: a chamada a DuplicateHandle(Err) fallou (e=%d)\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Erro de sintaxe, ainda dentro de '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Recibiuse un sinal SIGCHLD; %u procesos fillos non colleitados.\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-aviso, CTRL-Y deixará subprocesos ceibos.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Non especifique -j ou --jobs se sh.exe non está dispoñible." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Reiniciando make para entrar no modo de un traballo." + +#~ 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 "" +#~ "%sIsto é software libre; vexa o código fonte polas condicións de copia.\n" +#~ "%sNON hai garantía; nin sequera de COMERCIABILIDADE ou APTITUDE PARA\n" +#~ "%sUN FIN DETERMINADO.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "`endef' superfluo" + +#~ msgid "empty `override' directive" +#~ msgstr "directiva `override' baleira" + +#~ msgid "invalid `override' directive" +#~ msgstr "directiva `override' non válida" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "non hai un home de ficheiro en `%sinclude'" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "o obxectivo `%s' deixa o patrón prerrequisito baleiro" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Non hai ficheiros." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u ficheiros en %u baldes hash.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# %.3f ficheiros de media por balde, máximo de %u ficheiros nun balde.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DIRECTORIO" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "Entrar no DIRECTORIO antes de facer nada" + +#~ msgid "FLAGS" +#~ msgstr "MODIFICADORES" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Suspende-lo proceso para poder conectar un depurador" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "" +#~ "As variables de ambiente teñen prioridade sobre os ficheiros de make" + +#~ msgid "FILE" +#~ msgstr "FICHEIRO" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Le-lo FICHEIRO coma un ficheiro de make" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Busca-los ficheiros de make incluidos no DIRECTORIO" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Non comezar traballos múltiples se a carga non é inferior a N" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "Non executar ningún comando; só amosalos" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "Considerar que o FICHEIRO é moi vello, e non o refacer" + +#~ msgid "Don't echo commands" +#~ msgstr "Non amosa-los comandos" + +#~ msgid "Turns off -k" +#~ msgstr "Desactiva -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Considerar que o FICHEIRO é infinitamente novo" + +#~ msgid "Entering" +#~ msgstr "Entrando" + +#~ msgid "Leaving" +#~ msgstr "Saindo" + +#~ msgid "# No variables." +#~ msgstr "# Non hai variables." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# %.1f variables de media por balde, máximo de %u nun balde.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# %d.%d variables de media por balde, máximo de %u nun balde.\n" + +#~ msgid "the `word' function takes a positive index argument" +#~ msgstr "a función `word' toma un argumento índice positivo" + +#~ msgid " not" +#~ msgstr " non" + +#~ msgid " remote" +#~ msgstr " remoto" + +#~ msgid " with arg %s" +#~ msgstr " co argumento %s" + +#~ msgid "%s finished." +#~ msgstr "%s rematou." + +#~ msgid "%s: unknown signal" +#~ msgstr "%s: sinal descoñecido" + +#~ msgid "%sGNU Make version %s" +#~ msgstr "%sGNU Make versión %s" + +#~ msgid "1-minute: %f " +#~ msgstr "1 minuto: %f " + +#~ msgid "15-minute: %f " +#~ msgstr "15 minutos: %f " + +#~ msgid "5-minute: %f " +#~ msgstr "5 minutos: %f " + +#~ msgid "?? getopt returned character code 0%o ??\n" +#~ msgstr "?? getopt devolveu o código do carácter 0%o ??\n" + +#~ msgid "Child" +#~ msgstr "Fillo" + +#~ msgid "Dependency `%s' does not exist.\n" +#~ msgstr "A dependencia `%s' non existe.\n" + +#~ msgid "Error %ld" +#~ msgstr "Erro %ld" + +#~ msgid "Error getting load average" +#~ msgstr "Erro ao obte-la carga media" + +#~ msgid "Error mallocing for FAB\n" +#~ msgstr "Erro ao reservar memoria para FAB\n" + +#~ msgid "Error mallocing for NAM\n" +#~ msgstr "Erro ao reservar memoria para NAM\n" + +#~ msgid "Error mallocing for direct\n" +#~ msgstr "Erro ao reservar memoria para direct\n" + +#~ msgid "Error mallocing for searchspec\n" +#~ msgstr "Erro ao reservar memoria para searchspec\n" + +#~ msgid "ExceptionAddress = %x\\r\n" +#~ msgstr "ExceptionAddress = %x\\r\n" + +#~ msgid "ExceptionCode = %x\\r\n" +#~ msgstr "ExceptionCode = %s\\r\n" + +#~ msgid "ExceptionFlags = %x\\r\n" +#~ msgstr "ExceptionFlags = %x\\r\n" + +#~ msgid "Job exported to %s ID %u\n" +#~ msgstr "Traballo exportado a %s ID %u\n" + +#~ msgid "MyExecute: Cannot allocate space for calling a command" +#~ msgstr "MyExecute: Non se pode reservar espacio para chamar un comando" + +#~ msgid "Trying %s dependency `%s'.\n" +#~ msgstr "Probando a dependencia %s `%s'.\n" + +#~ msgid "Unknown error 12345678901234567890" +#~ msgstr "Erro 12345678901234567890 descoñecido" + +#~ msgid "Unknown%s job %d" +#~ msgstr "Traballo%s %d descoñecido" + +#~ msgid "User" +#~ msgstr "Usuario" + +#~ msgid "arg with white space or doublequotes: %s\n" +#~ msgstr "argumento con espacios en branco ou comiñas dobres: %s\n" + +#~ msgid "digits occur in two different argv-elements.\n" +#~ msgstr "aparecen díxitos en dous elementos de argv distintos.\n" + +#~ msgid "empty string arg: %s\n" +#~ msgstr "argumento de cadea baleiro: %s\n" + +#~ msgid "environment override" +#~ msgstr "supli-lo ambiente" + +#~ msgid "execve: " +#~ msgstr "execve: " + +#~ msgid "execvp: " +#~ msgstr "execvp: " + +#~ msgid "expand_function: unable to launch process (e=%d)\n" +#~ msgstr "expand_function: non se puido lanza-lo proceso (e=%d)\n" + +#~ msgid "exporting: " +#~ msgstr "exportando: " + +#~ msgid "exporting: %s" +#~ msgstr "exportando: %s" + +#~ msgid "exporting: Couldn't create return socket." +#~ msgstr "exportando: Non se puido crea-lo socket de retorno." + +#~ msgid "getcwd: " +#~ msgstr "getcwd: " + +#~ msgid "getwd: %s" +#~ msgstr "getwd: %s" + +#~ msgid "implicit" +#~ msgstr "implícita" + +#~ msgid "intermediate" +#~ msgstr "intermedia" + +#~ msgid "losing" +#~ msgstr "que perde" + +#~ msgid "never" +#~ msgstr "nunca" + +#~ msgid "newer" +#~ msgstr "máis novo" + +#~ msgid "non-option ARGV-elements: " +#~ msgstr "elementos ARGV que non son opcións: " + +#~ msgid "older" +#~ msgstr "máis vello" + +#~ msgid "option %c\n" +#~ msgstr "opción %c\n" + +#~ msgid "option %s" +#~ msgstr "opción %s" + +#~ msgid "option a\n" +#~ msgstr "opción a\n" + +#~ msgid "option b\n" +#~ msgstr "opción b\n" + +#~ msgid "option c with value `%s'\n" +#~ msgstr "opción c co valor `%s'\n" + +#~ msgid "option d with value `%s'\n" +#~ msgstr "opción d co valor `%s'\n" + +#~ msgid "original arg: %s\n" +#~ msgstr "argumento orixinal: %s\n" + +#~ msgid "override" +#~ msgstr "suplir" + +#~ msgid "plain arg: %s\n" +#~ msgstr "argumento simple: %s\n" + +#~ msgid "process_begin: CreateProcess(%s, %s, ...) failed.\n" +#~ msgstr "process_begin: a chamada a CreateProcess(%s, %s, ...) fallou.\n" + +#~ msgid "process_easy: DuplicateHandle(Out) failed (e=%d)\n" +#~ msgstr "process_easy: a chamada a DuplicateHandle(Out) fallou (e=%d)\n" + +#~ msgid "read" +#~ msgstr "lectura" + +#~ msgid "rule" +#~ msgstr "regra" + +#~ msgid "touch %s" +#~ msgstr "tocar %s" + +#~ msgid "undefined" +#~ msgstr "non definido" + +#~ msgid "unlink: " +#~ msgstr "unlink: " + +#~ msgid "winning" +#~ msgstr "que gaña" + +#~ msgid "write" +#~ msgstr "escritura" diff --git a/third_party/make/po/he.gmo b/third_party/make/po/he.gmo new file mode 100644 index 0000000000000000000000000000000000000000..2ec63ad57db0fa58fed19389cea92356a6a3cb61 GIT binary patch literal 10151 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 literal 0 HcmV?d00001 diff --git a/third_party/make/po/he.po b/third_party/make/po/he.po new file mode 100644 index 00000000000..bee859a124f --- /dev/null +++ b/third_party/make/po/he.po @@ -0,0 +1,2411 @@ +# Hebrew messages for GNU Make +# Copyright (C) 2002 Free Software Foundation, Inc. +# Eli Zaretskii , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.79.1\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\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 \n" +"Language-Team: Hebrew \n" +"Language: he\n" +"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" + +#: src/ar.c:46 +#, fuzzy, 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 / " + +#: src/ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr " `%s' :touch" + +#: src/ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr " `%s' :touch" + +#: src/ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "`%s' `%s' :touch" + +#: src/ar.c:164 +#, fuzzy, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "`%s' - ar_member_touch :touch" + +#: src/arscan.c:130 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "%d ,lib$rset_module \" " + +#: src/arscan.c:236 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "%d lbr$ini_control" + +#: 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. +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (name might be truncated)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Date %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 "" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Break. ***\n" + +#: src/commands.c:628 +#, fuzzy, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] ;- `%s' ***" + +#: src/commands.c:632 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** ;- `%s' ***" + +#: src/commands.c:646 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] `%s' ***" + +#: src/commands.c:648 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +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. +#: src/commands.c:684 +#, fuzzy +msgid "# recipe to execute" +msgstr "# commands to execute" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (built-in):" + +#: src/commands.c:689 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (from `%s', line %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directories\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: could not be stat'd.\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +#, fuzzy +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (key %s, mtime %d): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (device %d, inode [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (device %ld, inode %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "No" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " files, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "no" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " impossibilities" + +#: src/dir.c:1154 +msgid " so far." +msgstr " so far." + +#: src/dir.c:1171 +#, fuzzy, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilities in %u directories.\n" + +#: src/expand.c:125 +#, fuzzy, 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 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr ",`%s' %s %lu " + +#: src/file.c:283 +#, fuzzy, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr ",- \" `%s' " + +#: src/file.c:287 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr ". `%s' `%s' " + +#: src/file.c:290 +#, fuzzy, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr ".`%s' `%s' " + +#: src/file.c:310 +#, fuzzy, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "`%s' `%s' " + +#: src/file.c:316 +#, fuzzy, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "`%s' `%s' " + +#: src/file.c:408 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** `%s' ***" + +#: src/file.c:412 +#, fuzzy, c-format +msgid "Removing intermediate files...\n" +msgstr "*** `%s' ***" + +#: 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- " + +# See the comment above about translations of text printed under -p. +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Not a target:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Precious file (prerequisite of .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Phony target (prerequisite of .PHONY)." + +#: src/file.c:1025 +#, fuzzy +msgid "# Command line target." +msgstr "# Command-line target." + +#: src/file.c:1027 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# A default or MAKEFILES makefile." + +#: src/file.c:1029 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# No implicit rules." + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Implicit rule search has been done." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Implicit rule search has not been done." + +#: src/file.c:1034 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Implicit/static pattern stem: `%s'\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# File is an intermediate prerequisite." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Also makes:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Modification time never checked." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# File does not exist." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# File is very old." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Last modified %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# File has been updated." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# File has not been updated." + +#: src/file.c:1062 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Commands currently running (THIS IS A BUG)." + +#: src/file.c:1065 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Dependencies commands running (THIS IS A BUG)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Successfully updated." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Needs to be updated (-q is set)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Failed to be updated." + +#: src/file.c:1086 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Invalid value in `command_state' member!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Files" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: src/function.c:794 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr " `word' " + +#: src/function.c:799 +#, fuzzy, c-format +msgid "first argument to 'word' function must be greater than 0" +msgstr " `word' " + +#: src/function.c:819 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr " `wordlist' " + +#: src/function.c:821 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr " `wordlist' " + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() failed (e=%d)\n" + +#: src/function.c:1572 +#, fuzzy, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() failed\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "`%s' batch \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 "" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "" + +#: src/function.c:2290 +#, fuzzy, c-format +msgid "file: invalid file operation: %s" +msgstr "%s -- %c\n" + +#: src/function.c:2405 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr " (%d) `%s' " + +#: src/function.c:2417 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr " `%s' " + +#: src/function.c:2483 +#, fuzzy, 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 "" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: src/function.c:2674 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr " (%d) `%s' " + +#: src/function.c:2677 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr " (%d) `%s' " + +#: src/getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s - `%s' \n" + +#: src/getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s `--%s' \n" + +#: src/getopt.c:688 +#, fuzzy, 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 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s `%s' \n" + +#: src/getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s `--%s' - \n" + +#: src/getopt.c:738 +#, fuzzy, 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 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s - `-W %s' \n" + +#: src/getopt.c:862 +#, fuzzy, 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 "" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: src/hash.c:50 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "" + +#: src/hash.c:282 +#, c-format +msgid "Rehash=%u, " +msgstr "" + +#: src/hash.c:283 +#, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "" + +#: src/implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr ".`%s' - \n" + +#: src/implicit.c:54 +#, fuzzy, 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 "" + +#: src/implicit.c:490 +#, fuzzy, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr ".`%.*s' \n" + +#: src/implicit.c:717 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr ".- `%s' \n" + +#: src/implicit.c:718 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr ".- `%s' - \n" + +#: src/implicit.c:732 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr ".`%s' \n" + +#: src/implicit.c:733 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr ".`%s' - \n" + +#: src/implicit.c:772 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "`%s' VPATH `%s' \n" + +#: src/implicit.c:786 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr ".`%s' \n" + +#: src/job.c:370 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (temporary file)" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (core )" + +#: src/job.c:553 +#, fuzzy +msgid " (ignored)" +msgstr "[%s] %d " + +#: src/job.c:557 src/job.c:1892 +#, fuzzy +msgid "" +msgstr " (built-in):" + +#: src/job.c:573 +#, fuzzy, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "*** [%s] %d " + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** ... " + +#: src/job.c:704 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr " 0x%08lx (%s) PID=%ld %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 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr " 0x%08lx PID=%ld %s - \n" + +#: 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" + +#: src/job.c:956 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "`%s' batch \n" + +#: src/job.c:1071 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr ". 0x%08lx PID=%ld %s - \n" + +#: src/job.c:1120 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr ". 0x%08lx (%s) - \n" + +#: 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" + +#: 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 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr ". 0x%08lx (%s) PID=%ld %s - \n" + +#: src/job.c:1875 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr ".0x%08lx (%s) - \n" + +#: src/job.c:1902 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr " `%s' :touch" + +#: src/job.c:1905 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s ,`%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 "cannot enforce load limit: " + +#: src/job.c:2200 +#, c-format +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: src/job.c:2212 +#, c-format +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: src/job.c:2226 +#, c-format +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: src/job.c:2862 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "(`%s' ,`%s' ) $SHELL " + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "`%s' batch \n" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: 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" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: src/load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: src/load.c:256 +#, fuzzy, c-format +msgid "The 'load' operation is not supported on this platform." +msgstr ". (-j) " + +#: src/main.c:335 +msgid "Options:\n" +msgstr " :\n" + +#: src/main.c:336 +#, fuzzy +msgid " -b, -m Ignored for compatibility.\n" +msgstr " " + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: src/main.c:343 +#, fuzzy +msgid " -d Print lots of debugging information.\n" +msgstr " " + +#: src/main.c:345 +#, fuzzy +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr " " + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: src/main.c:355 +#, fuzzy +msgid " -h, --help Print this message and exit.\n" +msgstr " " + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: src/main.c:362 +#, fuzzy +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr " ;- N- " + +#: src/main.c:364 +#, fuzzy +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr " " + +#: 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 "" + +#: src/main.c:369 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: src/main.c:371 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: src/main.c:380 +#, fuzzy +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "Make " + +#: src/main.c:382 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr " ; " + +#: src/main.c:384 +#, fuzzy +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "- " + +#: src/main.c:386 +#, fuzzy +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " " + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:395 +#, fuzzy +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " " + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr "" + +#: src/main.c:399 +#, fuzzy +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " Make " + +#: src/main.c:401 +#, fuzzy +msgid " -w, --print-directory Print the current directory.\n" +msgstr " " + +#: src/main.c:403 +#, fuzzy +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr " -w " + +#: 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 "" + +#: src/main.c:408 +#, fuzzy +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr " " + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr " " + +#: src/main.c:754 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr " `%s' - " + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: 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" + +#: src/main.c:856 +#, fuzzy, 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" +"ExceptionCode = %x\n" +"ExceptionFlags = %x\n" +"ExceptionAddress = %x\n" + +#: src/main.c:864 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "%x : \n" + +#: src/main.c:865 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "%x : \n" + +#: 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" + +#: 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" + +#: src/main.c:1609 +#, fuzzy, c-format +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +".Make `+' .-j1- ; jobserver :" + +#: src/main.c:1617 +#, fuzzy, c-format +msgid "warning: -j%d forced in submake: resetting jobserver mode." +msgstr "jobserver ;-jN Make- :" + +#: 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 (temporary file)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (temporary file)" + +#: 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) " + +#: 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 "" + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "...makefile \n" + +#: src/main.c:2226 +#, fuzzy, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr ". ; `%s' Makefile\n" + +#: src/main.c:2303 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr ".`%s' makefile - " + +#: src/main.c:2323 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr ". `%s' makefile" + +#: src/main.c:2328 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr " `%s' Makefile" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr ". " + +#: src/main.c:2402 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "Re-executing:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (temporary file): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: 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 "" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" + +#: src/main.c:2815 +#, fuzzy, c-format +msgid "Report bugs to \n" +msgstr "" +"\n" +".- \n" + +#: src/main.c:2901 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr " `-%c' " + +#: src/main.c:2965 +#, fuzzy, 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 "" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make data base, printed on %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Finished Make data base on %s\n" + +#: 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" + +#: src/misc.c:664 +#, fuzzy +msgid "Initialized access" +msgstr "Initialized" + +#: 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 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "an unknown directory" + +#: src/output.c:99 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "an unknown directory" + +#: src/output.c:102 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "directory `%s'\n" + +#: src/output.c:104 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "directory `%s'\n" + +#: src/output.c:108 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "an unknown directory" + +#: src/output.c:110 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "an unknown directory" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "" + +#: src/output.c:115 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "directory `%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 ". Stop.\n" + +#: src/output.c:658 +#, c-format +msgid "%s%s: %s" +msgstr "" + +#: src/output.c:667 +#, c-format +msgid "%s: %s" +msgstr "" + +#: 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" + +#: src/posixos.c:98 src/posixos.c:251 +#, fuzzy +msgid "duping jobs pipe" +msgstr "creating jobs pipe" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "init jobserver pipe" + +#: src/posixos.c:119 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "--jobserver-fds `%s' : " + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: 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. +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "write jobserver" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "read jobs pipe" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "...makefile \n" + +#: src/read.c:336 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Reading makefile `%s'" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (no default goal)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (search path)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (don't care)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (no ~ expansion)" + +#: src/read.c:655 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr " " + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: src/read.c:986 +#, fuzzy, c-format +msgid "recipe commences before first target" +msgstr " " + +#: src/read.c:1035 +#, fuzzy, c-format +msgid "missing rule before recipe" +msgstr " " + +#: src/read.c:1136 +#, fuzzy, c-format +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr "(? 8 TAB- ) " + +#: src/read.c:1138 +#, fuzzy, c-format +msgid "missing separator" +msgstr "%s " + +#: 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 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "`%%' " + +#: src/read.c:1404 +#, fuzzy, 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 +#, fuzzy, c-format +msgid "extraneous text after 'define' directive" +msgstr "`endef' " + +#: src/read.c:1503 +#, fuzzy, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr " `define' , `endef'" + +#: src/read.c:1531 +#, fuzzy, c-format +msgid "extraneous text after 'endef' directive" +msgstr "`endef' " + +#: src/read.c:1603 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "`%s' " + +#: src/read.c:1604 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr " `%s'" + +#: src/read.c:1632 +#, fuzzy, c-format +msgid "only one 'else' per conditional" +msgstr " `else' " + +#: src/read.c:1908 +#, fuzzy, 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 +#, fuzzy, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr " `%s' " + +#: src/read.c:2122 src/read.c:2168 +#, fuzzy, c-format +msgid "target file '%s' has both : and :: entries" +msgstr ":: : `%s' " + +#: src/read.c:2128 +#, fuzzy, c-format +msgid "target '%s' given more than once in the same rule" +msgstr ". `%s' " + +#: src/read.c:2138 +#, fuzzy, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "`%s' :" + +#: src/read.c:2141 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "`%s' :" + +#: src/read.c:2254 +#, fuzzy, 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 " ;NUL :" + +#: src/remake.c:226 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr ".`%s " + +#: src/remake.c:227 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr ". `%s'" + +#: src/remake.c:323 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr ".`%s' \n" + +#: src/remake.c:389 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%s ,`%s' `%s'%s " + +#: src/remake.c:399 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%s`%s'%s " + +#: src/remake.c:425 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr ".`%s' \n" + +#: src/remake.c:432 +#, fuzzy, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr ".`%s' \n" + +#: src/remake.c:444 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr ".- `%s' \n" + +#: src/remake.c:454 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr ".`%s' \n" + +#: src/remake.c:457 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr ".`%s' \n" + +#: src/remake.c:486 +#, fuzzy, 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 "" + +#: src/remake.c:507 src/remake.c:1039 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr ".`%s' - \n" + +#: src/remake.c:509 src/remake.c:1041 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr ".`%s' - \n" + +#: src/remake.c:515 +#, fuzzy, 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 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr ".`%s' - \n" + +#: src/remake.c:680 +#, fuzzy, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr ". `%s' \n" + +#: src/remake.c:694 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr ".`%s' \n" + +#: src/remake.c:699 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr ". `%s' " + +#: src/remake.c:751 +#, fuzzy, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr ".`%s' `%s' \n" + +#: src/remake.c:756 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr ". `%s' `%s' \n" + +#: src/remake.c:761 +#, fuzzy, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr ".`%s' `%s' \n" + +#: src/remake.c:764 +#, fuzzy, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr ".`%s' `%s' \n" + +#: src/remake.c:782 +#, fuzzy, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr ". `%s' \n" + +#: src/remake.c:789 +#, fuzzy, 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 "" + +#: src/remake.c:802 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "`%s' " + +#: src/remake.c:804 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr " (`%s' :VPATH )" + +#: src/remake.c:824 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr ".`%s' \n" + +#: src/remake.c:830 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " .`%s' VPATH \n" + +#: src/remake.c:839 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr ".`%s' \n" + +#: src/remake.c:846 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr ". `%s' \n" + +#: src/remake.c:849 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr ".`%s' \n" + +#: src/remake.c:852 +#, fuzzy, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr ".-q `%s' \n" + +#: src/remake.c:1047 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr ".`%s' \n" + +#: src/remake.c:1422 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "*** `%s' (%s > %s) : ***" + +#: src/remake.c:1662 +#, fuzzy, 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 Customs\n" + +#: src/rule.c:289 +#, c-format +msgid "warning: ignoring prerequisites on suffix rule definition" +msgstr "" + +#: src/rule.c:530 +#, fuzzy +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# No implicit rules." + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# No implicit rules." + +#: src/rule.c:548 +#, fuzzy, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u implicit rules, %u" + +#: 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. +#: src/signame.c:84 +msgid "unknown signal" +msgstr "unknown signal" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Hangup" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Interrupt" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Quit" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Illegal Instruction" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Trace/breakpoint trap" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Aborted" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "IOT trap" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "EMT trap" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Floating point exception" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Killed" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Bus error" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Segmentation fault" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Bad system call" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Broken pipe" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Alarm clock" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Terminated" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "User defined signal 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "User defined signal 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Child exited" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Power failure" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Stopped" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Stopped (tty input)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Stopped (tty output)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Stopped (signal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU time limit exceeded" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "File size limit exceeded" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtual timer expired" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Profiling timer expired" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Window changed" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Continued" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Urgent I/O condition" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "I/O possible" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Resource lost" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Danger signal" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Information request" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Floating point co-processor not available" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: src/strcache.c:304 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: src/strcache.c:308 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n" +msgstr "" + +#: src/strcache.c:319 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: src/strcache.c:322 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automatic" + +# These are printed under -p, so they are left in English. +#: src/variable.c:1656 +msgid "default" +msgstr "default" + +#: src/variable.c:1659 +msgid "environment" +msgstr "environment" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "environment under -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "command line" + +#: src/variable.c:1671 +#, fuzzy +msgid "'override' directive" +msgstr "`override' directive" + +#: src/variable.c:1682 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (from `%s', line %lu):\n" + +#: src/variable.c:1745 +#, fuzzy +msgid "# variable set hash-table stats:\n" +msgstr "# %u variables in %u hash buckets.\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variables\n" + +#: src/variable.c:1760 +#, fuzzy +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Pattern-specific variable values" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# No pattern-specific variable values." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u pattern-specific variable values" + +#: src/variable.h:229 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "`%.*s' - :" + +#: src/vmsfunctions.c:91 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "%d sys$search\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 "" + +#: src/vmsjobs.c:1284 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "%s- \n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: 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 Search Paths\n" + +#: src/vpath.c:620 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# No `vpath' search paths." + +#: src/vpath.c:622 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u `vpath' search paths.\n" + +#: src/vpath.c:625 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# No general (`VPATH' variable) search path." + +#: src/vpath.c:631 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:194 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#~ msgid "# Invalid value in `update_status' member!" +#~ msgstr "# Invalid value in `update_status' member!" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# No files." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# average %.3f files per bucket, max %u files in one bucket.\n" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] 0x%x ***" + +#~ msgid "*** [%s] Error 0x%x" +#~ msgstr "*** [%s] 0x%x ***" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr " :\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "'\"' , \n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr ". - %u ;SIGCHLD \n" + +#~ msgid "internal error: `%s' command_state" +#~ msgstr "command_state `%s' : " + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr ". - CTRL-Y :\n" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "BUILTIN [%s][%s]\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BUILTIN RM %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr " '%s' \n" + +#~ msgid "Error, empty command\n" +#~ msgstr " :\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "%s- \n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "%s- \n" + +#~ 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" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr " DIRECTORY- " + +#~ msgid "FLAGS" +#~ msgstr "FLAGS" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr " " + +#~ msgid "Environment variables override makefiles" +#~ msgstr "makefile- " + +#~ msgid "FILE" +#~ msgstr "FILE" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "makefile- FILE " + +#~ msgid "Ignore errors from commands" +#~ msgstr "- " + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "DIRECTORY- makefile " + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "N- " + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr " ; " + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr " , FILE- " + +#~ msgid "Don't echo commands" +#~ msgstr " " + +#~ msgid "Turns off -k" +#~ msgstr "-k " + +#~ 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- " + +#~ msgid "Resetting make for single job mode." +#~ msgstr ". " + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr " --jobserver-fds : " + +#~ msgid "dup jobserver" +#~ msgstr "dup jobserver" + +#~ msgid "" +#~ ", by Richard Stallman and Roland McGrath.\n" +#~ "%sBuilt for %s\n" +#~ "%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n" +#~ "%s\tFree Software Foundation, Inc.\n" +#~ "%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" +#~ "\n" +#~ "%sReport bugs to .\n" +#~ "\n" +#~ msgstr "" +#~ ", by Richard Stallman and Roland McGrath.\n" +#~ "%s %s \n" +#~ "%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n" +#~ "%s\tFree Software Foundation, Inc.\n" +#~ "%s . ; \n" +#~ "%s ; \n" +#~ "%s . \n" +#~ "\n" +#~ "%s - \n" +#~ "\n" + +#~ msgid "Entering" +#~ msgstr "Entering" + +#~ msgid "Leaving" +#~ msgstr "Leaving" + +#~ msgid "Unknown error %d" +#~ msgstr "Unknown error %d" + +#~ msgid "virtual memory exhausted" +#~ msgstr " " + +#~ msgid "extraneous `endef'" +#~ msgstr " `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr " `override' " + +#~ msgid "invalid `override' directive" +#~ msgstr " `override' " + +#~ msgid "no file name for `%sinclude'" +#~ msgstr " `%sinclude' " + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr " `%s' " + +#~ msgid " terminal." +#~ msgstr " terminal." + +#~ msgid "# No variables." +#~ msgstr "# No variables." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# average of %.1f variables per bucket, max %u in one bucket.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# average of %d.%d variables per bucket, max %u in one bucket.\n" diff --git a/third_party/make/po/hr.gmo b/third_party/make/po/hr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..2379f8f603866ef7f9f38e11cc88db773d620d19 GIT binary patch literal 46070 zcmb`Q34C2wb?#3B1fnElCLs`VoJ5i2Sn`xnwv))V>?oEcMT1RZf;rN?lCE@hk8%gu z7Lb7{3`rmbT84%uVGL6#Ev38$DByH}2fUV&K6tOR51P{U0i`@zN(=P;zqR){=U(Yr za%k_*N8cItxc1s>ueJ8zZ=Ln@w+8$^dO{F9AH4UpAm}+U2!3{f-txQDy*~lGoW~b{ zmw`8dr-QeH&jRlT*MP4FJHZcwXM*1ZL-2e4{b{X1a4yeVz&7w^@DlI{_#E&-kRk-X z16~Mz9y}lXYj6nsDYyl^i9%cqz6N|A_$U~HkAqe4Z^3@>0GTM>2f&@+Pr+-!>)L~0 zFL)Td0sKQS2A|mx1iQgQpq@VqD*pPlK~Mzm0(XJm2X6wefGBr?cY;bcSQi94fNpRS zyaPN4J_)May%47xyc-+@9|M)nsa-+va&SLb1HTU50q$8(S-~%YD(}e~T>AULO+3F7 zRC&Gv_JQYabom?vPu6!(?fPC&^!hw_D)=P$Z16|mY2XPYCiQ{X@w@}1iopR; z`M<%xe-HRvo*x6n4^MzJRq$i*9Pq*`96xRXX_DX;|NJUY{Q4pA9Plqd@!9u0o^fRm z(6qr7AWaaw7^I1UdqL&@DNynL41{%q?}BRIQ?H^AfV)775adD8_w69041O0BKmHvk zx;>prpAKFGJ_lS6s-NrvmF_gS4ZIH&-+jsB+1I%I4uGQTTfvjScY$ih_kzmzk3rGp zNl^UtGzzKouLo6*2oxP&4xR-*3O*Nn%;OWF>it7d>0AhNs@=ALdLMzJ&;4KsJ_cR} z{v{|nJe^E00x$8n162MKAS@ib8dUv%2NXSzf?o!|0V>}6x4L%!Bk)|Fe*!A~(;!L+ zUID5+W1zyn6g(SzC#dv(6BON#f~SE00*cNj(rMJ*&-J(s?B_WGX`0}p;Pb#I{qqUe zBlmc|2IN(+2#UWy1&V%O0L5Sb2%ZOCaD)5434A8cTS1j$CkTrN3!uvLD0n{j2~g$z z3aIw`4yg1_B2)E;jiBgs0~mrspvreUsC4cFRi3wl%KzQqMd0s)r-J{>E(t8Ui zKK&>tdGbmB{5Yug`UjX3^T2X5r~D)3rx8r%#%;_(SkeA_bW-d_fazPEy> zDm-`=SOe8guLVWF-v!SAKLe^rC);o-YH{E?0pn-vLnV{31K=4a2EmI!$%DC^i~n{|^!XD|eDLp}`2Li<%lAC+2A=!D zbHV#S#eX-r9sDZzeDJJE7k)h`xsn6dfNuts|0h7nkuQLkg5L!pad7IC(}!k2(e+XA zV(_oQHt=cF$SUx1Z~%M+yb1g#k6Q~)ue}HC=lxef(f9c?K`;;A3ig6u0%P#ZS!5@8 zH#n!~qO)u61Qq{Jz&C-<;p6q-`@x;ycfsER*OeG+!Eb@$hy5g~aCd|61V0D947`oZ zKL&miBxvx4+Zmg|e*=fW#WG_)_$6=`xVz%|#r@zbc>Wx?1Ke44^?5DW!t)=3%J)w} z(dpm8)4&(h9NpJ}&*u36DE^xPp9j9mzkdk4kmuh7&jr5>s{OtLs@+BG^MF%9Jzokc zy$zu9yB<6l90#|8MerQ(QIDSimG9R;)${wH(!cJIOZNbH5ziIS_yg?Z`4iv;;CDdv zi(i0h$8LyyC3qNI4}KJU0r)Nd{Buz8JC8U#0A9=U>p->J7r^tuXDzyZu?B4A`AV<{ zJOHXZ4}!|~)8Gd1r=a*@EsZ349|A829|nzXpy>D=P<(ml+o!?jgFp9p0nGJ0 zg$Gs65m4#f395YW_V2$0uH*S9pwheaF4rITfJ$#3RJ{8<{uZeEe;ri0{sUBdUvsx> z=e@!c&<8<2qK=_)YLs@Z49q z_PH3`%=30o^;rPvlEJ&c>%miB?ds7F?&0}%@J8^{;4pa7YiI-T7Etw{1(nX*z%}3> zfa3RWgJ*z009B6v0L4$;_qcJj3W`qmfER%80lUD@f};BmK*hh{wT@3O2QTCKCQ$j@ z4n7xrGpKYv0xF*`f}-CuUgz|P^`Q8A2y6rI0LB0B1AD+H{P*);@Az>SsC-@oJ_mdy zsPOOb@4pBtoqqzw-_L!6qt{Jf2hTBhHu!c>>3jry7Wn7j3&6hw&jNo2D%|P!I(cvj zcp=ZbK&6ud)lT<=8^OKI^Uht&*U3&eX=)2(Y zy`bp$=b-BGFQD3??TxN{+dYnfqQf-U3El}R-bX-{|Er+d={um>;m4r(`^-1Far7qe zBA#CXhTtRMTJQ_t8Q>4Vt>Axvs{hsp93S2aD!q4rH-Mi6mH)qjYUj&-#f`HOxQpl8 z!4UjCa1;0qP~lE}vl~x$gL-}$sPcajJW=65mG^&xmxAZM#qoVNcq-4Y0k?r~23x^D z1+NBw0;*ltztzRR22^=(2X}(^gQEY}z*A0uPkz49!uR!tj zcR{ts32$@#`T3yIy%OvJ7r`yyW8e+ozxwyrzTMH`rC>Yne;vF6d>mA~e*;eex4y&i z*Nxx?o?ixD3w{Lb2EPk-ffv7%F%P^M)bkUd+UXg;?&^ODsB*6ZL+}dla&QdX2;L2< zAN;m||4mSIJ?TML|Fgk0JZ}as2FF0P-(gVY{tzhs{%eotz02{(0C+aM?kgD z*T4(FpMvTK=lq6Crw0_@Er9y|F!+4%G4KrV8(;|j19%pA%0sT7zrf=zQ2bE>F9F{S zN)CJyoCN<0RQ|gjcI7F8Ej&L6ZUH|4?gsw`90u1t;_yyT{r%5C@$t{V)4?6@b~pk) zkLL+c^}G{23H%s%G5ASP<@hFe4tU~wTzi}cKAY!@z%#)vP~mO>)jrdp=)yuegrDr)8FU#_G<72Jl_ni0p~%r3 zSo^5sgX=)Op9Rkc9|BJVKLzdw9|QM*=X}uVD=z_6j*o!r!Eb<~|H&V6{i+)jeJ4Qi zSsA<%{0&g)e;ri0egG=m$scxnb3VA4=dGaXHxFI|eiCd0e+aGv&;N+)hrOW6eHR#l zp8(abo&ePz&-$n<|MlP{JpURfy8k|?aDNG^U!VS)j{o{V<@W%1HTXqP`JMPNN6+=3 z+TjLJ@ehKRf)9Xu!QTbdj!*wBCr@^R+jxE*sQUjA7=b?rmCwPCJNms1RQ>)KRK7n1 zd%*VJcKvw3t3#F z`TjC+hD*P{VS$-VmJMy~(PRp$9duK&e-k?ZX~>{gGw3c9)f zSMW!A;P+Vv_IESiBq#KHg!`9q-N&Whdam=h{#FnCW_Ulrbq?2%52N?L$8~4j^KbGz zr4Mz#E4lwT*Xs%QYySOrJ+|}ia_&FJHO_sff1khsedp46c7uQU8t~;@cW~X$w?(cm za{qR&aW4Iy#XJ3WfzJhR(Sv{YH{4$5@AW$QmAH8h@81bt46fyR9@lMLckxa#_-$O@ z=lWAF{fd0k?}uDBb3Mc*S$npB|8DRNJoo$O9QTpGzX<#e&u4P!_Y$730sjZrPq?1s zx|Qop-hUZ9o9it;?j_tm%KZ)gnMeDz^7kwL{z7ode=mW1xxT==3fBj@KL~!EYbW*WFyxT*>cz!d}It-=*Mt!1Z8`>yW)=4CnqgxPKw|Z{RDr2DrZh z90v7!gzLrr{xJ7duK&x`&-FpB3;6a?t|z$veXg^(KM8!m$GM&RwOo&LCBJWTb6xTP z?&mtd^*yfl`*@$?{vNJB=lUdS1)t{Mhdgib_wVKYF@OJVu#e}rfcJCFbG?@5O|h1*DA>+IIX_X2%Y}T!ve;E1S$)`5C>1Kx`CPa+n$3r~s2YXiQ6(S7 zrLffn-JLJx%TY0GZ`(K2GkRlNntVrn(Yr}Y>GdTAA6CKjrZM4l;e5GJs*<7Qpa27L zICWfkScM7QNSx&DYGkl*LrZD3FQL`GlvY;FaKtqW5vCm-l929cQUnaAqsnw=)o5L* zM%9X=LTg2Js#MDp(ZqB<9Is7I=F5u4hox`3!`7nOwpi;3*XwJcG*t<=*;_rw$G%-z((dj~k_KK&<(Hzw%6ssXwIL0{UH!4%N1SsdJ)FJURg64g>R$Hba^-wQ)!cBnb-pDC!_LlJ ze!MnyVB4<#p4}t2h4sH7ah|bnT&slDBlEOiJQ-SqDd-LfjDjjEJyD63;!fk&&YbT+ zN0J0bYvmHLC&SJ|>%#m(z7!TFL#TWxB5A%+KPsHCYVk;xU;e4xdQ198Khx#^D}Lh)cPGC`nr%3GFj?VHIA> zS0(5m?~ZV1-*E4a(ZS(clvGONZRzWlEXihfJ76)oM>Wn83di#_BBCr71)|cC>NGbl zzus_UbhvL|w=&Bk9JjegrQ9o7sSe^_(Tb6kS{=3tXB979%D5i&&zSgD3{dJhSz zhw`+f4@^}`IZt_4fx!c#w+!{(rexzUJ1vKgi6X~Hmq#uNG3oErFy2@>A74ru+PvkW4TJcTBYqg5k`D6v-$jd z=agDkFOZP)s}xv0RUMtKI_pZbKit*V->c|{rlV?SVRBpYT*@EnREwuCqDrMUm+$1g zy;>!!9dW5r$RXjBp4f6cFQLL1Tg}r8NW~RkoV@3nF?1OAO_g9@gd>7>BA#PZD~uP4 zg{l`Ix#qF-*7f~jTwP77I*8rh^Yh#p`$}ZcP@W6oe9C7-AZ3A^|b?MEjC>c{H#Srd+)k9--Cz&fTo!d)L2GLSmRSY&4J7Xn{&?_TRYQ<_{9vNsIyH-N&si0oaE)aJ-ZxwdAmz2v)tx|PE zrk--;Bc0`%eSn5>>A3QZCaN_XG>9ny?gzy!q0)BhqeR}E%Qa59EH37n_FdlpvV9i{ z9tnwW+>~2^G3c+Ld&4)M%;L3gk+EyQ1HYl5Xlz zecOk_)E+)@ytl=8*Tx}KmkJ}U)Q#G_WDF_#)XGY&PSTq3;1X>rX%p?lSsAWG7#oSs z;mTIXC%TGbi+r7);-XX)uo~B}VwV0!?QO!cg;J%e9?f`RWYh?qwd8`5f#MZuijBXd zKV#DP@1@$@IC7ShoNCd~yV1zfMp>e_WhqV6$|y6{Fx5J&GCQRMv{nKyh*d&o50oPM zUR!IW&4SemIjP~fb>UQcCk;)SXltw>?a6r7(apnzsU)?z`FyT}N5@JNQ8}+ClQBwq zUC7u@_80@lc-^g(o!qj7tW6>y*6jQnIo_eF$6MWqNk-2o%bM~qT& zNpEO|xN3!{Geh|x0SzYvQefjs#SK9ikIP=b*k-FFR3waQUx_g$%3Z-FVc3%tV_mqn zXHTz2Muu`mw?uDRU-5cRI)J!%MG{ftR=SnUc9|b!CZ5*wj(84R2V+GPa|~wDcIM~v z=(nW_O5!^YaY`k%Wc%oieIp_Ndcy5vyE`oWE@$(&vAQ;|&XjW>r1<4xQYpn%b-zkA zdynCV@I%E~7DHbYq4`&2ChD~bgSmXJAZD8{qg3BsD^$=CvJ42A2p@adm)O;+e`0v2 zrGTGY++zkyi?l50dMUSf4ZQt~jLFY+8>hF3&V3~`V|ZNpv6Pvx4Xs3!KWIvE8w0F* z;u?kRkEDXeIlK^PF!CSpa<4tZmg?4~o|Z6|P;R8pdRhC< zx`rB>ju{JFONZ_CRFf3w8oF_C;1(ZJGE*j=xVTwRY>vLcu@M(~*i5d_ivzT@mAGZ3 zHZj2fI9ZcXQ{VPZOsfj{!}*C?RXo}%J1)Oaz*du_D3l~14sdJ#ZtLg{k1NnbTw?@s z4H(97x7lBf$rsb~TZ_5n2`~M;Qj)XzBb0odHziv8uDYU@CD{Dqv6JgYhpj8USf)+Z zqj`Ordcf>c730gbwEBKiFUuvV1}YY55+=BGu%^D&(6zLJGzk_ndli2x+B=83@a`MDloVs&N%ffq=M%ln$y}{S%!q`{o@& z%CRmT<-9zdv;d@=7C?C@W@`msRE3)qdZn{SZkk767OIu9(Na;m!!$@D|Bradp^v)? zc^FrOHtscV7^U)=^eOdnZN9ob_4}aH)-;qcT)Lt3aBK1Kx-i1aLyhI)F`9RW{rPBN z<$@(4nw4u*wsSR_o0t7+%7{2*OIWFmqlZ;%GCGq|dY2geS~{=QxqzKJMf=3gr`6dR zwoW)|6uhil{>8s(Yn>1^G^$9$M$3g0p)SS%R%WT{l1T#-R0GD`cwwrBJX`+N1`a%6 z$4;ZO^C@K5xu0quckz7aW0tU4;n2%cYI#v^{Lwhh8kuV)WNJJmKLZ-0qqU=-qeIj0 zR$c$y#`0vqaJevoRpXQc=_EKa<$f*aX-}zL=yT;5wYu@G5;XlIb$>QKdzWWxr5{;e z!XvYLsDEMe<=x@#fic~uTI*)%J#y8Q!>!ZR>U{V5^;4xOF_N32wSp7dv<-rql3mwe)`wU4z7AhU zKIf7X=`H*LCtGd{du4GmCi=Iv+v)_#v1HAG)`noq`?U*@^!t^QNkT16#kd4Y)frYn zTjJlKW0)~fSjY!!*RBnFn6}~GD?m=p%|%CKl8?tzwaONgdbxZt4_z(BcKA##D8=5X z_YyRwq$uOY*9|&iW0?IBj#b5kh&A&r*$j>h^e%puj@-F~=?=U42lpQw?j0HI9~O`g70P)WV&-t)F*@Aec?%zyyD%bal49qMewwW-3`cM`>TYN6uAZ^}(Sy4O zd(bdY79wn0R9`w;m8f`r5~C#O>hIgm#Mx-?@W4n&qf5>^X7L4%64g7{g2tdcmsp&^ zRM=DmTqwjy6I!gB8pyDwA3H@G?~{g2Icwb1$nqG6%2*sLMkz++ zxp1NwPs|2A^D?W#)~>Z0Y;wHKN2MB5F8+h}1Vc)x{XGkDA*Y(84Qzsh2CbQS4+$~A zxJcL_vYE7s)&o$^dHG=l_kM<3OJ9b*)rllQ`nPL-3!FK6oj-^d) zD`_6?${vVm7!46!D@f^HoK0aI| zbTjD*EdgEM-$+R;qvB6dj-Yq%Xvj3%e9${LU#0nRyqM&aL&m>j_GLUShUTJ?sFnh0 zx<{{Bh$)&$j@Ve{ImA{sjTZ3jNT@FjnNCOtyD-V*-CZK6)Lg2%Dqma5tlE6gw|+2mzBUTnH|W`` z&l?+kxK7J8Dx3YLaBuisb>og9NU&kBgCN!9Q*_=bgf`-ZVN!&u_ zEkU3y|60KpKR+#zV@nRQ02P}BGtQ%?8kBM^!5$fIxu9P<8=4z}x^><(_i(6BBMbjp zf_^&b5>bd7RBuTr9-mJwa97N zHZjy(>w^s&BCNo!4dI-E+UY!W$7b=p2#16nbf5OI(0P_wOfv73+0<)q(;tmt8`v*M zznSzxl`Q3=G74Xb$>z|nR1)0|VfJ(>w5Z{vjTvc(l5AbUBx^sQ!QQASmR2qNMNQ`mXriGnj}J)1FFkgWH!fC39ZhTSd8u>QbuI-PV!Lsm!U*+;w|`+Ij~S z2ZofhH!Ex~I4(Wa*i}l8iqy~%$aT;RZ4{_rs9{FGy>q6+Y)(m-N^M>PBne5P*&-p- zP_<20FccqRl$=EJqJjrQbw+wG_p3xPy+OPwHKB|qIFAjO<2`=CCBxBB&6X=PlGMuLjBM;WaPU~ljrd-d${m|Iq+`QB} zDyx-IX0K{=Wd;IA1e4Q(o|*)ny) zir6HEnN7_@V=BnKTs8YeRY}`c3-Bz#x!5$1^n+szc+rG%!imGo0b00agHOU{>g?Fi ztiMC7V2n=La<3b_>*_jjqF<|{0AfZei#q~KeP&~aW`vOOgo$fq=0afCYB18bTQfGj zy4l}1urnCRPsuWN`if0k1|zeDd1LUg(OsR_gxd%AinkhiM$2k}+~P}u$z06TGI&I$ ztQ5SFs`$65f+=esyNn=)VY^fQJF*v5bblMumb`Q3FfZ%pi!{jK*Y*M@8(mdwuiXj&l14DRhp*eyqvkvmFnZ$l~1wbi*5ysDJer^%S1c=b$f z=73c&Lbr4M*spRK)zZiH!p3fvv=H;vN*Q-d zVz(2+%|HiH4YM42PXsu$Q^~IRyE>~=gG@!sGmK>^l2tQs3#2s1A~&MB^qm4IN=Q=E zdUTy`IdEfKIQhfV5xO9J>|(MyM2R+ZFk{M8#`#{SmyL0p2(0_8nl4L7anu#_veZm4 z;=(hdg_+@Fe)F0H-O79WXzYr)!vb7&72_$h+I-8~C>c!9V~lMP%dF{^yQ|@qGrLlQ zsyl4=PWqzxEIIsJghAa>L|b`` zV95teOq8QiUeowS-@0d;nT;kji(>7Ox#f=$$aS20|NSun${{ydA5N9%hL^o%EXGfL ztVU!PV6MO#8QMWlRz3GRRaBDsy-L7Z(A+^(tb+`gZW$DT2)5Q_r-5#yF!@@V*Q{4~0hPxqlk+V6(OM9u z#nF)t)y+G(FD*eb)CEZwXmfpN9X%PIn!{-;JF(4o!G>Uk$+q;_##_I1-?L1TVkNJ| z<#?9U!08+9lgPQr931E2XwP=4g$Q?R46i}gM_Z^|-;u_2Oqx!(tTGElv}LnYB3RvO zDV4htq>E%5)2{@jn160wNFu>aE9F@mf#(b#grq+L6{STZRN^;(N-^Y5e@YR|&t8g4 zopd3VcT6C(RuL4WziMb^5vrMJX^2tL%3thCzs4bzL`$NW%`RK9EnlqU+cYKJ&{x#) zByvsc)+=~;pxrnshX+Qp931pB$3>OE`-Bf-E*)v;4{n>2M3sETm~wvVU>?g(Za(!x zH&W6ka!Vf5l6dV&gRQp4$n0b^mo6fzI(`Vsq=>aXI_52QHT}aQUIq z!aU-&ek3*C57V`wnRbJ+aH+GZGjf<5k(1Oju!Na;Lo^qI0>%WJw5&$D&eT(q7}ggo4{4C&_^iTiGhVt?2l*i?Nzg=Jm*~TDVzy0NYinDe@{oiI z>Q{$k3r^@*rOpP$B;h_6t+REaSu6~7e219*8Z$K6lf|-i%-X1_&xu3TS!(GtgDjhU zdq)CW3hflw#8Dh+{UoBwr;r3mmJp=mrr>_9X%a-Uo#niCl+ha)QO$IZ$_HH;4!UL6 zWUM5TID0eKr!``hs#?TCE*a2@g>jq4w1O~J;PPevU{X;(NVMhxyk0CswK;5hnYpx3 zMCZNtuY1YRTPyiRW7?7z7V(uZSLJu9B1Mx@C&8T2Y+I3RcV1Fbmx!NuV+R5@a=26t zL1S(haJ0oRT&fG8>U%|vg+y(Q5mNOub@Bv$wLmwEjWq`zR%Y{ukT6w*1CzC3cnkgv zx3qvRV(UIw$jp`5rpTu}$c zZ0#fVvUIx&iVjKc<^#fwo;u;$O30YhLw_uwr;^#bdLptfu9Y(aSSh9aGMtw$uXAsOZ3~^- z@#uAqvL0@!N3UgQuydG&%UT%FsT~pB;ie6nHgs;-*ty}VaO1}A&DVBrxMstK7A^Sh z#3fUzAOYfXcep)%{4)h+dP1DxSZ@<}3*$w-n7`pjG#$rX^pER^#*8QKkIvD2#9H$m zWzFNFzilnXvznb`_v%b^158>w+%;X!!gq($<(9oHV9F}Dv1i4(a4IlcSvz~_t};5h!)wM1)s`0;MY=;rBu(#Iy(Fis4a^6o zVW*+|$vT^^mLaA*qGIPR=0VU>O7r$u*|vEL0#aYLwU=5qZrHYMqm~ovcEg%&8#jj6 zhZ`9E^nBg6P06RN+pf^9#n`ZQV5aO1UI z8?NZu%r&NqbqnS$pTVh8NW}cn`w%qbRa=b9vw6kX$^6MIg)Ph!EJxUj9VqVG z?zkE+L?NZ!3(u;s<0|WXjLR*WjlvmpWJ*0(ida=)Rxt?<&L6!ePhX9~b|TuGykbh8 zt0)o26g02#(jyB<($`nzJXRrC$6uMpA)AyzVFxe*Q9@if*m2OT9C=p`qs9`-r%5y+ zy*u4N=|2TJTcmwYtzFz=hGUS*T56xCDC?Z4v)2h|88shE2$Q1_n9$9RK~TZx@<$)2 zxppfMkOsxlw#DEiBwt~2P(ppci2^cBOLO^?os1yvu%+*8B%F_@>7f4EmdPWzD>M1o zWO4kG)N4oYLvg?@QH50{=EeO}N&NMsHwB+jK+C|6NMPLd8X)`^78b`PT`{)c!})Rn zzc|&JVGAUu7{s%rM?b2O>)=8(LjZSdf`yF>iwi7=EvfQy=ByfodfOoiyV&%EG{p~w zes=T$_I^+dbTB0Pe7s1;CD<7m#n`L~U_aO6Y9HtPqAH6S{4GUp3YlQZFLQTyY z5TDdBj!=kmG{2QBuM;P<_lJGzk3WoLO7=7&IK&4osTDR;rrg} z70bEn3O#1|t#G13%pRbER_+y!-bXiE$g`z~_M6EsvVjYEA!74?+9=sMsQ8`$8Q!XkPI>h&tM4-*xn8V+bzjWkU^P~YPR8MAS>8XqJmXv1ZB}UxN)V6Zg;B%$U3+XnvInhSa1| zV|9iq>MdCkEfy9u=(JWu1jaNoF7Ysg zVbg;%{`igBCY>Cdk?0+Cu~rANnW?1&4~ zv>} zGdXLSNMz2@N6~CNgO5lPVvj!@dbJB1x%~LU z_>#l+!F_|_O}*jJ@Zj#@p1mV`dcxhqy^lY%r>8?%_4rODZZOT-o8gulTN}|j zo8(G0b?&g;JO&YK5KR!sJzxatSKmjmVP8n;h!eMV1c+-Iabf*Y zAy(8JHPeA2c4$aP()HZC`e;j!4M877Dg7lG*$O)*|IyWBXvb4|2EQ^-k!3 zr>vcYaYrA(xwP_eBCCWl%ERDVmmo_I<)O-QZNwX*V@Wz1%$WU0+Kh42<~T#baJ zbuA1fME)|*Xv5dcj;hs%EHDry4%aC3N0}fn)tSh!Bnbx3D(`H7lgv*aaV&^s{Gi9m zsD6z`Ff8ibEYpBcl?lz`IN_vT1E_b=&UT|q%S(c8A*ZQ7^hBN!>>u@M{}Sa+R*HYb z)0+8d(^E^Jm-JNjGses%FptRevr9qeldN-Qp`%zB+aB$WYJJ6Whv_U z#U^zy#_+{>j8l(wP4WiS4ZMoc9gg98v7xPgP)-}gg&B&asVD8`j5<_pnu@tkDL2S3 zV^()$3X_s(SxS5epIITd-noFyD>o-a0#=xn4kaZjIWmQ*UbRZyp(z8h9ak)SpLBC8 zJbF`I&C;T};_ow)w!*N%`5_-!94AiJT_6TD9t37;Jq!pTv7Bub=z_RYT$RXJouiYFRCYK$i>P5e+7%XQCO+j?kO5yp(es%6g$=Sq6Id_JlW~-Hz_# zh&;|fms5w{<5|{xMvJK5rI?d0hw%9%o+y+03#{)X*@ehlBN_*C#h7DGXHdw=klu5w z$#l`oM1fZ;MajY<{vb3ub8ROLXKi&{A)OWkbGmk>DM_;-ne^zF-Bu0SuKw_s)ugIB z+GTag>cXui=Uk}ckabB7B;gX?E@4gZ-mgC~m#Pz#Sb26<%F%n#gAoz7P^>-$S&y~ zoMO>zC1QW936#~&qH)8Tx06}^fazPKm(0zhw~;`NvuNDRpoq*_dyY5I#p%0f0GMU8 zB`zOSAWS-&kKvV@1a|8+LVr*VBQ-}*e(6oaIW?$U#b?lUt$`ZD-&#!0u@Ms4cgy9Q1 zf{3lZ2u1{cH%?m4t})`8dZ1ZWnuH?fD+Pas&FWEYWk!>j+iN)tUZks)qknjBM_@zd3d=>SL$iSR={J#}I&uV>t}<4fQIE@d9HrPJ+l!hBz8-=lD!(TUbIf z5!PXn4iD4XXl7FsX0xy`nt+z>3pre;BNz~$%dG|*G0dC!DSEpkG6AM7*v28$ovmPW zA+7mm4m|G<`w&BEj~Gir-9A^;N3G}Xa6MQeu7I}ylI^&$e`iOqr!4!Z-M>P*`+iO`jhOY*sSO4x%+?C%uQR zJ%SUlTv&2cMKByKy17lrs?nT^E|b+n9!Teb2xqhz9H46sh>cUHz&P?pJp+Mahc_^+ zoAciD0lj3^@SJ$GcpSkjS;Cp$EptmONDit1nt#K@h@~WEX33HhfSkzn4i%`DEaxAQ zc4?#D$~4su(ZtoAx}(yAfh_feG}zBtMu{$0)iNc7LV8Nj2-An`HG*N{dFK7mvW>nw zdj@v*4tLnGL0Cm}CQ+S3gw%UgVOpWWGgKkK zGuJ7!G9hIv7`Ww={$|9%%5F$!(8wb$cZUg~4rp5>tGN6!2xOMn!rN%3!VlEFNXIGf zA*Q{O+2C~e;8Y0Cfsk{;coJjFsVAB5qCO7|WjmMZFEZx5&C>KUCDg>8bKF8v>jk)W z?NABK4KJh`&N1p;Ckfq?*Y?lN%W)f3CtROQuxn6+b>kBSV#)Y~rlQ2|9B6|V$3j_IoZ~_Z!RjgHx|8>6 z6tq;E{;v5==P|2WeQ1X)Q3_9ErhPaUCW}aJ#~*J`kq*pq{B#vLd{TeXQnT;cm88u8 zOHNuc7n+G88@96kC7nqdipIv3mr-I*Uw?l`@c5@W4+}>1gLYC3UN*g%s4lba}CTams-umLs_kQjYZiAug5=grrT|G^#u>+3U(rlF^4cyRI zO+lA0$_&lAxS7TTH|15Wl);n2ASE@-vwX%a^kT1F6?ZU3sjZD5&&2phg*xS5o{V*v zw6kOZAaG8)y%b88CD_VW*dbLUpo=sEte~_++n)WB@}qwk^lC;oI=(CsuzmY_?7qt!LB&dtBemX~o{Gj5hWF+1wdiP|9-e|>pn zr_p*E*w9iWGxMeq;lFOyW{t!$2Ue1r#f4Al6mpYgiQ0IXW=aMGa?22m50m&9FN=}* zh;^ZKA?AA}VpGxWM{pX-xuo(s5y#RJO^_i@k@GEui1KOZD@ivNJo}vRgG5mxir5wGWUhrRf(3OycW8}zlEi?J8vYt5jX6nzkMj`|nUp}1d1yZx86W)|Us6;RP^vFp_)>lf zTZWBp%va8E=(n4}E;Kd^Wo(`Z{BFMd|6D5U*-uWif?(DrNlCj}vX6eBkL$rSz2i#z zA3hKR9cl>g=Wy!){R(Luj3#4jO=_VfvEZnwTdyE;W(830_+@=UY#*11N#^f;rY(M* z40=Ki-3Yx#1{6aCjngc7n~7u^mGgO=*sf_QSrdvbt$m|P*vBgLS(IBEFPloH57_x# z2nmd2HTm%1u8s!VZkeJ+=3{fVmS19UW%kTY_hNApf@p%sx0;eyK-@e3O{$y2LGFw% zOhp7EWJ!8Z+DlY2l%!hyM|TL*QuEU9JrMk(nuzK2mc;Rtm^%?)7pB_ET(IzdWHFeO!d zPIY=X&7KZKvKG^Y4#@zEdSnNCDFyB&9o@P@IinH99RlgCi{$ z)rBTxvW=mx;s0aiP}EOVEcHk8Z)XOB9hBte6y%p-Ln8x1#2#`^Agjo5s+$j4y36sp z|H@evy1U#JxS_~i?WGe4Wbsy@8>@p%JJe1gI}*)KL*s}!(X_BQ#R*=Cj@&;ug1I0` z)%0{URGbRT>L!DnbvM$xd!G$se8Ax*ie=}e)t1W`ldY?SZJ6d~hlWYxsbee?k|ULw zOxkVdGOL}!)GzT$qy=H?J=F~l=_zX_ut!D*G5G2Ov&@3?hNM4sScp-M25%O^oJvWM zL0pbI7`$j4-(NE>S0kj7P~Ap4Cey$aa%Aa7kOpOg*^zXash{K40d2}B?Q=?;v%a;l zKvT?S&(r3NT}}qMo~OJTqnXkrL1J35wYQ{HqautV=W5l=Ga*$ni(u8VCEq$X3O0fj z?f5n~T*)n<@sU&Nag7hAu6P~h<`uwLlLu0^`PW3ls&kgqi_S!2uTeuxn#Qx+EXUy< z`7ziZ$WhkL^vZ;Hb0O9c*qcufSpx^%NXCVBo4N*0d9!JxRP<%sKsggXjuSu9c^E1* zIkxmuGJgAW-fk>tXO^53vUG6cF^|Sn33D4*k(}}d)$<(krUd;FZ;9_9nGeTU+e0nb zFC^KOZV|&6HLv1EYooD|;f?sQR|vN$35OqRIARo`8`=t04N6FR-Y|$J%|x{bWNuaq zl&m>h62>12$Ka2KqO(vXyQFksMyetAjrQ2QO8w;FKEF~VRVUqHakG&~k@UnmFCZ@$ z8|M+BT!k4H9MFvFoNc8A zFpiVSOM*I@L4{3dksLV3*b%T3J$)|;)oH@%T#gE=#Z za${>rLtvhHMW17pMrjcjKTx%mI39nbjTlO#Yv1(soBA#z)gfpomS)qAC=UL z9vCbw+6qZ($ZCiM@sFKjmZZ);tJ<?YzAVVJ zR;AC_qrpjC-PzO0NqNY<2}Ze0e5YsV@kQGWye5(`L`&d3W68N1Ntei&o?gjX5Uoip zHE}z$a+Kbax}B4BS-Rm*)=RWe?a@eBBJBi8aHX;I#JyuAp}v*Ov?VK(lfKGg&#c@j z(>Lq2NlDPa{n`y=nBP4;htf?~tp#aXjAU+Ia=sKm-UZ0PnuX;2J?4^A3DM*%KI`ai zevG3sV8>&h##bMdLM)j7Rf-RlX6Zqw$xjaM;{@sYWX#I~Rgx77ID(rxCOW)7g8wp) zv8!J3#xOu3f@_@Vl{s^1d%7j9l=O7%F-%qlnb1kaMSal1Bpt!MNQ_39n<6@9johd7 zoW5nxVf$XzTDm<5c{{hy??4T&!E9poZZ_i7J}aA7=HMSGPQg=I$g^T#5!kJ3P!7>7 z>j|`(MMc%7So~t{z42P*I7T*NJhcz&xn{%(bv;EAo(L#QW z)9BR5*>UU){N>XXqa^9N>GuDcwEUd>>eA3^tZ5*IwUs2Nj{B4J%);l&HEhabirVE7 zY&WIzZ;N9&CQu2^(^BqKgtTAlJf}MKK$6sgn38J>5IRVzUbEHR^DT}cYGLa~lJf!^ zdTh2W!-dLL8Tdm3+qL7wG!Cb3M1h-az6fEw+|T*XxAz`Gnt-7@S2|7eOn$I2FUR0oe_1K(3Eg(;0)TJD}gQrqI|k87(PH zw)GVHyPYBoD~U(E-u&ulX_!I`{HcYikXywrah@o6Hq96%Vcb(jIOrjrO6$peDoYM1 zq+3Ao#-#m#nZ$4l4wtT*%~GZr?PHxHjG*%ym?&wgDU26by`n9Ebta1@Lo`icR-^Z-D5ry+Ybaf;iIc<5HnbH4X+7Xc;#f*g_A|qp&`iiHualP0r?_?EM_CER?03tZtLb63gr!sZ~jM^N8nzm@<&Sk6{-TyySDYW|l literal 0 HcmV?d00001 diff --git a/third_party/make/po/hr.po b/third_party/make/po/hr.po new file mode 100644 index 00000000000..b43c9d16b7c --- /dev/null +++ b/third_party/make/po/hr.po @@ -0,0 +1,2522 @@ +# 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. +# +# Hrvoje Niksic , 2002. +# Tomislav Krznar , 2012. +# Božidar Putanec , 2016, 2018, 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-06 11:39-0800\n" +"Last-Translator: Božidar Putanec \n" +"Language-Team: Croatian \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 19.04.3\n" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "pokušaj upotrebe nepodržane značajke „%s“" + +#: src/ar.c:123 +#, c-format +msgid "touch archive member is not available on VMS" +msgstr "" +"u VMS sustavu nije moguće „touch“ (promijeniti vrijeme modifikacije)\n" +"člana arhive" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: arhiva „%s“ ne postoji" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: „%s“ nije valjana arhiva" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: član arhive „%s“ ne postoji u arhivi „%s“" + +#: src/ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: ar_member_touch() na „%s“ nije uspjela" + +#: src/arscan.c:130 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module() nije uspjela izvući obavijesti o modulu, status = %d" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() nije uspjela, status = %d" + +#: 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 člana %d" + +#: src/arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Član arhive „%s“%s: %ld bajtova na adresi %ld (%ld).\n" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (može biti da je skraćeno)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: 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" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Recept ima previše redaka (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Prekid.\n" + +#: src/commands.c:628 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Član arhive „%s“ je možda lažan; nije izbrisani" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Član arhive „%s“ je možda lažan; nije izbrisani" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Briše se datoteka „%s“" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Briše se datoteka „%s“" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# pokrenuti recept" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (ugrađeno):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (iz „%s“, redak %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Direktoriji\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# nije bilo moguće dobiti status od %s.\n" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "" +"# %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 +#: 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 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. +#: 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 bilo moguće otvoriti.\n" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (ključ %s, vrijeme zadnje izmjene %I64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (uređaj %d, inode [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (uređaj %ld, inode %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Ne" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " datoteke, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "ne" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " nemogućnosti" + +#: src/dir.c:1154 +msgid " so far." +msgstr " do sada." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " nemogućnosti u %lu direktorija.\n" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekurzivna varijabla „%s“ ukazuje na samu sebe (u konačnici)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "nedovršena referencija na varijablu" + +#: src/file.c:278 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Recept za datoteku „%s“ bio je naveden u %s:%lu," + +#: src/file.c:283 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Recept za datoteku „%s“ je pronađen u implicitnim pravilima," + +#: src/file.c:287 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "ali „%s“ se sada smatra istom datotekom kao i „%s“." + +#: src/file.c:290 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "Recept za „%s“ će se ignorirati a koristit će se „%s“." + +#: src/file.c:310 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" +"ne može se preimenovati „%s“ s jednom dvotočkom u „%s“ s dvije dvotočke" + +#: src/file.c:316 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" +"ne može se preimenovati „%s“ s dvije dvotočke u „%s“ s jednom dvotočkom" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Briše se privremena posredna datoteka „%s“" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Uklanjanju se privremene posredne datoteke...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Trenutačno vrijeme" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Vremenski žig je izvan granica raspona; zamjenjuje se s %s" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Nije cilj (target):" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Vrijedna (precious) datoteka (preduvjet za .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Lažni (phony) cilj (preduvjet za .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Cilj naredbenog retka." + +# Zadan > standardni +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Zadani Makefile, MAKEFILES, ili include/sinclude-makefile" + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Ugrađeno pravilo" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Provedeno je pretraživanje pomoću implicitnih pravila." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Nije provedeno pretraživanje pomoću implicitnih pravila." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Implicitni ili statički korijen uzorka: „%s“\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Datoteka je privremeni posredni preduvjet." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Također napravi:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Nikad nije provjereno vrijeme zadnje izmjene" + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Datoteka ne postoji." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Datoteka je vrlo stara." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Vrijeme zadnje promjene %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Datoteka je bila ažurirana." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Datoteka nije bila ažurirana." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Recept koji se još uvijek izvršava (OVO JE PROGRAMSKA GREŠKA)." + +#: src/file.c:1065 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" +"# Recept za ovisnosti koji se još uvijek izvršava (OVO JE PROGRAMSKA GREŠKA)" + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Uspješno ažurirano." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Ažuriranje je nužno (opcija -q je dana)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Ažuriranje nije uspjelo." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Nevaljana vrijednost u command_state članu!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Datoteke" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# status datoteka hash-tablice:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Polja „%s“ nema u predmemoriji (nije cached): %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "prvi argument funkcije „word“ nije broj" + +#: src/function.c:799 +#, c-format +msgid "first argument to 'word' function must be greater than 0" +msgstr "prvi argument funkcije „word“ mora biti veći od 0" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "prvi argument funkcije „wordlist“ nije broj" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "drugi argument funkcije „wordlist“ nije broj" + +#: src/function.c:1533 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) nije uspješna (e=%ld)\n" + +#: src/function.c:1557 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_open_pipe: DuplicateHandle(Err) nije uspješna (e=%ld)\n" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() nije uspješna (e=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() nije uspješna\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Izbrisana je privremena (batch) datoteka %s.\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "datoteka: nema imena datoteke" + +#: 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 "datoteka: previše argumenata" + +#: 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 "datoteka: nevaljana operacija na datoteci: %s" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "nedovoljan broj argumenata (%d) za funkciju „%s“" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "nije implementirana na ovoj platformi: funkcija „%s“" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "nedovršeni poziv funkciji „%s“: nedostaje %c" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Prazno ime funkcije" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Nevaljani naziv funkcije: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Naziv funkcije je predugačak: %s" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "Nevaljani minimalni broj argumenata (%u) za funkciju %s" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "Nevaljani maksimalni broj argumenata (%u) za funkciju %s" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: opcija „%s“ je dvosmislena\n" + +#: src/getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: opcija „--%s“ ne dopušta argument\n" + +#: src/getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: opcija „%c%s“ ne dopušta argument\n" + +#: src/getopt.c:705 src/getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: opcija „%s“ zahtijeva argument\n" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: neprepoznata opcija „--%s“\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%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"), +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: nepropisna opcija -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: nevaljana opcija -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: opcija „-W %s“ je dvosmislena\n" + +#: src/getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: opcija „-W %s“ ne dopušta argument\n" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Proširuje se „%s“\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Procjena „%s“\n" + +#: src/hash.c:50 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "ne može dodijeliti %lu bajtova za hash-tablicu: nema dovoljno memorije" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Opterećenje=%lu/%lu=%.0f%%, " + +#: src/hash.c:282 +#, c-format +msgid "Rehash=%u, " +msgstr "Rehash=%u, " + +# možda bi bolje bilo > Kontradikcije +#: src/hash.c:283 +#, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Sudari=%lu/%lu=%.0f%%" + +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Potraga za implicitnim pravilom za „%s“.\n" + +#: src/implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Traži se implicitno pravilo za člana arhive za „%s“\n" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Sprječavanje rekurzije implicitnog pravila.\n" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Predugi korijen uzorka: „%s%.*s“.\n" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Isprobava se pravilo s korijenom uzorka „%.*s“.\n" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Odbija se nemogući preduvjet pravila „%s“.\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Odbija se nemogući implicitni preduvjet „%s“.\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Isprobava se pravilo preduvjeta „%s“.\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Isprobava se implicitni preduvjet „%s“.\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Nađeni preduvjet „%s“ kao VPATH „%s“\n" + +#: src/implicit.c:786 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Potraga za pravilom s privremenom posrednom datotekom „%s“.\n" + +#: src/job.c:370 +msgid "Cannot create a temporary file\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. +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (**krah**: stanje memorije je dokumentirano!)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (ignorira se)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Greška %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Čeka se na nedovršene poslove...." + +# child > dijete > potomak; pridjev potamački +#: src/job.c:704 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Živi potomak (nedovršeni dijete-proces) %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 " (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. +#: src/job.c:899 +#, c-format +msgid "Reaping losing child %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) +#: src/job.c:950 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Čišćenje iza privremene (batch) datoteke %s\n" + +#: src/job.c:956 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Čišćenje iza privremene (batch) datoteke %s nije uspjelo (%d)\n" + +#: src/job.c:1071 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Potomak (dijete-proces) %p PID %s%s je uklonjen iz lanca.\n" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Oslobođen je token za potomka (dijete-procesa) %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() nije uspjela pokrenuti proces (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 argumenata izbrojeno je pri neuspjelom pokretanju\n" + +#: src/job.c:1642 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Umetanje potomka (dijete-procesa) %p (%s) PID %s%s u lanac.\n" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Dobiveni je token za potomka (dijete-procesa) %p (%s).\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: cilj „%s“ ne postoji" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: ažurira cilj „%s“ za potrebe: %s" + +#: src/job.c:2108 +#, c-format +msgid "cannot enforce load limits on this operating system" +msgstr "ne mogu se nametnuti granice opterećenja na ovom operacijskom sustavu" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +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 +#: src/job.c:2200 +#, c-format +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"nema više datotečnih kvačica: nije se mogao duplicirati standardni ulaz\n" + +# stdout > standardni izlaz +#: src/job.c:2212 +#, c-format +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"nema više datotečnih kvačica: nije se mogao duplicirati standardni izlaz\n" + +# stderr > standard error +#: src/job.c:2226 +#, c-format +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" +"nema više datotečnih kvačica: nije se mogao duplicirati\n" +"standardni izlaz za greške\n" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Nije moguće obnoviti standardni ulaz\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Nije moguće obnoviti standardni izlaz\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Nije moguće obnoviti standardni izlaz greški\n" + +#: src/job.c:2520 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"make je počistio potomka (dijete-proces) PID %s, ali još uvijek čeka na PID " +"%s\n" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: može biti da u okolini nema dovoljno prostora" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "Varijabla $SHELL se promijenila (prije „%s“, sada „%s“)\n" + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Stvara se privremena (batch) datoteka %s\n" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Sadržaj (batch) datoteke:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Sadržaj (batch) datoteke:%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 (redak %d) Loši kontekst ljuske (!unixy && !batch_mode_shell)\n" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Otvaranje globalne tablice simbola nije uspjelo: %s" + +#: 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" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Simbol %s iz %s nije uspjelo učitati: %s" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Prazno ime simbola za učitati: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Učitava se simbol %s iz %s\n" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Opcije:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m ignorira se zbog kompatibilnosti\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make bezuvjetno napravi sve ciljeve\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIREKTORIJ, --directory=DIREKTORIJ\n" +" prije početka rada prijeđe u DIREKTORIJ\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr " -d ispisuje puno podataka za debugiranje\n" + +#: src/main.c:345 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=ZASTAVICE] ispisuje razne vrste informacija za " +"debugiranje\n" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" učini da „make“ rabi varijable okoline " +"umjesto\n" +" tih istih varijabli iz Makefiles\n" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr " -E STRING, --eval=STRING evaluira STRING kao Makefile direktivu\n" + +#: 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" +" čita i koristi DATOTEKU kao Makefile\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help ova pomoć\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors ignorira sve greške u receptima\n" + +#: 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 include-Makefiles u DIREKTORIJU\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] dopušta N istovremenih poslova; ako se " +"izostavi\n" +" argument N, nema ograničenja broju poslova\n" + +#: src/main.c:364 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going nastavlja raditi (iako se neki od ciljeva\n" +" ne mogu napraviti).\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" +" ne pokreće više poslova istovremeno ako\n" +" je opterećenje veće od 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 od simboličke veze i njezinoga cilja koristi\n" +" se kasnije vrijeme izmjene (mtime)\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" +" 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. +#: 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 obnavlja DATOTEKU jer je vrlo stara\n" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" +" -O[TYPE], --output-sync[=TIP]\n" +" TIP sinkronizacije izlaznih paralelnih " +"poslova\n" + +#: src/main.c:380 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base ispiše internu bazu podataka „make“ programa\n" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question ne pokreće recepte; izlazni status pokaže\n" +" jesu li aktualni\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\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" + +#: src/main.c:392 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" ukida opciju -k\n" + +#: src/main.c:395 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch „touch“ (ažurira vrijeme) ciljeve umjesto\n" +" da ih iznova napravi\n" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr "" +" -d ispisuje informacije praćenja (tracing)\n" + +#: src/main.c:399 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version informacije o ovoj inačici programa\n" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory ispiše trenutačni direktorij\n" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory ukida opciju -w (čak i ako je implicirana)\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 DATOTEKA, --what-if=DATOTEKA, --new-file=DATOTEKA, --assume-" +"new=DATOTEKA\n" +" smatra da je DATOTEKA zauvijek nova\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables upozori na referiranje nedefinirane varijable\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "prazni string nije valjano ime datoteke" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "nepoznata specifikacija „%s“ za razinu dijagnostike" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "nepoznati tip sinkronizacije izlaza „%s“" + +#: src/main.c:849 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Prekid/iznimka primljena (kȏd = 0x%lx, adresa = 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" +"Filtar neobrađene iznimke pozvan je iz 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 "Povreda prava pristupa: operacija pisanja na adresi 0x%p\n" + +#: src/main.c:865 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Povreda prava pristupa: operacija čitanja na adresi 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() postavlja 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() pretragom staze postavlja default_shell = %s\n" + +# parent > roditelj > predak; pridjev predački +#: src/main.c:1609 +#, c-format +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"upozorenje: jobserver nije dostupni: koristi se -j1.\n" +"Dodajte „+“ make pravilu pretka (parent)" + +#: 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." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefile je dva puta naveden na standardnom ulazu." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (privremena datoteka)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (privremena datoteka)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Povratak na način rada s jednim poslom (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "Simboličke veze nisu podržane: onemogućuje se -L." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Ažuriraju se Makefiles....\n" + +#: 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 ponovno napraviti.\n" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Nije uspjelo ponovno napraviti Makefile „%s“." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "„%s“ include-Makefile nije bio pronađen." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefile „%s“ nije pronađen" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Ne bilo moguće vratiti se u izvorni direktorij." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Ponovno izvršavanje[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (privremena datoteka): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL sadrži više od jednoga cilja" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Nema ciljeva" + +#: 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 "Ažuriraju se ciljevi....\n" + +#: src/main.c:2610 +#, c-format +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"upozorenje: Otkriveni je problem sa satom. Kompilacija možda nije kompletna." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uporaba: %s [opcije] [cilj] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Ovaj program je proizveden za %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Ovaj program je proizveden za %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Greške (bugs) na engleskom javite na \n" +"Pogreške u prijevodu i vaše prijedloge javite na \n" + +#: src/main.c:2901 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "opcija %s%s zahtijeva neprazni string za argument" + +#: src/main.c:2965 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "opcija -%c zahtijeva pozitivni cijeli broj za argument" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sProizvedeno za %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sProizvedeno za %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLicencija GPLv3+: GNU GPL inačica 3 ili kasnija\n" +"v. \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 \n" +"\n" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# „Make“ baza podataka, ispisana na %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Gotova „Make“ baza podataka je spremna na %s\n" + +# Da prevedem ovo? +#: src/misc.c:643 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: korisnik %lu (stvarni %lu), grupa %lu (stvarna %lu)\n" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Pristup je iniciran" + +#: src/misc.c:743 +msgid "User access" +msgstr "Pristup korisnikom" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Pristup make-om" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Pristup potomkom (dijete-proces)" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Unos nepoznatoga direktorija\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Nema nepoznatoga direktorija\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Ulazi se u direktorij „%s“\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Izlazi se iz direktorija „%s“\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Unos nepoznatoga direktorija\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Nema nepoznatoga direktorija\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Ulazi se u direktorij „%s“\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Izlazi se iz direktorija „%s“\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "greška pisanja: standardni izlaz (stdout)" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Zaustavljeno.\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 "" +"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. +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "stvaranje cijevi za poslove" + +# http://make.mad-scientist.net/papers/jobserver-implementation/ +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "stvaranje kopije cijevi za poslove" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "inicijalizacija cijevi jobservera" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "**interna greška**: nevaljani string „%s“ za --jobserver-auth" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (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. +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "cjevovod (pipeline) jobservera" + +# Što bi ovdje trebalo ići? +# bp: iz izvornog kȏda, možda ovo. +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "zapis jobservera" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "čitanje iz cijevi poslova" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Čitaju se Makefiles...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Čita se Makefile „%s“" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (nema zadanog cilja)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (staza pretraživanja)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (nije važno)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (bez proširivanja znaka ~)" + +#: src/read.c:655 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "Preskače se UTF-8 BOM u Makefile „%s“\n" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Preskače se UTF-8 BOM u Makefile međuspremniku\n" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "nevaljana sintaksa u uvjetnom izrazu" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: učitavanje nije uspjelo" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "recept započinje prije prvog cilja" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "nema pravila prije recepta" + +#: src/read.c:1136 +#, c-format +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr "nema separatora (Mislili ste TAB umjesto 8 razmaka?)" + +# Grr, živjela engleska množina! I što sad da radim s onim %s-om? +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "nema separatora" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "nema uzorka za cilj" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "nekoliko uzoraka za cilj" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "uzorak cilja ne sadrži „%%“" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "nema „endif“" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "prazno ime varijable" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "suvišni tekst nakon „define“ direktive" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "nema „endef“, nedovršeni „define“" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "suvišni tekst nakon „endef“ direktive" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "suvišni tekst nakon „%s“ direktive" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "suvišni „%s“" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "samo jedan „else“ po uvjetnom izrazu" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Deformirana definicija varijable specifične za cilj" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +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" + +#: src/read.c:2029 +#, c-format +msgid "mixed implicit and static pattern rules" +msgstr "pomiješana su implicitna i statička uzorak-pravila" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "pomiješana su implicitna i normalna pravila" + +#: src/read.c:2107 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "cilj „%s“ se ne podudara s uzorkom cilja" + +#: src/read.c:2122 src/read.c:2168 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "ciljna datoteka „%s“ sadrži „:“ i „::“" + +#: src/read.c:2128 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "cilj „%s“ je naveden više od jedanput u istom pravilu" + +# prebrisati> brišući ukloniti, brišući poništiti, prebrisati dio teksta, odbaciti +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "upozorenje: ignorira se recept za cilj „%s“" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "upozorenje: ignorira se stari recept za cilj „%s“" + +#: 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" + +# 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čitani je NUL znak; ostatak retka se ignorira" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Nema ništa za napraviti za „%s“." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "„%s“ je ažurirani." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Čišćenje datoteke „%s“.\n" + +#: src/remake.c:389 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sNema pravila za izradu cilja „%s“ koji je potrebni za „%s“%s" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sNema pravila za izradu cilja „%s“%s" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Razmatra se ciljna datoteka „%s“.\n" + +#: src/remake.c:432 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Nedavni pokušaj ažuriranja datoteke „%s“ nije uspio.\n" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Datoteka „%s“ je već bila razmatrana.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Datoteka „%s“ se još uvijek ažurira.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Ažuriranje datoteke „%s“ je završeno.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Datoteka „%s“ ne postoji.\n" + +#: 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 „%s“ ima\n" +" vremensku oznaku visoke rezolucije" + +#: src/remake.c:507 src/remake.c:1039 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Pronađeno je implicitno pravilo za „%s“.\n" + +#: src/remake.c:509 src/remake.c:1041 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Nijedno implicitno pravilo nije pronađeno za „%s“.\n" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Rabi se zadani recept za „%s“.\n" + +#: 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." + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Preduvjeti za ciljnu datoteku „%s“ su gotovi.\n" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Preduvjeti za „%s“ se izrađuju.\n" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Odustaje se od izrade ciljne datoteke „%s“.\n" + +#: src/remake.c:699 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Cilj „%s“ nije bio zbog grešaka ponovno izrađen." + +# 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 +#: 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 (normalno, make uvijek preradi\n" +"recepte kad god se izmjeni vremenska oznaka na bilo kojem objektu).\n" + +#: src/remake.c:756 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Preduvjet „%s“ za cilj „%s“ ne postoji.\n" + +#: src/remake.c:761 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Preduvjet „%s“ je noviji nego od od njega ovisni cilj „%s“.\n" + +#: src/remake.c:764 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Preduvjet „%s“ je stariji nego od od njega ovisni cilj „%s“.\n" + +#: src/remake.c:782 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Cilj „%s“ je s dvije dvotočke i nema preduvjeta.\n" + +#: src/remake.c:789 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" +"Nema recepta za „%s“ i zapravo nijedan od preduvjeta nije promijenjen.\n" + +#: src/remake.c:794 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "„%s“ se zbog zastavice always-make ponovno izrađuje.\n" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Nema potrebe preraditi cilj „%s“" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; rabi se naziv „%s“ za VPATH" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Cilj „%s“ se mora preraditi.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Zanemaruje se naziv „%s“ za VPATH.\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Recept za „%s“ se upravo izvršava.\n" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Prerada ciljne datoteke „%s“ nije uspjela.\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Ciljna datoteka „%s“ je uspješno prerađena.\n" + +#: src/remake.c:852 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Ciljnu datoteku „%s“ treba ponovno preraditi s opcijom -q.\n" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Rabe se zadane naredbe za „%s“.\n" + +#: src/remake.c:1422 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "" +"Upozorenje: Vremenska oznaka modifikacije datoteke „%s“ je za\n" +" %s sekunda u budućnosti" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS član „%s“ nije uzorak" + +# Customs' is literal (a library name). See README.customs. +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %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 "" + +#: src/rule.c:530 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Implicitna pravila" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Nema implicitnih pravila." + +#: src/rule.c:548 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u implicitnih pravila, %u (%.1f%%) terminal" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: pogrešna num_pattern_rules! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "nepoznati signal" + +# Keep signal names in sync with GNU libc translations. +#: src/signame.c:92 +msgid "Hangup" +msgstr "Terminal zatvoren (SIGHUP)" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Prekini (SIGINT)" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Završi" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Nepropisna instrukcija" + +# Breakpoint trap just means the processor has hit a breakpoint.Your process is running more than one thread. +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Trace/breakpoint (SIGTRAP)" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Prekid (SIGABRT)" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "IOT zamka (SIGIOT)" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "EMT zamka (SIGEMT)" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Iznimka (broja) pomičnog zareza (SIGFPE)" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Ubijen (SIGKILL)" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Sabirnička greška (SIGBUS)" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Segmentacijska greška (SIGSEGV)" + +#: src/signame.c:130 +msgid "Bad system call" +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 +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Prekinuta cijev (SIGPIPE)" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Budilica (SIGALRM)" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Završeno (SIGTERM)" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Korisnikom definiran signal 1 (SIGUSR1)" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Korisnikom definiran signal 2 (SIGUSR2)" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Potomak (child process) je završio (SIGCHLD)" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Prekinuto napajanje (SIGPWR)" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Zaustavljeno" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Zaustavljeno (tty ulaz) (SIGTTIN)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Zaustavljeno (tty izlaz) (SIGTTOU)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Zaustavljeno (signal) (SIGSTOP)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Prekoračeno je vremensko ograničenje procesora (SIGXCPU)" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Prekoračeno ograničenje veličine datoteke (SIGXFS2)" + +# Kako prevesti "virtual timer"? +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtualni tajmer je istekao (SIGVTALRM)" + +# Kako prevesti "profiling timer"? +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Isteklo je vrijeme za profiliranj (SIGPROF)" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Promjena veličine prozora (SIGWINCH)" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Nastavlja se (SIGCONT)" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Hitno U/I stanje" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +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. +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Resurs je izgubljen (SIGLOST)" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Signal za opasnost (SIGDANGER)" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Zahtjev za informacijom (SIGINFO)" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Koprocesor za rad s pomičnim zarezom/točkom nije dostupan (SIGNOFP)" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Nema međuspremnika za 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 međuspremnici: %lu (%lu) / stringova = %lu\n" +" pohrana = %lu B / prosjek = %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 trenutačni međuspremnik: veličina = %hu B / korišteno = %hu B\n" +" broj = %hu / prosjek = %u B\n" + +#: src/strcache.c:319 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s ostalo korišteno: ukupno = %lu B / broj = %lu / prosjek = %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 ostalo slobodno: ukupno = %lu B / max = %lu B / min = %lu B\n" +" prosjek = %hu B\n" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s strcache učinkovitost: pretraga = %lu / pogodaka = %lu%%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# statistika hash-tablice:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automatsko" + +#: src/variable.c:1656 +msgid "default" +msgstr "zadano" + +#: src/variable.c:1659 +msgid "environment" +msgstr "okolina" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "Makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "okolina pod -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "naredbeni redak" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "„override“ direktiva" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (iz „%s“, redak %lu)" + +# https://en.wikipedia.org/wiki/Hash_table +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# statistika varijabli u hash-tablici:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Varijable\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Vrijednosti varijabli specifične za uzorke" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Nema vrijednosti varijabli specifične za uzorke." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u vrijednosti varijabli specifične za uzorke" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "upozorenje: nedefinirana varijabla %.*s" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "neuspješna sys$search() s greškom %d\n" + +#: 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" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "UGRAĐENI 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 "Izlaz pripojen na kraj %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "%.*s pripojiti i počistiti\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Umjesto toga izvršava se %s\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH staza za pretraživanje\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Nema „vpath“ staze za pretraživanje." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u „vpath“ staza za pretraživanje.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Nema općenite („VPATH“ varijable) staze za pretraživanje." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Općenita („VPATH“ varijabla) staza za pretraživanje:\n" +"# " + +# 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 "Jobserver broj mjesta je ograničen na %d\n" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "kreiranje semafora jobservera: (Greška %ld: %s)" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" +"**interna greška**: nije moguće otvoriti semafor\n" +" jobservera „%s“: (Greška %ld: %s)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Klijent jobservera (semafor %s)\n" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "oslobađanje semafora jobservera: (Greška %ld: %s)" + +#: src/w32/w32os.c:194 +#, c-format +msgid "semaphore or child process wait: (Error %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 "# Nevaljana vrijednost u elementu „update_status”!" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Greška 0x%x (zanemarena)" + +#~ msgid "*** [%s] Error 0x%x" +#~ msgstr "*** [%s] Greška 0x%x" + +#~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +#~ msgstr "Pozivam recept iz %s:%lu za ažuriranje mete „%s”.\n" + +#~ msgid "Invoking builtin recipe to update target `%s'.\n" +#~ msgstr "Pozivam ugrađeni recept za ažuriranje mete „%s”.\n" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "interna greška: višestruko pojavljivanje opcije --jobserver-fds" + +# Treba li ovo prevesti? +#~ msgid "dup jobserver" +#~ msgstr "dup poslužitelj poslova" + +#~ msgid "virtual memory exhausted" +#~ msgstr "virtualna memorija iscrpljena" + +# Što bi ovdje trebalo ići? +#~ msgid "write error" +#~ msgstr "greška pisanja" + +#~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +#~ msgstr "%s # strcache međuspremnika: %d (* %d B/međuspremniku = %d B)\n" + +#~ msgid "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# statistike strcache tablice raspršivanja:\n" +#~ "# " + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Upozorenje: Prazno preusmjeravanje\n" + +#~ msgid "internal error: `%s' command_state" +#~ msgstr "interna greška: „%s” command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "UGRAĐEN [%s][%s]\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "UGRAĐEN RM %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Nepoznata ugrađena naredba „%s”\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Greška, prazna naredba\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Preusmjeren ulaz iz %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Preusmjerene greške u %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Preusmjeren izlaz u %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Greška pri pokretanju, %d\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Greška u sintaksi, još uvijek unutar '\"'\n" + +# Nepožetene ili nepožnjete? +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Dobio SIGCHLD; %u nepožetene djece.\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-upozorenje, CTRL-Y će ostaviti potproces(e) na životu.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Nemojte koristiti -j ili --jobs ako sh.exe nije dostupan." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Resetiram make u mȏd jednog posla." + +#~ 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 "" +#~ "%sOvaj program je slobodan; u izvornom kodu nalaze se uvjeti kopiranja.\n" +#~ "%sNema NIKAKVOG jamstva, čak ni za PROIZVODNOST ili UPOTREBLJIVOST ZA\n" +#~ "%sPOJEDINU SVRHU.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "suvišan `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "prazna direktiva `ovverride'" + +#~ msgid "invalid `override' directive" +#~ msgstr "neispravna direktiva `override'" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "nedostaje naziv spisa za `%sinclude'" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "meta `%s' ostavlja prerekvizitni uzorak praznim" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Nijedan spis." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u spisa u %u raspršenih džepova.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# prosječno %.3f spisa po džepu, maks. %u spisa u jednom džepu.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DIREKTORIJ" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "Promijeni u DIREKTORIJ prije nego što išta napraviš" + +#~ msgid "FLAGS" +#~ msgstr "ZASTAVICE" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Zaustavi proces tako da se debugger može zakačiti" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "Varijable iz okoliša imaju veću važnost od makefilea" + +#~ msgid "FILE" +#~ msgstr "SPIS" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Pročitaj SPIS kao makefile" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Pretraži DIREKTORIJ za uključenim makefileovima" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Ne pokreći višestruke poslove osim ako je opterećenje ispod N" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "Nemoj zapravo pokrenuti nijednu naredbu; samo ih ispiši" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "Pretpostavi da je SPIS vrlo star i nemoj ga ponovo napraviti" + +#~ msgid "Don't echo commands" +#~ msgstr "Ne ispisuj naredbe" + +#~ msgid "Turns off -k" +#~ msgstr "Isključuje -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Smatraj SPIS beskonačno novim" + +#~ msgid "Entering" +#~ msgstr "Ulazim u" + +#~ msgid "Leaving" +#~ msgstr "Izlazim iz" + +#~ msgid "# No variables." +#~ msgstr "# Nema varijabli." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# prosječno %.1f varijabli po džepu, maks. %u u jednom džepu.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# prosječno %d.%d varijabli po džepu, maks. %u u jednom džepu.\n" diff --git a/third_party/make/po/id.gmo b/third_party/make/po/id.gmo new file mode 100644 index 0000000000000000000000000000000000000000..c66e93170b3fe079c8746d4dd5afb938d246bb9d GIT binary patch literal 40284 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

@IfWjvZyc*CeBMG#BDrYaguTph^TD6}J$V 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 literal 0 HcmV?d00001 diff --git a/third_party/make/po/id.po b/third_party/make/po/id.po new file mode 100644 index 00000000000..f2d870220cc --- /dev/null +++ b/third_party/make/po/id.po @@ -0,0 +1,2472 @@ +# Pesan Bahasa Indonesia untuk GNU make +# Copyright (C) 2006 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Arif E. Nugroho , 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU make 4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\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 \n" +"Language-Team: Indonesian \n" +"Language: id\n" +"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" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "usaha untuk menggunakan layanan yang tidak didukung: '%s'" + +#: src/ar.c:123 +#, c-format +msgid "touch archive member is not available on VMS" +msgstr "touch anggota archive tidak tersedia di VMS" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Archive '%s' tidak ada" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: '%s' bukan archive yang valid" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Anggota '%s' tidak terdapat dalam '%s'" + +#: 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'" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() gagal dengan status = %d" + +#: 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'" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (nama mungkin akan di potong)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Tanggal %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 "Recipe has too many lines (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Berhenti.\n" + +#: 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" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Anggota archive '%s' mungkin palsu; tidak dihapus" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Menghapus berkas '%s'" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Menghapus berkas '%s'" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# perintah untuk dijalankan" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (bawaan):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (dari '%s', baris %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Direktori\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: tidak dapat melihat statistik.\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +#, fuzzy +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (kunci %s, mtime %d): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (perangkat %d, inode [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (perangkat %ld, inode %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Tidak" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " berkas, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "tidak" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " tidak mungkin" + +#: src/dir.c:1154 +msgid " so far." +msgstr " sejauh ini." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " tidak mungkin dalam direktori %lu.\n" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Variabel rekursif '%s' menunjuk pada dirinya sendiri" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "referensi variabel tidak diselesaikan" + +#: 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," + +#: 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," + +#: 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'." + +#: 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'." + +#: 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'" + +#: 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'" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Menghapus berkas sementara '%s'" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Menghapus berkas sementara...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Waktu saat ini" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Timestamp diluar jangkauan; digantikan dengan %s" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Bukan sebuah target:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Berkas sebelumnya (dibutuhkan oleh .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Phony target (dibutuhkan oleh .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Baris perintah target." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Merupakan baku, MAKEFILES atau -include/sinclude makefile." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Tidak ada aturan implisit." + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Pencarian aturan implisit sudah selesai." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Pencarian aturan implisit belum selesai." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Pola/implisit atau statis stem: '%s'\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Berkas merupakan dibutuhkan untuk sementara." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Juga membuat:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Waktu ubah sudah diperiksa." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Berkas tidak ada." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Berkas sudah sangat tua." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Terakhir dimodifikasi %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Berkas sudah diperbarui." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Berkas belum diperbarui." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Perintah sedang berjalan (INI MERUPAKAN SEBUAH BUG)." + +#: src/file.c:1065 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Perintah ketergantungan sedang berjalan (INI MERUPAKAN SEBUAH BUG)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Sukses memperbarui." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Perlu untuk diupdate (-q diset)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Gagal untuk mengupdate." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Nilai yang salah dalam anggota 'command_state' !" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Berksa" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# berkas statistik hash-table:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Field '%s' not cached: %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "argumen pertama untuk fungsi 'word' bukan numerik" + +#: 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" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "argumen pertama untuk fungsi 'wordlist' bukan numerik" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "argumen kedua dari fungsi 'wordlist' bukan numerik" + +#: src/function.c:1533 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) gagal (e=%ld)\n" + +#: src/function.c:1557 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(Err) gagal (e=%ld)\n" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() gagal (e=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() gagal\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Membersihkan berkas batch sementara %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 "open: %s: %s" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "menulis: %s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, fuzzy, c-format +msgid "close: %s: %s" +msgstr "open: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "" + +#: src/function.c:2277 +#, fuzzy, c-format +msgid "read: %s: %s" +msgstr "menulis: %s: %s" + +#: src/function.c:2290 +#, fuzzy, c-format +msgid "file: invalid file operation: %s" +msgstr "Invalid file operation: %s" + +#: 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" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "Tidak terimplementasi dalam platform ini: fungsi '%s'" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "fungsi '%s' tidak diselesaikan: hilang '%c'" + +#: src/function.c:2667 +#, fuzzy, c-format +msgid "Empty function name" +msgstr "Empty function name\n" + +#: src/function.c:2669 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Invalid function name: %s\n" + +#: src/function.c:2671 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Function name too long: %s\n" + +#: 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" + +#: 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" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: opsi '%s' merupakan ambigu\n" + +#: src/getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: opsi '--%s' tidak memperbolehkan argumen\n" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: opsi tidak dikenali '--%s'\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: opsi tidak dikenali '%c%s'\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opsi tidak legal -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opsi tidak valid -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: opsi '-W %s' merupakan opsi ambigu\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expanding '%s'\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Evaluating '%s'\n" + +#: 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" + +#: src/hash.c:280 +#, fuzzy, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Beban=%ld/%ld=%.0f%%, " + +#: src/hash.c:282 +#, fuzzy, c-format +msgid "Rehash=%u, " +msgstr "Rehash=%d, " + +#: src/hash.c:283 +#, fuzzy, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Tabrakan=%ld/%ld=%.0f%%" + +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Mencari aturan implisit untuk '%s'.\n" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Menghindari aturan implisit rekursi.\n" + +#: src/implicit.c:484 +#, fuzzy, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Stem too long: '%.*s'.\n" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Mencoba aturan pola dengan stem '%.*s'.\n" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Menolak persyaratan aturan yang tidak mungkin '%s'.\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Menolak persyaratan implisit yang tidak mungkin '%s'.\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Mencoba persyaratan dari aturan '%s'.\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Mencoba persyaratan implisit '%s'.\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Menemukan persyaratan '%s' sebagai VPATH '%s'\n" + +#: src/implicit.c:786 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Mencari aturan dengan berkas sementara '%s'.\n" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Tidak dapat membuat berkas sementara\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (core di-dump)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (diabaikan)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, fuzzy, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s] Error %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Menunggu pekerjaan yang belum selesai...." + +#: 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" + +#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644 +#, c-format +msgid " (remote)" +msgstr " (remote)" + +#: src/job.c:898 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Reaping winning child %p PID %s %s\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Melepaskan token dari proses anak %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() gagal untuk menjalankan proses (e=%ld)\n" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Terhitung %d argumen gagal untuk dijalankan\n" + +#: 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" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Memperoleh token untuk proses anak %p (%s).\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: archive '%s' tidak ada" + +#: 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" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "tidak dapat memaksa mencapai batas beban: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Tidak dapat mengembalikan stdin\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Tidak dapat mengembalikan stdout\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Tidak dapat mengembalikan stderr\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: mungkin kehabisan ruang environment" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL berubah (sebelumnya '%s', sekarang '%s')\n" + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Membuat berkas batch sementara %s\n" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Batch file contents:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Batch file contents:%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 (baris %d) shell context tidak baik (!unixy && !batch_mode_shell)\n" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Failed to open global symbol table: %s" + +#: 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" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Failed to load symbol %s from %s: %s" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Empty symbol name for load: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Loading symbol %s from %s\n" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Opsi:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Diabaikan untuk kompatibilitas.\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Membuat semua target secara tidak " +"kondisional.\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORI, --directory=DIREKTORI\n" +" Pindah ke DIREKTORI sebelum melakukan apapun.\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Menampilkan banyak informasi debug.\n" + +#: src/main.c:345 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGS] Menampilkan berbagai tipe informasi debug.\n" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Variabel lingkungan memaksa makefiles.\n" + +#: src/main.c:350 +#, fuzzy +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f BERKAS, --file=BERKAS, --makefile=BERKAS\n" +" Baca BERKAS sebagai sebuah makefile.\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Tampilkan pesan ini dan keluar.\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Abaikan kesalahan dari perintah yang " +"dijalankan.\n" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIREKTORI, --include-dir=DIREKTORI\n" +" Cari di DIREKTORI untuk makefile yang " +"disertakan.\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] Ijinkan N kerja secara bersamaan. Kerja tidak " +"terhingga jika tidak diberikan argumen.\n" + +#: 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" + +#: 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" +" Jangan menjalankan multiple pekerjaan kecuali " +"beban dibawah 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 Gunakan waktu mtime terbaru diantara symlinks " +"dan target.\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" +" Jangan menjalankan perintah apapun; tampilkan " +"saja apa yang akan dikerjakan.\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 FILE, --old-file=BERKAS, --assume-old=BERKAS\n" +" Pertimbangkan BERKAS sudah sangat tua dan " +"jangan membuatnya lagi.\n" + +#: 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" +" Synchronize output of parallel jobs by TYPE.\n" + +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Tidak menjalankan perintah. Mengeluarkan " +"status saja dan mengatakan up to date.\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Jangan menampilkan perintah.\n" + +#: 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" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Matikan opsi -k.\n" + +#: src/main.c:395 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Sentuh target dari pada membuat kembali.\n" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr "" +" --trace Menampilkan banyak informasi debug.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Tampilkan directory saat ini.\n" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Matikan opsi -w, walaupun opsi ini diaktifkan " +"secara implisit.\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 FILE, --what-if=BERKAS, --new-file=BERKAS, --assume-new=BERKAS\n" +" Pertimbangkan BERKAS sebagai sebuah berkas " +"baru.\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Peringatkan akan adanya variabel yang tidak " +"terdefinisi yang direferensikan.\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "`string' kosong tidak valid sebagai nama file" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "spesifikasi tingkat debug tidak diketahui '%s'" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "unknown output-sync type '%s'" + +#: 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" + +#: 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" +"Exception filter tidak dapat diatasi dari program %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 "Akses dilanggar: operasi tulis pada alamat 0x%p\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/main.c:1609 +#, c-format +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." + +#: 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." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefile dari standard input dispesifikasikan dua kali." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (berkas sementara)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (berkas sementara)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Mereset kembali ke mode satu job (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "Symbolic links tidak didukung: menonaktifkan opsi -L." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Memperbarui makefiles....\n" + +#: 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" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Gagal membuat lagi makefile '%s'." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Makefile yang dimasukan '%s' tidak ditemukan." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefile '%s' tidak ditemukan" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Tidak dapat kembali ke direktori asal." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Menjalankan kembali[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (berkas sementara): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL berisi lebih dari satu target" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Tidak ada targets" + +#: 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" + +#: 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" + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Penggunaan: %s [opsi] [target] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Program ini dibuat untuk %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Program ini dibuat untuk %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "Laporkan bugs kepada \n" + +#: 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" + +#: 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" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sAplikasi ini dibuat untuk %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sAplikasi ini dibuat untuk %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLisensi GPLv3+: GNU GPL versi 3 atau sesudahnya \n" +"%sIni adalah aplikasi gratis: anda bebas untuk mengubah dan menyebarkannya.\n" +"%sTidak ada JAMINAN, sepanjang diperbolehkan oleh hukum.\n" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Membuat basis data, ditampilkan %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Selesai membuat basis data %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Akses terinisialisasi" + +#: src/misc.c:743 +msgid "User access" +msgstr "Akses pengguna" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Buat akses" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Akses anak" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Memasuki sebuah direktori yang tidak diketahui\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Meninggalkan sebuah direktori yang tidak diketahui\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Memasuki direktori '%s'\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Meninggalkan direktori '%s'\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Memasuki sebuah direktori yang tidak diketahui\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Meninggalkan sebuah direktori yang tidak diketahui\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Memasuki direktori '%s'\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Meninggalkan direktori '%s'\n" + +#: src/output.c:442 src/output.c:444 +#, fuzzy, c-format +msgid "write error: stdout" +msgstr "error menulis: %s" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Berhenti.\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[TYPE] (--output-sync[=TYPE]) is not configured for this build." + +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "membuat pipa pekerjaan" + +#: src/posixos.c:98 src/posixos.c:251 +#, fuzzy +msgid "duping jobs pipe" +msgstr "membuat pipa pekerjaan" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "inisiasi pipa server pekerja" + +#: src/posixos.c:119 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "internal error: tidak valid --jobserver-fds string '%s'" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Jobserver client (fds %d,%d)\n" + +#: src/posixos.c:138 +#, fuzzy +msgid "jobserver pipeline" +msgstr "inisiasi pipa server pekerja" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "menulis jobserver" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "membaca pipa pekerjaan" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Membaca makefiles...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Membaca makefile '%s'" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (tidak terdapat tujuan baku)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (jalur pencarian)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (tidak peduli)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (tidak terdapat ekspansi tilde ~)" + +#: src/read.c:655 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "Skipping UTF-8 BOM in makefile '%s'\n" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Skipping UTF-8 BOM in makefile buffer\n" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "sintak salah dalam kondisional" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: failed to load" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "perintah dijalankan sebelum target pertama" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "hilang aturan sebelum menjalankan perintah" + +#: 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?)" + +#: src/read.c:1138 +#, fuzzy, c-format +msgid "missing separator" +msgstr "pemisah %s hilang" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "pola target hilang" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "pola target banyak" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "pola target tidak memiliki '%%'" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "hilang 'endif'" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "nama variabel kosong" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "Kelebihan text sesudah 'endef' directive" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "hilang 'endef', tidak diselesaikan 'define'" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "kelebihan text sesudah 'endef' directive" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "kelebihan text sesudah '%s' directive" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "kelebihan '%s'" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "hanya satu 'else' dalam setiap kondisi" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Definisi variable target-specific memiliki format yang salah" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "persyaratan tidak dapat didefinisikan dalam script perintah" + +#: 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" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "aturan implisit dan aturan normal tercampur" + +#: src/read.c:2107 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "target '%s' tidak cocok dengan pola target" + +#: 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 ::" + +#: 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." + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "peringatan: memaksa perintah untuk target '%s'" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "peringatan: menghiraukan perintah lama untuk target '%s'" + +#: src/read.c:2254 +#, fuzzy, c-format +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "aturan implisit dan aturan normal tercampur" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Tidak ada yang harus dilakukan untuk '%s'." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "'%s' sudah baru." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Pruning file '%s'.\n" + +#: 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" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sTidak terdapat aturan untuk membuat target '%s'%s" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Mempertimbangkan berkas target '%s'.\n" + +#: 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" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Berkas '%s' baru saja dipertimbangkan.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Sedang memperbarui berkas '%s'.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Selesai memperbarui berkas '%s'.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Berkas '%s' tidak ada.\n" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Peringatan: .LOW_RESOLUTION_TIME berkas '%s' memiliki sebuah penanda " +"waktu dengan resolusi tinggi" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Menggunakan perintah baku untuk '%s'.\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Ketergantungan %s <- %s melingkar dijatuhkan." + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Selesai melakukan semua persyaratan untuk berkas target '%s'.\n" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Persyaratan untuk membuat '%s' sedang dibuat.\n" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Menyerah untuk membuat target berkas '%s'.\n" + +#: src/remake.c:699 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Target '%s' tidak dibuat lagi karena ada errors." + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:794 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Membuat '%s' karena adanya tanda always-make.\n" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Tidak perlu membuat lagi target '%s'" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; menggunakan nama VPATH '%s'" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Harus membuat lagi target '%s'.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Mengabaikan nama VPATH '%s'.\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Perintah dari '%s' sedang dijalankan.\n" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Gagal membuat lagi target berkas '%s'.\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Sukses membuat kembali target berkas '%s'.\n" + +#: 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" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Menggunakan perintah baku untuk '%s'.\n" + +#: 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" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS elemen '%s' bukan merupakan sebuah pattern" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Custom tidak akan men-export: %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" +"# Aturan implisit." + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Tidak ada aturan implisit." + +#: src/rule.c:548 +#, fuzzy, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u aturan implisit, %u" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: num_pattern_rules salah! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "sinyal tidak diketahui" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Hangup" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Interupsi" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Berhenti" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Instruksi Tidak Legal" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Penangkap trace/breakpoint" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Dibatalkan" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "Penangkap IOT" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "Penangkap EMT" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Eksepsi titik pecahan" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Terbunuh" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Bus error" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Kesalahan segmentasi" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Panggilan sistem buruk" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Pipa rusak" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Alarm" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Dimatikan" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Sinyal definisi pengguna 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Sinyal definisi pengguna 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Proses anak berakhir" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Listrik bermasalah" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Dihentikkan" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Dihentikan (masukkan tty)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Dihentikan (keluaran tty)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Dihentikan (sinyal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Batas waktu CPU telah terlampaui" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Batas maksimal ukuran berkas terlampaui" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Pewaktu maya habis" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Pewaktu profiling habis" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Jendela berubah" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Dilanjutkan" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Kondisi I/O penting" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "I/O mungkin" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Resource hilang" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Sinyal bahaya" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Permintaan informasi" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "co-processor titik pecahan tidak tersedia" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s # dari buffer 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 free: %lu total = (%lu) / mak = %lu / min = %lu / rata-rata = " +"%lu\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 current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" + +#: 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" + +#: 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" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# berkas statistik hash-table:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "otomatis" + +#: src/variable.c:1656 +msgid "default" +msgstr "baku" + +#: src/variable.c:1659 +msgid "environment" +msgstr "lingkungan" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "lingkungan dibawah opsi -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "baris perintah" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "'override' direktif" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (dari '%s', baris %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# statistik variable set hash-table:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabel\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Nilai Variabel Pola-Spesifik" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Tidak terdapat nilai variabel pola-spesifik" + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u nilai variabel pola-spesifik" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "peringatan: variabel '%.*s' tidak terdefinisi" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() gagal dengan kode %d\n" + +#: 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" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BAWAAN CD %s\n" + +#: src/vmsjobs.c:1224 +#, c-format +msgid "DCL: %s\n" +msgstr "" + +#: src/vmsjobs.c:1284 +#, c-format +msgid "Append output to %s\n" +msgstr "Meneruskan output ke %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Append %.*s and cleanup\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Menjalankan perintah %s\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Jalur Pencarian\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Tidak ada 'vpath' dalam jalur pencarian." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u 'vpath' jalur pencarian.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Tidak ada ('VPATH' variabel) umum dalam jalur pencarian." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Jalur pencarian umum untuk variabel 'VPATH':\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Jobserver slots limited to %d\n" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "creating jobserver semaphore: (Error %ld: %s)" + +#: 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)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Jobserver client (semaphore %s)\n" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "release jobserver semaphore: (Error %ld: %s)" + +#: 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)" + +#~ msgid "%s: recipe for target '%s' failed" +#~ msgstr "%s: recipe for target '%s' failed" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] Error 0x%x%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" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "kesalahan internal: '%s' command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "BAWAAN [%s][%s]\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BAWAAN RM %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Perintah bawaan '%s' tidak diketahui\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Error, perintah kosong\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Meneruskan masukan dari %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Meneruskan error ke %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Meneruskan output ke %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Gagal spawning, %d\n" + +#~ msgid "# Invalid value in `update_status' member!" +#~ msgstr "# Nilai yang salah dalam anggota `update_status' !" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Error 0x%x (diabaikan)" + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() gagal untuk menjalankan proses (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 "" +#~ "%sIni adalah piranti lunak bebas; lihat kode program untuk syarat " +#~ "penyalinan.\n" +#~ "%sTIDAK TERDAPAT GARANSI; bahkan untuk PENJUALAN atau \n" +#~ "%sKESESUAIAN UNTUK TUJUAN TERTENTU.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "kelebihan `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "directive `override' kosong" + +#~ msgid "invalid `override' directive" +#~ msgstr "directive `override' tidak valid" + +#~ msgid "" +#~ "\n" +#~ "%s # of strings in strcache: %d\n" +#~ msgstr "" +#~ "\n" +#~ "%s # dari string dalam strcache: %d\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-warning, CTRL-Y akan meninggalkan sub-process(es).\n" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Tidak terdapat files." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u files dalam %u hash buckets.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# rata - rata %.3f files per bucket, maksimal %u files dalam satu " +#~ "bucket.\n" + +#~ msgid "the `word' function takes a positive index argument" +#~ msgstr "fungsi `word' mengambil sebuah argumen index yang positif" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Sintak error, masih didalam '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Mendapat sinyal SIGCHLD; %u unreaped childern.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DIREKTORI" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "Pindah ke DIRECTORY sebelum melakukan sesuatu." + +#~ msgid "FLAGS" +#~ msgstr "FLAGS" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Proses dihentikan untuk memberikan kesempatan debugger" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "Variabel environment digunakan dalam makefiles" + +#~ msgid "FILE" +#~ msgstr "FILE" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Baca FILE sebagai sebuah makefile" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Cari DIREKTORI untuk makefiles yang dibutuhkan" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Tidak melakukan banyak jobs jika beban lebih dari N." + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "" +#~ "Jangan menjalankan perintah apapun. Hanya tampilkan saja apa yang akan " +#~ "dilakukan" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "" +#~ "Anggap FILE sudah sangat tua dan jangan dibuat kembali file tersebut" + +#~ msgid "Don't echo commands" +#~ msgstr "Jangan menampilkan perintah yang dijalankan" + +#~ msgid "Turns off -k" +#~ msgstr "Matikan opsi -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Pertimbangkan FILE sebagai file yang baru." + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Jangan menspesifikasi -j atau --jobs jika sh.exe tidak ada." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Mereset kembali make pada mode job tunggal." + +#~ msgid "Entering" +#~ msgstr "Memasuki" + +#~ msgid "Leaving" +#~ msgstr "Meninggalkan" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "tidak terdapat nama file untuk `%s include'" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "target `%s' meninggalkan persyaratan pola kosong" + +#~ msgid "# No variables." +#~ msgstr "# Tidak ada variabel." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# rata - rata dari %.1f variabel per bucket, maksimal %u dalam satu " +#~ "bucket.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# rata - rata dari %d.%d variabel per bucket, maksimal %u dalam satu " +#~ "bucket.\n" diff --git a/third_party/make/po/insert-header.sin b/third_party/make/po/insert-header.sin new file mode 100644 index 00000000000..b26de01f6c8 --- /dev/null +++ b/third_party/make/po/insert-header.sin @@ -0,0 +1,23 @@ +# Sed script that inserts the file called HEADER before the header entry. +# +# At each occurrence of a line starting with "msgid ", we execute the following +# commands. At the first occurrence, insert the file. At the following +# occurrences, do nothing. The distinction between the first and the following +# occurrences is achieved by looking at the hold space. +/^msgid /{ +x +# Test if the hold space is empty. +s/m/m/ +ta +# Yes it was empty. First occurrence. Read the file. +r HEADER +# Output the file's contents by reading the next line. But don't lose the +# current line while doing this. +g +N +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/third_party/make/po/it.gmo b/third_party/make/po/it.gmo new file mode 100644 index 0000000000000000000000000000000000000000..7da528b59fdff637b2c8b410aae6a29a2c8456ff GIT binary patch literal 45544 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

  • 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 A^#A|> literal 0 HcmV?d00001 diff --git a/third_party/make/po/it.po b/third_party/make/po/it.po new file mode 100644 index 00000000000..8b98395d1f3 --- /dev/null +++ b/third_party/make/po/it.po @@ -0,0 +1,2293 @@ +# 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 , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: make 4.2.91\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\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 \n" +"Language-Team: Italian \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" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "tentativo di usare una funzionalità non supportata: «%s»" + +#: 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" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: l'archivio «%s» non esiste" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: «%s» non è un archivio valido" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: il membro «%s» non esiste in «%s»" + +#: 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»" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() non riuscita con lo stato = %d" + +#: 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 lo stato del membro «%d»" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (il nome potrebbe essere troncato)" + +#: 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 "Il set di istruzioni ha troppe righe (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Interruzione.\n" + +#: 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 " +"eliminato" + +#: 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" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Eliminazione del file «%s»" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Eliminazione del file «%s»" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# set di istruzioni da eseguire" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (comando interno):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (da «%s» riga %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directory\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: impossibile eseguire stat.\n" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "# %s (key %s, mtime %I64u) non può essere aperto.\n" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (key %s, mtime %I64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (device %d, inode [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (device %ld, inode %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "No" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " file, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "no" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " impossibilità" + +#: src/dir.c:1154 +msgid " so far." +msgstr " finora." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilità nelle directory %lu.\n" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "La variabile ricorsiva «%s» si autoreferenzia (alla fine)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "riferimento alla variabile non terminato" + +#: 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," + +#: 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," + +#: 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»." + +#: 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»." + +#: 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»" + +#: 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»" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Eliminazione del file intermedio «%s»" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Rimozione dei file intermedi...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Ora corrente" + +#: 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" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Non è un obiettivo:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# File \"precious\" (prerequisito di .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Obiettivo \"phony\" (prerequisito di .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Obiettivo a riga di comando." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Un makefile predefinito, da MAKEFILES, o da -include/sinclude." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Regola incorporata" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Regola di ricerca implicita completata." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Regola di ricerca implicita non completata." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Stem implicito/statico del modello: «%s»\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Il file è un prerequisito intermedio." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Inoltre, genera:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Ora di modifica mai controllata." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Il file non esiste." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Il file è molto vecchio." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Ultima modifica %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Il file è stato aggiornato." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Il file non è stato aggiornato." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Set di istruzioni attualmente in esecuzione (QUESTO È UN BUG)." + +#: src/file.c:1065 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Dipendenze del set di istruzioni in esecuzione (QUESTO È UN BUG)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Aggiornato con successo." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Richiede di essere aggiornato (-q è impostato)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Aggiornamento non riuscito." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Valore illecito nel membro \"command_state\"!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# File" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistiche tabella hash dei file:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Campo «%s» non memorizzato: %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "primo argomento non numerico per la funzione \"word\"" + +#: 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" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "primo argomento non numerico per la funzione \"wordlist\"" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "secondo argomento non numerico per la funzione \"wordlist\"" + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() non riuscita (e=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() non riuscita\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Pulitura del file batch temporaneo %s\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "file: file mancante" + +#: src/function.c:2234 src/function.c:2265 +#, c-format +msgid "open: %s: %s" +msgstr "apertura: %s: %s" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "scrittura: %s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "chiusura: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "file: troppi argomenti" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "lettura: %s: %s" + +#: src/function.c:2290 +#, c-format +msgid "file: invalid file operation: %s" +msgstr "file: operazione sui file non valida: %s" + +#: 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»" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "non implementata su questa piattaforma: funzione «%s»" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "chiamata non terminata alla funzione «%s»: «%c» mancante" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Nome della funzione vuoto" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Nome della funzione non valido: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Nome della funzione troppo lungo: %s" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "Numero di argomenti non sufficienti (%u) per la funzione %s" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "Numero massimo di argomenti non sufficienti (%u) per la funzione %s" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: l'opzione «%s» è ambigua\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: opzione «--%s» sconosciuta\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: opzione «%c%s» sconosciuta\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opzione illecita -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opzione illecita -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: l'opzione «-W %s» è ambigua\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Espansione di «%s»\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Valutazione di «%s»\n" + +#: 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" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Carico=%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 "Collisioni=%lu/%lu=%.0f%%" + +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Ricerca di una regola implicita per «%s».\n" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitata la ricorsione della regola implicita.\n" + +#: src/implicit.c:484 +#, fuzzy, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Stem troppo lungo: «%.*s».\n" + +#: 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" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Prerequisito impossibile «%s» della regola rifiutato.\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Prerequisito implicito impossibile «%s» rifiutato.\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Tentativo di usare il prerequisito della regola «%s».\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Tentativo di usare il prerequisito implicito «%s».\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Trovato il prerequisito «%s» come VPATH «%s»\n" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Impossibile creare un file temporaneo\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (creato dump del core)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (ignorato)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Errore %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Attesa per i processi non terminati...." + +#: 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" + +#: 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 "Interruzione del processo figlio vincente %p con PID %s %s\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Token rilasciato per il processo figlio %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() non riuscita all'avvio del 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" +"Contati %d argomenti nell'avvio fallito\n" + +#: 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" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Token ottenuto per il processo figlio %p (%s).\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: l'obbiettivo «%s» non esiste" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: aggiorna l'obbiettivo «%s» a causa di: %s" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "impossibile far rispettare il limite di carico: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Impossibile ripristinare lo standard input\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Impossibile ripristinare lo standard output\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Impossibile ripristinare lo standard error\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: lo spazio dell'ambiente potrebbe essere esaurito" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL cambiata (era «%s», adesso è «%s»)\n" + +#: 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" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Contenuti del file batch:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Contenuti del file 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 (riga %d) contesto della shell errato (!unixy && !batch_mode_shell)\n" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Apertura della tabella dei simboli globale non riuscita: %s" + +#: 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" + +#: 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" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Nome del simbolo vuoto per il caricamento: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Caricamento del simbolo %s da %s\n" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Opzioni:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorato per compatibilità.\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Genera tutti gli obiettivi " +"incondizionatamente.\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Cambia DIRECTORY prima di fare qualunque " +"cosa.\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Mostra molte informazioni di debug.\n" + +#: 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" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Le variabili ambiente sovrascrivono i " +"makefile.\n" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" -E STRINGA, --eval=TESTO Analizza STRINGA come estratta dal " +"makefile.\n" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Legge FILE come un makefile.\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Mostra questo messaggio ed esce.\n" + +#: 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" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Cerca nella DIRECTORY per i makefile inclusi.\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] Permette N processi alla volta; infiniti se " +"non viene specificato l'argomento.\n" + +#: 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" + +#: 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" +" Non avvia processi multipli a meno che il " +"carico di lavoro non sia sotto 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 il più recente mtime tra i collegamenti " +"simbolici e l'obiettivo.\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" +" Non esegue alcun set di istruzioni; lo stampa " +"solamente.\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 FILE, --old-file=FILE, --assume-old=FILE\n" +" Considera il FILE come molto vecchio e non " +"riesegue make.\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" +" Sincronizza l'output dei processi paralleli " +"dal TIPO.\n" + +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Non avvia alcun set di istruzioni; lo stato di " +"uscita indica se è aggiornato.\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Non visualizza i set di istruzioni.\n" + +#: 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" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Disattiva l'opzione -k.\n" + +# ## touch = in questo contesto è simile alla funzione del comando 'touch' +#: 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" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr " --trace Stampa informazioni di tracciamento.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Stampa la directory corrente.\n" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Disattiva l'opzione -w, anche se era stata " +"attivata implicitamente.\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 FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Considera il FILE come nuovo di zecca.\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Avvisa quando viene referenziata una variabile " +"non definita.\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "una stringa vuota non è valida come nome di file" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "livello di debug specificato sconosciuto «%s»" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "tipo di output-sync (sincronizzazione dell'output) sconosciuto «%s»" + +#: 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" + +#: 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 eccezione non gestita chiamata dal programma %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 "Violazione accesso: operazione di scrittura all'indirizzo 0x%p\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/main.c:1609 +#, c-format +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"attenzione: jobserver non disponibile, viene usato -j1. Aggiungere «+» alla " +"regola make superiore." + +#: src/main.c:1617 +#, c-format +msgid "warning: -j%d forced in submake: resetting jobserver mode." +msgstr "" +"attenzione: -j%d forzata nel submake: disattivazione della modalità " +"jobserver." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Il Makefile dallo standard input è stato specificato due volte." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (file temporaneo)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (file temporaneo)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Reimpostazione alla modalità a singolo processo (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "Collegamenti simbolici non supportati: opzione -L disabilitata." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Aggiornamento dei makefile....\n" + +#: 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 " +"rieseguito.\n" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Riesecuzione del makefile «%s» non riuscita." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Il makefile «%s» incluso non è stato trovato." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Il makefile «%s» non è stato trovato" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Impossibile ritornare alla directory originale." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Riesecuzione[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (file temporaneo): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL contiene più di un obiettivo" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Nessun obiettivo" + +#: 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" + +#: 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." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uso: %s [opzioni] [obiettivo] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Questo programma è stato compilato per %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Questo programma è stato compilato per %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "Segnalare i bug a \n" + +#: 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" + +#: src/main.c:2965 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "l'opzione «-%c» richiede un argomento intero positivo" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sCompilato per %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sCompilato per %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 Licenza GPLv3+: GNU GPL versione 3 o successiva .\n" +"%s Questo programma è software libero: siete liberi di modificarlo e " +"ridistribuirlo.\n" +"%s Non c'è ALCUNA GARANZIA, per quanto consentito dalle vigenti normative.\n" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Generazione del database delle informazioni, creato il %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Generazione del database completata il %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Accesso inizializzato" + +#: src/misc.c:743 +msgid "User access" +msgstr "Accesso utente" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Accesso make" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Accesso processo figlio" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: ingresso in una directory sconosciuta\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: uscita dalla directory sconosciuta\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: ingresso nella directory «%s»\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: uscita dalla directory «%s»\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: ingresso in una directory sconosciuta\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: uscita dalla directory sconosciuta\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: ingresso nella directory «%s»\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: uscita dalla directory «%s»\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "errore in scrittura: stdout" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Arresto.\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]) non è configurato per questa versione." + +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "creazione della pipe dei processi" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "beffa della pipe dei processi" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "inizializzazione nella pipe della modalità jobserver" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "errore interno: stringa illecita per --jobserver-auth «%s»" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Client del jobserver (fds %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "jobserver pipeline" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "scrittura del jobserver" + +#: src/posixos.c:300 +#, c-format +msgid "job server shut down" +msgstr "job server spento" + +#: src/posixos.c:303 +msgid "pselect jobs pipe" +msgstr "pselect della pipe dei processi" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "lettura della pipe dei processi" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Lettura dei makefile...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Lettura del makefile «%s»" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (nessun obiettivo predefinito)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (percorso di ricerca)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (ignora)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (nessuna espansione per «~»)" + +#: src/read.c:655 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "UTF-8 BOM nel makefile «%s» saltato\n" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "UTF-8 BOM nel makefile buffer saltato\n" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "sintassi illecita nel condizionale" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: caricamento non riuscito" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "il set di istruzioni inizia prima del primo obiettivo" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "regola mancante prima del set di istruzioni" + +#: src/read.c:1136 +#, c-format +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr "separatore mancante (si intendeva TAB invece di 8 spazi?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "separatore mancante" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "modello mancante per l'obiettivo" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "modelli multipli per l'obiettivo" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "il modello dell'obiettivo non contiene alcun «%%»" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "«endif» mancante" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "nome vuoto della variabile" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "testo non pertinente dopo la direttiva «define»" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "«endef» mancante, «define» non terminato" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "testo non pertinente dopo la direttiva «endef»" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "testo non pertinente dopo la direttiva «%s»" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "«%s» non pertinente" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "un solo «else» per condizionale" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Definizione malformata della variabile specifica per l'obiettivo" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "i prerequisiti non possono essere definiti nei set di istruzioni" + +#: 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" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "regole implicite e normali miste" + +#: 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" + +#: 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 ::" + +#: 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" + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "attenzione: sovrascrittura del set di istruzioni per l'obiettivo «%s»" + +#: 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»" + +#: src/read.c:2254 +#, c-format +msgid "*** mixed implicit and normal rules: deprecated syntax" +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»" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Nessuna operazione da eseguire per «%s»." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "«%s» è aggiornato." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Pulizia del file «%s».\n" + +#: 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" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%s Nessuna regola per generare l'obiettivo «%s»%s" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Considerato il file obiettivo «%s».\n" + +#: 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" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Il file «%s» è già stato esaminato.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "L'aggiornamento del file «%s» è ancora in corso.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Aggiornamento del file «%s» terminato.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Il file «%s» non esiste.\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Uso del set di istruzioni predefinito per «%s».\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Dipendenza circolare %s <- %s scartata." + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Prerequisiti del file obiettivo «%s» terminati.\n" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Generazione dei prerequisiti di «%s» in corso.\n" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Abbandono sul file obiettivo «%s».\n" + +#: 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." + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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 " +"cambiato.\n" + +#: 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" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Non è necessario rigenerare l'obiettivo «%s»" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; uso del nome VPATH «%s»" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "L'obiettivo «%s» deve essere rigenerato.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Nome VPATH «%s» ignorato.\n" + +#: 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" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Rigenerazione del file obiettivo «%s» non riuscita.\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "File obiettivo «%s» rigenerato correttamente.\n" + +#: 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" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Uso dei comandi predefiniti per «%s».\n" + +#: 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" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "l'elemento .LIBPATTERNS «%s» non è un modello" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Le personalizzazioni non verranno esportate: %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" +"# Regole implicite" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Regole non implicite." + +#: src/rule.c:548 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u regole implicite, %u (%.1f%%) terminale." + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: num_pattern_rules è errato! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "segnale sconosciuto" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Chiusura" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Interruzione" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Uscita (con core dump)" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Istruzione illecita" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Rilevato trace/breakpoint" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Annullato" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "Rilevato IOT" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "Rilevato EMT" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Eccezione in virgola mobile" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Ucciso" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Errore di bus" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Errore di segmentazione" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Chiamata di sistema errata" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Pipe interrotta" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Sveglia" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Terminato" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Segnale 1 definito dall'utente" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Segnale 2 definito dall'utente" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Processo figlio uscito" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Mancanza di alimentazione elettrica" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Fermato (da terminale)" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Fermato (input tty)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Fermato (output tty)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Fermato" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Limite di tempo CPU superato" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Superato il limite di dimensione file" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Timer virtuale terminato" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Timer di profiling terminato" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Finestra modificata" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Continuato" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Condizioni di I/O urgente" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "I/O consentito" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Risorsa persa" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Segnale di pericolo" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Richiesta informazioni" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Co-processore a virgola mobile non disponibile" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s buffer strcache assenti\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 buffer strcache: %lu (%lu) / stringhe = %lu / memorizzazione = %lu B / " +"media = %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 corrente: dimensione = %hu B / usato = %hu B / numero = %hu / " +"media = %u B\n" + +#: 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" + +#: 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" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s prestazioni strcache: lookups = %lu / hit rate = %lu%%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# statistiche della tabella hash:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automatico" + +#: src/variable.c:1656 +msgid "default" +msgstr "predefinito" + +#: 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 con l'opzione -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "riga di comando" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "direttiva \"override\"" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (da «%s», riga %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# statistiche tabella di hash del set di variabili:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabili\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valori di variabile non specifici per il modello" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Nessun valore per la variabile \"pattern-specific\"." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valori di variabile specifici per il modello" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "attenzione: variabile «%.*s» non definita" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() non riuscita con %d\n" + +#: 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" + +#: 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 "Accoda output a %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Accoda %.*s e pulisce\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Verrà invece eseguito %s\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Percorsi di ricerca VPATH\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Non ci sono percorsi di ricerca 'vpath'." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# percorsi di ricerca 'vpath' %u.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Percorso di ricerca non generale (variabile «VPATH»)." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Percorso di ricerca generale (variabile «VPATH»):\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Slot del jobserver limitati a %d\n" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "creazione del semaforo del jobserver: (Errore %ld: %s)" + +#: 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 " +"%ld: %s)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Client del jobserver (semaforo %s)\n" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "rilascio del semaforo del jobserver: (Errore %ld: %s)" + +#: 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)" diff --git a/third_party/make/po/ja.gmo b/third_party/make/po/ja.gmo new file mode 100644 index 0000000000000000000000000000000000000000..a9264d80a897859b987b1b572e5943fbc7557787 GIT binary patch literal 48996 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 literal 0 HcmV?d00001 diff --git a/third_party/make/po/ja.po b/third_party/make/po/ja.po new file mode 100644 index 00000000000..8889d154374 --- /dev/null +++ b/third_party/make/po/ja.po @@ -0,0 +1,2409 @@ +# 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 , 2001. +# Thanks to NISHIJIMA Takanori +# GOTO Masanori , 2003-2004. +# Takeshi Hamasaki , 2011, 2014, 2016, 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 21:11+0900\n" +"Last-Translator: Takeshi Hamasaki \n" +"Language-Team: Japanese \n" +"Language: ja\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: Poedit 2.2.1\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 "'%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: '%s' への ar_member_touch から異常な値が返りました" + +#: 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 バイト at %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: 状態を調べられませんでした.\n" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "# %s (key %s, mtime %I64u): 開けませんでした.\n" + +#: 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" + +#: src/dir.c:1099 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (device %ld, inode %ld): 開けませんでした.\n" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (key %s, mtime %I64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (device %d, inode [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (device %ld, inode %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "0" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " 個のファイル, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "0" + +#: 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 "# さらに make:" + +#: 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 "非数値の第1引数が 'word' 関数に与えられました" + +#: src/function.c:799 +#, c-format +msgid "first argument to 'word' function must be greater than 0" +msgstr "'word' 関数への第1引数は 0 より大きくなければなりません" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "非数値の第1引数が 'wordlist' 関数に与えられました" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "非数値の第2引数が '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' には引数が1つ必要です\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 "VPATH '%2$s' として必要条件 '%1$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 "" +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) の印を解放しました.\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 行目) 不正なシェルコンテキスト (!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 無条件に全ターゲットを make する.\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" make 開始前にディレクトリ 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[=FLAGS] 様々なタイプのデバッグ情報を表示する.\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 STRING, --eval=STRING STRING を makefile の文として評価する.\n" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" FILE を 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 DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +" インクルードする makefile を探索する " +"DIRECTORY.\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 あるターゲットが make できなくても実行を続け" +"る.\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 シンボリックリンクとターゲットの中で一番新しい " +"mtime を使う.\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 FILE, --old-file=FILE, --assume-old=FILE\n" +" FILE をとても古いものと見なして, 再 make しな" +"い.\n" + +#: 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" +" 並列ジョブの出力を TYPE で揃える.\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 mode は無効にな" +"る).\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 ターゲットを再 make する代わりにタッチする.\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 をオフにする. 暗黙に有効な場合でもオフにす" +"る.\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 FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" FILE をいつでも最新として見なす.\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: 割り込み/例外を捕捉しました (code = 0x%lx, addr = 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 "" +"警告: makefile で -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' 自己再帰のおそれあり ― 再make しません.\n" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "makefile '%s' の再makeに失敗しました." + +#: 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 "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 "ターゲットが指定されておらず, 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 \n" +msgstr "バグレポートは まで.\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 \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 GPL バージョン 3 以降 \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 "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[TYPE] (--output-sync[=TYPE]) が設定されていません." + +#: 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 "jobserver パイプの初期化" + +#: 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 クライアント (fds %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "jobserver パイプライン" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "ジョブサーバへの write" + +#: 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 "ジョブのパイプの read" + +#: 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 "分離記号を欠いています (8 個の空白でしたが, 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 "'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 "" +"%1$s'%3$s' に必要なターゲット '%2$s' を make するルールがありません%4$s" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sターゲット '%s' を make するルールがありません%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' の必要条件を make します.\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' はエラーにより 再make できませんでした." + +#: 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' を make します.\n" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "ターゲット '%s' を再make する必要はありません" + +#: 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' を再make する必要があります.\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' の再make に失敗しました.\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "ターゲットファイル '%s' の再 make に成功しました.\n" + +#: src/remake.c:852 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "ターゲットファイル '%s' は -q オプションを付けての再make が必要です.\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 "Customs がエクスポートしてくれません: %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 "Abort しました" + +#: 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 "Kill されました" + +#: 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 "入出力可能" + +#: 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" +"# パターン指定 変数 値" + +#: 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 "" +"-警告, DCL からの CTRL-Y 操作を再び有効にする必要があるかも知れません.\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 "jobserver のスロットは %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 "jobserver クライアント (セマフォ %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 "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' のレシピで失敗しました" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] エラー 0x%x%s" + +#~ msgid "%s[%s] %s%s%s" +#~ msgstr "%s[%s] %s%s%s" + +#~ msgid "dup jobserver" +#~ msgstr "dup jobserver" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "警告: 空のリダイレクト\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "内部エラー: '%s' command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "ビルトイン [%s][%s]\n" + +#~ msgid "BUILTIN ECHO %s->%s\n" +#~ msgstr "ビルトイン ECHO %s->%s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "不明なビルトインコマンド '%s'\n" + +#~ msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +#~ msgstr "" +#~ ".ONESHELL の中で未知、またはサポートされていないビルトインコマンド: '%s'\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "エラー, 空のコマンド\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "%s から入力リダイレクトされました\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "%s へエラーリダイレクトされました\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "%s へ出力リダイレクトされました\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "spawn のエラー, %d\n" + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "内部エラー: 複数の --sync-mutex オプション" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "内部エラー: 複数の --jobserver-fds オプション" + +#~ msgid "virtual memory exhausted" +#~ msgstr "仮想メモリを使い果たしました" + +#~ msgid "write error" +#~ msgstr "書き込みエラー" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "ビルトイン RM %s\n" + +#~ msgid "# Invalid value in `update_status' member!" +#~ msgstr "# `update_status' メンバに無効な値!" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] エラー 0x%x (無視されました)" + +#~ msgid "[%s] Error %d (ignored)" +#~ msgstr "[%s] エラー %d (無視されました)" + +#~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +#~ msgstr "レシピを %s:%lu から呼び出してターゲット `%s' を更新します.\n" + +#~ msgid "Invoking builtin recipe to update target `%s'.\n" +#~ msgstr "ターゲット `%s' を更新するため内蔵レシピを呼び出しています.\n" + +#~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +#~ msgstr "%s # strcache バッファ %d のうち: (* %d B/バッファ = %d B)\n" + +#~ msgid "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# strcache ハッシュテーブルの統計:\n" +#~ "# " + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "文法エラー, '\"' 内のままです\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "SIGCHLD が発生; %u 個の未回収子プロセス.\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-警告, CTRL-Y は子プロセスを散らかしたままにするでしょう.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "sh.exe が使えない状態で -j や --jobs を指定してはいけません." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "単一ジョブモードの make にリセットします." + +#~ 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 "" +#~ "%sこれはフリーソフトウェアです. 利用許諾についてはソースを\n" +#~ "%sご覧ください.\n" +#~ "%s商業性や特定の目的への適合性の如何に関わらず, 無保証です.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "関係のない `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "空の `override' 疑似命令" + +#~ msgid "invalid `override' directive" +#~ msgstr "無効な `override' 疑似命令" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "`%sinclude' にファイル名がありません" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "ターゲット `%s' の必要条件パターンが空のままです" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# ハッシュ要素あたり、平均 %.3f 個、最大 %u 個のファイルがあります。\n" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "デバッガに attach するためプロセスの一時停止を許可する" + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# ハッシュ要素あたり、平均 %.1f 個、最大 %u 個の変数があります。\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# ハッシュ要素あたり平均 %d.%d 個、最大 %u 個の変数があります。\n" + +#~ msgid "the `word' function takes a positive index argument" +#~ msgstr "`word' 関数は非負のインデックス引数をとります" diff --git a/third_party/make/po/ko.gmo b/third_party/make/po/ko.gmo new file mode 100644 index 0000000000000000000000000000000000000000..258d32aa114bab7472904031400657901bc30cd0 GIT binary patch literal 46973 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 literal 0 HcmV?d00001 diff --git a/third_party/make/po/ko.po b/third_party/make/po/ko.po new file mode 100644 index 00000000000..c0481ac4db5 --- /dev/null +++ b/third_party/make/po/ko.po @@ -0,0 +1,2258 @@ +# Korean messages for GNU make. +# Copyright (C) 1996, 2001, 2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# +# Bang Jun-Young , 1996. +# Changwoo Ryu , 2001, 2006, 2013-2014, 2016, 2019-2020. +# +# 용어 +# - recipe - 명령 (make의 action으로 실행할 명령어를 말함) +# - prerequisite - 선행 조건 +# +# 참고 +# - order-only란 의존하는 타겟 중에서 명령어 순서만 지정하고 파일 수정 +# 시각은 무시하는 종류를 말한다. "Types of Prerequisites" 참고. +# +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-03 23:07+0900\n" +"Last-Translator: Changwoo Ryu \n" +"Language-Team: Korean \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" + +#: 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: '%s' 멤버가 '%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_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 "멤버 상태 %2$d번을 참조하려고 '%1$s' 라이브러리를 열 수 없습니다" + +#: 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, 모드 = 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, 아이노드 [%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): " + +# 여기서 No는 "No files"라고 쓰인다. 궁극적으로 msgid가 고쳐져야 함 +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "0개" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " 파일, " + +# 여기서 no는 "no impossibilities"라고 쓰인다. 궁극적으로 msgid가 고쳐져야 함 +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "0개" + +#: 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 메이크파일." + +#: 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_status' 멤버에 값이 잘못되었습니다!" + +#: 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 "함수 '%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" + +# 스템(stem)이란 패턴 룰에서 prefix/suffix를 제외한 나머지를 말한다. +# 예를 들어 `%.c'라는 패턴에 `hello.c'가 들어 맞았을 경우 stem은 `hello'이다. +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "스템이 너무 깁니다: '%s%.*s'.\n" + +# 스템(stem)이란 패턴 룰에서 prefix/suffix를 제외한 나머지를 말한다. +# 예를 들어 `%.c'라는 패턴에 `hello.c'가 들어 맞았을 경우 stem은 `hello'이다. +#: 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 "VPATH '%2$s'에서 선행조건 '%1$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 "" +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)에 토큰을 내어 줍니다.\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 "" +"하위 프로세스 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번째 줄) 잘못된 쉘 컨텍스트 (!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" + +#: 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 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" -E <문자열>, --eval=<문자열>\n" +" <문자열>을 메이크파일 내용으로 해석합니다.\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 [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" +" 사용합니다.\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" + +#: 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를 끕니다.\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 "알 수 없는 output-sync 방식 '%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 "" +"경고: 작업서버를 사용할 수 없습니다: -j1을 사용합니다. 상위 메이크 규칙에 " +"'+'를 추가합니다." + +#: 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 "메이크파일을 업데이트하고 있습니다....\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 \n" +msgstr "문제점을 로 알려 주십시오.\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' 옵션은 0보다 큰 정수 인수가 필요합니다" + +#: 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 \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 GPL 버전 3 또는 이후 \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" + +#: 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 "작업 파이프 dup() 수행" + +#: 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 "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 "메이크파일 '%s'에서 UTF-8 BOM 무시\n" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "메이크파일 버퍼에서 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'은(는) 이미 업데이트되었습니다." + +# prune이 truncate의 의미인가 지운다는 의미인가?? +#: 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 "%1$s'%3$s'에서 필요한 '%2$s' 타겟을 만들 규칙이 없습니다%4$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 "" +"*** Warning: .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 "타겟 '%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 "Customs은 export되지 않습니다: %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 "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 "긴급한 입출력 상황" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "입출력 가능" + +#: 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 "메이크파일" + +#: 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" + +# DCL - Digital Command Language, VMS에서만 존재하는 shell language의 일종 +#: 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 "내장 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" +"# 'vpath' 탐색 경로 %u개.\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)" diff --git a/third_party/make/po/lt.gmo b/third_party/make/po/lt.gmo new file mode 100644 index 0000000000000000000000000000000000000000..baab5047acc86f1942a9ec8555869dbb63c2965c GIT binary patch literal 7037 zcmbW5ZHyh)S;wc4l(G#iw3Id}v?qj(y^ZgB*G`C8+o{*_+Fk5jZ@lZICAHAmd(YlI zp1CtO^Rn@ls7(<5fJD^_saT~2)kO$FAeI`TmJbP)a<4=rDiEIvqLoMyuV30C`T^0F z-~Y_q-MfyHR*Zb^Z|2OIbI$X6p7qz?cH5^St`F0GmiE6t5=9?_|9Cq;TwndMD0(aW zd-x{!@9?MKx8XbBZFK$|ybHb?9)Sj~!5@be{CW5>cnADE{0Vpi-UVNPZ-ZZjn)g59 zTi|yg|DrpX4r%z`Nl4 z;5<}+0`Gy(H2g!T`Cf*S>lG+Hd=F~2is8Vf1=?ZL#_J~ zoQD6=Jl}~@B-aVZ7NZTwtEdmP-cwEgZ$ZiRJI(WR@IIcu1o;>JGe6Snx1jd-eW?Av ziOwl_H`Mc4sPP^6cKAfYt5EBI8cMD|fVe{RClHaNKZEasUxNILzQNCJ@LN!R@E!PG zcn8LiJ`O;QI}f#=OAwcdHlXaCHqXyM+4nc0_Vc??_IM7;KVE{8`|D8p{SM?`^e&X6 z=Y3G$EkfD(68stXYf$q3Hk2ICLVfof)IMK;xAWp_Q2O`=&L{c53HAPeVDJ+*E4k<4 zewe@({1nvqm!RbR3e^1HgtFiFp}v1Jo0A-ep!T%{wcidu`u+-(o_-y^2Y#~YzX8wj z{1;IAcq2d3!@CKkl--QR@doh;eI0xmQ71aJe0kw}W zK-ufdP=4?-`~~>84gVWX^L!VJYu-hu_c4^bpM-kx4OUqQvq*B~m3 z{te0xz6T}uojf2y^Z=Cpm!SNt4;2refyxVi3MJ>?K?A=H*<$o|CegeHpyW6SrN;%R zJoX{@26&A2Fikqt^X(^mA*T*skwpz9ZF?EJFbU`NT;+Uc!z`*`y#eLqAy(LAp< z6l5FeTYJ=Xj&>;A)jv}}e)9p^BJCngdLVqlC0*+%IzxMq_Di(U^$0hoXtL}5G}&qV zl7Akhou}=i$?pjFa4C1r(-gC^`vOgVEFCI-4DB`=>JIw<75D&cbj@%hyUo$wPdiPM z-W4Aj6elNXkI_CzlfPV`jV??WF8Rq4?ZdQ3Y0ETSYc%t;4-x;|>$mA*|2pQY+4oXy*trfk zCQ(l@r)f@GUUW>ENxZ7xk#J$0Y-u_f=1H>>nS4?1_G2-|yY$sx=#4(O^;;~ubN;^Z(*`hR<*Kc^llCvP>Qh3I27{!zxi>8i!nD(Y? z$Bn$p&UK2tdNBK2PZ+jbxN<7UzFM{0t|&IDB-tJpeX^J{?W{^Vjp)IR_jRz?J!TnY zSX0`(>&m%kvd~!katsS;>2jZTjYXenoMum^J9gim2qVuqyY>1b){u(e>Ge%kl_uLT zxlOz7s41%TqV#1|>hoq@pCqnp6O;9WLRu{|*{;{|>6T51l2^ZJdUE$fg-aINDiYF<qHM{DVnOn9rg^FU{jhj z>$V-sJ;-)lpCa2RG`FXthpRl7BIH`pDGkp};k%5A7M9k?8nz#Wcq;ryoVjVq(@BP7 zVx4~GnWLSxNP2QJVp;xew+K-s$LOY!+H|mBw0Q75Un`$5YO%5IVp@={+A?vpn36hs zwg1b6xC(u^U0(Ie=&T%~6D?=_Ydp0WyER4Mwd;7Ysa$*~p^%WPv=gmlPa^OJ+pKaI zJyQ8Hy5MX_GL2GCF+GiKF1TJ6{1`!9-g6zVEFF?!^S+B){k*UPDrHu*}qMM_F!@ zZ~IkwQy-BOIxi|MN*bm4k%HJT679Si7gYU)?K%azdAyFC;*xp1P6C%q`0_EIcCsf) zL2{Q)XG zt1}3#r%{g+%lDafZ+{V`Sv1N&jrUf;PPjX#g4tO*cN-3WZ@XwE&n{B|v=%$9M_sNn zZ!Va;b$I&7?8F5pbGDWW4&K&DjM`eu=49PHMx9tW-@4$oyuNPf*q$?oW@e7GW*%tG zK4=cj&fS0LzL~=_GZRYftu^vmkywh3IdcX#vQ>$emN-XkRm9vLBRc6iVdG>vDIemi zv|C|})|#`uIdjgJo0UyH`RiDm_4>b>lqcdWtp)OzvtrLjb0#S#mKK*5cEy{Wo|#aV zz{^@|+kJLhx+~?ueqw!kROZY%E{XJ?KdpEdX1Yjitv_wm_T^L{g9=ECzs#}DaM7&dckcE&vQ zR6ULtGgAzlW#FNyqoMMfNB%UnzAgimu)ONKW#@<2bLZpXbpmK`4S}pLw&R4`@P2SD zw;aafqx|ss(I{@~GLZ@C?ODcUg-Ou8(-h&Hr7-cat!u{N=lrN-v>bghFrHCmrBx^v z40TMxCSQM`ipa6ip_y_^NBy;TVdpIg5us7?&XG_mc z$<%CBjvGFy)l!kMx6AA@N!iCmlI_0ws6i8bRKST7y8G6<;q@5h#EwwVEXv2$tJq9+ z+WX%2y0pIMDICf+*sjV7N8&PZmKfqF)H}cG-^i?~HCX zswy@NU$3^t=Gyy~L)4;cmyV=+9k*knL7|q7B|a|e)%UvdUPs;iB6Z{6tk@z}^)EJYsMS&uScyFZb1pgqoGJK^|xM8{t+J>)<)Znb5Nap;9+| z(WhAt!D>euT&-)##o_g46u!DM4C@4U%bLO#X)`l?aU0Jv)$m1=53Vua@cE-SvLAfh zH>(hP^}Z9Sj>Y-Y(DH|&BWD)l1t|KeGmJ#1Ol@k^y@N)dR<&PytlW&t#^?Hf6th2s zX6kbG2Wp3kc0~@`wM6Cc1*MI$+OkD-GRY)aoy^E3g#4DrOUNnFlI@}%62FpTj4O3) z^r+8=*Kv!&sOXh@WpxS4_!Z8M!Kd+?XeSW6`QXOzMUoP>?fV=T;$~#oX{y_Gyf`dd zdup^|w}?(E>$+xOR@J;+TXjO7A6s7;iNBe*J6L#k53Awi;QLs0O~RWvt1DniZMsv} z=RX*NzZKCf2G>%aQHDdt!Hq4-O70HgbGhr+7DMk_8y zg;g9hx=d>3K4>Uf4tY6*#_)M&O{+ZXpxQcGIH5cxJLj>2`=%Vo_=Uv9Wlo551WALv zEF^wkFBBYtWmY*w%dF>bp1}H0HV!|Bpv0b6^~Q`i>T28fu5kha zK_x?FZdFpVa_M4@N&R;VLB;M-^lMetwYD1HT2;N7!q>5slnCDgB#KR0j)lPFaQ7m literal 0 HcmV?d00001 diff --git a/third_party/make/po/lt.po b/third_party/make/po/lt.po new file mode 100644 index 00000000000..c47ea36fa73 --- /dev/null +++ b/third_party/make/po/lt.po @@ -0,0 +1,2204 @@ +# translation of make-3.81 to Lithuanian +# Copyright (C) 2008 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# +# Gintautas Miliauskas , 2008. +msgid "" +msgstr "" +"Project-Id-Version: make-3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\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 \n" +"Language-Team: Lithuanian \n" +"Language: lt\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: 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" + +#: src/ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "bandymas naudoti nepalaikomą funkcionalumą: „%s“" + +#: src/ar.c:123 +#, c-format +msgid "touch archive member is not available on VMS" +msgstr "" + +#: src/ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Archyvas „%s“ neegzistuoja" + +#: src/ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: „%s“ nėra taisyklingas archyvas" + +#: src/ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Archyvas „%s“ neegzistuoja" + +#: src/ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "" + +#: src/arscan.c:130 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "" + +#: 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“" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (pavadinimas gali būti sutrumpintas)" + +#: 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, mode = 0%o.\n" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "" + +#: src/commands.c:628 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: src/commands.c:646 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Trinamas failas „%s“" + +#: src/commands.c:648 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Trinamas failas „%s“" + +#: src/commands.c:684 +#, fuzzy +msgid "# recipe to execute" +msgstr "# vykdytinos komandos" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (integruota)" + +#: src/commands.c:689 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (nuo „%s“, %lu eilutė):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Aplankai\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: negalėjo būti stat'intas.\n" + +#: 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" + +#: src/dir.c:1094 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" + +#: src/dir.c:1099 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" + +#: src/dir.c:1126 +#, fuzzy +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (key %s, mtime %d): nepavyko atverti.\n" + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "" + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "" + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Ne" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " failai, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "ne" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " negalimybės" + +#: src/dir.c:1154 +msgid " so far." +msgstr " kol kas." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " negalimybės %lu aplankuose.\n" + +#: 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)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "neterminuota nuoroda į kintamąjį" + +#: src/file.c:278 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Komandos nurodytos failui „%s“ %s:%lu," + +#: 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ą" + +#: 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“." + +#: 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." + +#: src/file.c:310 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" + +#: src/file.c:316 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" + +#: src/file.c:408 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Trinamas tarpinis failas „%s“" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Šalinami tarpiniai failai...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Dabartinis laikas" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Laiko žymė už rėžių; keičiama į %s" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Ne tikslas:" + +#: src/file.c:1021 +#, fuzzy +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Brangus failas (reikalingas .PRECIOUS)" + +#: src/file.c:1023 +#, fuzzy +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Keistas tikslas (reikalingas .PHONY)." + +#: src/file.c:1025 +#, fuzzy +msgid "# Command line target." +msgstr "# Komandinės eilutės tikslas" + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Numatytoji reikšmė, MAKEFILES, arba -include/sinclude „make“ failas" + +#: src/file.c:1029 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# Nėra neišreikštinių taisyklių." + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Neišreikštinių taisyklių paieška atlikta." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Neišreikštinių taisyklių paieška neatlikta." + +#: src/file.c:1034 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Išreikštinis/statinis šablono kamienas: „%s“\n" + +#: src/file.c:1036 +#, fuzzy +msgid "# File is an intermediate prerequisite." +msgstr "# Failas yra tarpinė sąlyga" + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Taip pat sukuria:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Modifikacijos laikas niekada netikrintas." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Failas neegzistuoja." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Failas labai senas." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Paskutinį kartą pakeista %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Failas atnaujintas." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Failas nebuvo atnaujintas." + +#: src/file.c:1062 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Dabar vykdomos komandos (TAI KLAIDA)." + +#: src/file.c:1065 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Vykdomos priklausomybių komandos (TAI KLAIDA)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Sėkmingai atnaujinta." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Turi būti atnaujinta (-q nustatyta)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Nepavyko atnaujinti." + +#: src/file.c:1086 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Netaisyklinga reikšmė „command_state“ naryje!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Failai" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# failų maišos lentelės statistika:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "" + +#: src/function.c:799 +#, c-format +msgid "first argument to 'word' function must be greater than 0" +msgstr "" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "" + +#: src/function.c:1533 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "" + +#: src/function.c:1557 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "" + +#: src/function.c:2234 src/function.c:2265 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: src/function.c:2242 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "rašymo klaida: %s" + +#: src/function.c:2245 src/function.c:2282 +#, fuzzy, c-format +msgid "close: %s: %s" +msgstr "%s%s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "" + +#: src/function.c:2277 +#, fuzzy, c-format +msgid "read: %s: %s" +msgstr "%s: %s" + +#: src/function.c:2290 +#, fuzzy, c-format +msgid "file: invalid file operation: %s" +msgstr "%s: netaisyklingas argumentas -- %c\n" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "" + +#: src/getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: parametras `%s' dviprasmis\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: neatpažintas argumentas „--%s“\n" + +#: src/getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: neatpažintas argumentas „%c%s“\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: neleistinas parametras -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: netaisyklingas argumentas -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: parametras „-W %s“ dviprasmis\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: src/hash.c:50 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "" + +#: src/hash.c:282 +#, c-format +msgid "Rehash=%u, " +msgstr "" + +#: src/hash.c:283 +#, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "" + +#: 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" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "" + +#: src/implicit.c:786 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Šalinami tarpiniai failai...\n" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr "" + +#: src/job.c:553 +msgid " (ignored)" +msgstr "" + +#: src/job.c:557 src/job.c:1892 +#, fuzzy +msgid "" +msgstr " (integruota)" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/job.c:899 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: src/job.c:950 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "%s: nepavyko atverti laikinojo failo: %s" + +#: src/job.c:956 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "%s: nepavyko atverti laikinojo failo: %s" + +#: src/job.c:1071 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: src/job.c:1575 src/job.c:2487 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" + +#: src/job.c:1642 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: src/job.c:1902 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: Archyvas „%s“ neegzistuoja" + +#: 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" + +#: src/job.c:2108 +#, c-format +msgid "cannot enforce load limits on this operating system" +msgstr "" + +#: src/job.c:2110 +#, fuzzy +msgid "cannot enforce load limit: " +msgstr "%s: nepayko pakeisti limito: %s" + +#: src/job.c:2200 +#, c-format +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: src/job.c:2212 +#, c-format +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: src/job.c:2226 +#, c-format +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "" + +#: src/job.c:2520 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: src/job.c:2862 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL pakeistas (buvo „%s“, dabar „%s“)\n" + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: src/job.c:3605 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: src/load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: src/load.c:256 +#, c-format +msgid "The 'load' operation is not supported on this platform." +msgstr "" + +#: src/main.c:335 +msgid "Options:\n" +msgstr "" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr "" + +#: src/main.c:345 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr "" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: src/main.c:362 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" + +#: src/main.c:364 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:369 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: src/main.c:371 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: src/main.c:380 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" + +#: src/main.c:384 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" + +#: src/main.c:386 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:395 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr "" + +#: src/main.c:399 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr "" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "negalimas tuščias failo pavadinimas" + +#: src/main.c:754 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "nežinomas debug lygio specifikacija „%s“" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: src/main.c:849 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" + +#: 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 "" + +#: src/main.c:864 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "" + +#: src/main.c:865 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "" + +#: src/main.c:941 src/main.c:956 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" + +#: src/main.c:1009 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" + +#: src/main.c:1609 +#, c-format +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" + +#: src/main.c:1617 +#, c-format +msgid "warning: -j%d forced in submake: resetting jobserver mode." +msgstr "" + +#: 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 +#, 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 "" + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "" + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Atnaujinami „make“ failai....\n" + +#: src/main.c:2226 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "" + +#: src/main.c:2303 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Nereikia atnaujinti taikinio „%s“" + +#: src/main.c:2323 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "„Make“ failas „%s“ nerastas" + +#: src/main.c:2328 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "„Make“ failas „%s“ nerastas" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Nepavyko grįžti į pirminį aplanką." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "" + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Nėra tikslų" + +#: 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" + +#: 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 "Naudojimas: %s [argumentai] [tikslas] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Ši programa sukompiliuota %s sistemai\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Ši programa sukompiliuota %s (%s) sistemai\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "Praneškite apie klaidas adresu \n" + +#: 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" + +#: src/main.c:2965 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "parametrui „-%c“ reikia teigiamo sveiko argumento" + +#: src/main.c:3363 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sŠi programa sukompiliuota %s sistemai\n" + +#: src/main.c:3365 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sŠi programa sukompiliuota %s (%s) sistemai\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" + +#: 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" + +#: 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: Įeinama į nežinomą aplanką\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Išeinama iš nežinomo aplanko\n" + +#: src/output.c:102 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Įeinama į aplanką „%s“\n" + +#: src/output.c:104 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Išeinama iš aplanko „%s“\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Įeinama į nežinomą aplanką\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Išeinama iš nežinomo aplanko\n" + +#: src/output.c:113 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Įeinama į aplanką „%s“\n" + +#: src/output.c:115 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Išeinama iš aplanko „%s“\n" + +#: src/output.c:442 src/output.c:444 +#, fuzzy, c-format +msgid "write error: stdout" +msgstr "rašymo klaida: %s" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Pabaiga.\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 "" + +#: 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 "" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "" + +#: src/posixos.c:186 +#, fuzzy +msgid "write jobserver" +msgstr "rašymo klaida: %s" + +#: 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 "Skaitomi „make“ failai...\n" + +#: src/read.c:336 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Skaitomas „make“ failas „%s“" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (nėra numatytojo tikslo)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (paieškos kelias)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (nesvarbu)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (nėra ~ išplėtimo)" + +#: src/read.c:655 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "netaisyklinga sąlygos sintaksė" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: src/read.c:986 +#, fuzzy, c-format +msgid "recipe commences before first target" +msgstr "komandos prasideda prieš pirmąjį tikslą" + +#: src/read.c:1035 +#, fuzzy, c-format +msgid "missing rule before recipe" +msgstr "trūksta taisyklės prieš komandas" + +#: 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ų?)" + +#: src/read.c:1138 +#, fuzzy, c-format +msgid "missing separator" +msgstr "trūksta skirtuko%s" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "trūksta tikslo šablono" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "keli tikslo šablonai" + +#: src/read.c:1289 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "tikslo šablone nėra „%%“" + +#: src/read.c:1404 +#, fuzzy, c-format +msgid "missing 'endif'" +msgstr "trūksta „endif“" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "tuščias kintamojo pavadinimas" + +#: src/read.c:1478 +#, fuzzy, c-format +msgid "extraneous text after 'define' directive" +msgstr "Perteklinis tekstas po „endef“ direktyvos" + +#: src/read.c:1503 +#, fuzzy, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "trūksta „endef“, nebaigtas „define“" + +#: src/read.c:1531 +#, fuzzy, c-format +msgid "extraneous text after 'endef' directive" +msgstr "Perteklinis tekstas po „endef“ direktyvos" + +#: src/read.c:1603 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "Perteklinis tekstas po „%s“ direktyvos" + +#: src/read.c:1604 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "perteklinis „%s“" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "" + +#: 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 "" + +#: src/read.c:2122 src/read.c:2168 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "" + +#: src/read.c:2128 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "" + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "" + +#: 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 "" + +#: src/read.c:2636 +#, c-format +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" + +#: src/remake.c:226 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "Nėra ką daryti su „%s“." + +#: src/remake.c:227 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "„%s“ atnaujinti nereikia." + +#: src/remake.c:323 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Vis dar atnaujinamas failas „%s“.\n" + +#: 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" + +#: src/remake.c:399 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sNėra taisyklės pasiekti tikslui „%s“%s" + +#: src/remake.c:425 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "Svarstomas tikslo failas „%s“.\n" + +#: 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" + +#: src/remake.c:444 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "Failas „%s“ jau apsvarstytas.\n" + +#: src/remake.c:454 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "Vis dar atnaujinamas failas „%s“.\n" + +#: src/remake.c:457 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Baigtas atnaujinti failas „%s“.\n" + +#: src/remake.c:486 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "Failas „%s“ neegzistuoja.\n" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "" + +#: src/remake.c:674 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Svarstomas tikslo failas „%s“.\n" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "" + +#: src/remake.c:694 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Svarstomas tikslo failas „%s“.\n" + +#: src/remake.c:699 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Tikslas „%s“ neatnaujintas dėl klaidų." + +#: src/remake.c:751 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "" + +#: src/remake.c:756 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Failas „%s“ neegzistuoja.\n" + +#: src/remake.c:761 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "" + +#: src/remake.c:764 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "" + +#: src/remake.c:782 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: src/remake.c:789 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" + +#: src/remake.c:794 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "" + +#: src/remake.c:802 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Nereikia atnaujinti taikinio „%s“" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "" + +#: src/remake.c:824 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "Būtina atnaujinti taikinį „%s“.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr "" + +#: src/remake.c:839 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Vykdomos „%s“ komandos.\n" + +#: src/remake.c:846 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Nereikia atnaujinti taikinio „%s“" + +#: src/remake.c:849 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Būtina atnaujinti taikinį „%s“.\n" + +#: src/remake.c:852 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "" + +#: src/remake.c:1047 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "paskutinė komanda: %s\n" + +#: src/remake.c:1422 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: 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" +"# Neišreikštinės taisyklės" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Nėra neišreikštinių taisyklių." + +#: src/rule.c:548 +#, fuzzy, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u neišreikštinių taisyklių, %u" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "nežinomas signalas" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Pertraukimas" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Išeita" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Neleistina instrukcija" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "" + +#: src/signame.c:112 +#, fuzzy +msgid "IOT trap" +msgstr "EMT gaudyklė" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "EMT gaudyklė" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Slankaus kablelio klaida" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Nutraukta" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Magistralės klaida" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Segmentacijos klaida" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Blogas sisteminis kvietimas" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Žadintuvas" + +#: src/signame.c:139 +#, fuzzy +msgid "Terminated" +msgstr "apribota" + +#: src/signame.c:142 +#, fuzzy +msgid "User defined signal 1" +msgstr "%s: nutrauktas signalo %d" + +#: src/signame.c:145 +#, fuzzy +msgid "User defined signal 2" +msgstr "%s: nutrauktas signalo %d" + +#: src/signame.c:150 src/signame.c:153 +#, fuzzy +msgid "Child exited" +msgstr "Failas jau egzistuoja" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Elektros maitinimo sutrikimas" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Sustabdyta" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Sustabdyta (tty įvedimas)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Sustabdyta (tty išvedimas)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Sustabdyta (signalas)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Viršytas CPU laiko limitas" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Viršytas failo dydžio limitas" + +#: 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 "Langas pakeistas" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Pratęsta" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "Galimas įvedimas/išvedimas" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Išteklius prarastas" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Pavojaus signalas" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Informacijos užklausa" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Slankaus kablelio koprocesorius neprieinamas" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: src/strcache.c:304 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: src/strcache.c:308 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n" +msgstr "" + +#: src/strcache.c:319 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: src/strcache.c:322 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: src/strcache.c:328 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# failų maišos lentelės statistika:\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 "" + +#: src/variable.c:1668 +#, fuzzy +msgid "command line" +msgstr "%s: komanda nerasta" + +#: src/variable.c:1671 +#, fuzzy +msgid "'override' directive" +msgstr "tuščia „override“ direktyva" + +#: src/variable.c:1682 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (nuo „%s“, %lu eilutė):\n" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" + +#: src/variable.h:229 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "%s: neatpažintas argumentas „%c%s“\n" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "" + +#: src/vmsjobs.c:244 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "" + +#: src/vmsjobs.c:1224 +#, c-format +msgid "DCL: %s\n" +msgstr "" + +#: src/vmsjobs.c:1284 +#, c-format +msgid "Append output to %s\n" +msgstr "" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" + +#: src/vpath.c:620 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr " (paieškos kelias)" + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:194 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +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" + +#~ msgid "write error" +#~ msgstr "rašymo klaida" + +#~ msgid "extraneous `endef'" +#~ msgstr "perteklinis „endef“" + +#, fuzzy +#~ msgid "invalid `override' directive" +#~ msgstr "netaisyklinga „override“ direktyva" + +#, fuzzy +#~ msgid "Redirected error to %s\n" +#~ msgstr "skaitymo klaida: %d: %s" diff --git a/third_party/make/po/make.pot b/third_party/make/po/make.pot new file mode 100644 index 00000000000..73f64ae7141 --- /dev/null +++ b/third_party/make/po/make.pot @@ -0,0 +1,2123 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as the GNU make package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: GNU make 4.3\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\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 \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "" + +#: 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 "" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "" + +#: src/ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "" + +#: src/arscan.c:130 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "" + +#: src/arscan.c:261 +#, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "" + +#: src/arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr "" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr "" + +#: src/arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr "" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "" + +#: src/commands.c:628 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "" + +#: 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 "" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "" + +#: src/dir.c:1094 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" + +#: src/dir.c:1099 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "" + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "" + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "" + +#: 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 "" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "" + +#: 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 "" + +#: src/file.c:283 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" + +#: src/file.c:287 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "" + +#: src/file.c:290 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" + +#: src/file.c:310 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" + +#: src/file.c:316 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "" + +#: src/file.c:872 +msgid "Current time" +msgstr "" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "" + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "" + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "" + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "" + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "" + +#: src/function.c:799 +#, c-format +msgid "first argument to 'word' function must be greater than 0" +msgstr "" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "" + +#: src/function.c:1533 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "" + +#: src/function.c:1557 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "" + +#: 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 "" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "" + +#: src/function.c:2290 +#, c-format +msgid "file: invalid file operation: %s" +msgstr "" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "" + +#: src/getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "" + +#: src/getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "" + +#: src/getopt.c:705 src/getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "" + +#: src/getopt.c:797 src/getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "" + +#: src/getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: src/hash.c:50 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "" + +#: src/hash.c:282 +#, c-format +msgid "Rehash=%u, " +msgstr "" + +#: src/hash.c:283 +#, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "" + +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "" + +#: src/implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "" + +#: src/implicit.c:786 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr "" + +#: src/job.c:553 +msgid " (ignored)" +msgstr "" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/job.c:899 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: src/job.c:950 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "" + +#: src/job.c:956 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "" + +#: src/job.c:1071 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: src/job.c:1575 src/job.c:2487 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" + +#: src/job.c:1642 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "" + +#: 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 "" + +#: src/job.c:2212 +#, c-format +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: src/job.c:2226 +#, c-format +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "" + +#: src/job.c:2520 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "" + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: src/job.c:3605 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: src/load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: src/load.c:256 +#, c-format +msgid "The 'load' operation is not supported on this platform." +msgstr "" + +#: src/main.c:335 +msgid "Options:\n" +msgstr "" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr "" + +#: src/main.c:345 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr "" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: src/main.c:362 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" + +#: src/main.c:364 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:369 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: src/main.c:371 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: src/main.c:380 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" + +#: src/main.c:384 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" + +#: src/main.c:386 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:395 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr "" + +#: src/main.c:399 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr "" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" + +#: 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 "" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: src/main.c:849 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" + +#: 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 "" + +#: src/main.c:864 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "" + +#: src/main.c:865 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "" + +#: src/main.c:941 src/main.c:956 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" + +#: src/main.c:1009 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" + +#: src/main.c:1609 +#, c-format +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" + +#: src/main.c:1617 +#, c-format +msgid "warning: -j%d forced in submake: resetting jobserver mode." +msgstr "" + +#: 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 +#, 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 "" + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "" + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "" + +#: src/main.c:2226 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "" + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "" + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "" + +#: 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 "" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "" + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "" + +#: src/main.c:2901 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "" + +#: src/main.c:2965 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" + +#: src/misc.c:643 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "" + +#: 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 "" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr "" + +#: src/output.c:658 +#, c-format +msgid "%s%s: %s" +msgstr "" + +#: src/output.c:667 +#, c-format +msgid "%s: %s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: 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 "" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "" + +#: 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 "" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "" + +#: 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 "" + +#: src/read.c:2122 src/read.c:2168 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "" + +#: src/read.c:2128 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "" + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "" + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "" + +#: src/remake.c:389 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "" + +#: src/remake.c:432 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" + +#: src/remake.c:507 src/remake.c:1039 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "" + +#: src/remake.c:509 src/remake.c:1041 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "" + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "" + +#: src/remake.c:699 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "" + +#: src/remake.c:751 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "" + +#: src/remake.c:756 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "" + +#: src/remake.c:761 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "" + +#: src/remake.c:764 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "" + +#: src/remake.c:782 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: src/remake.c:789 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" + +#: src/remake.c:794 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr "" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "" + +#: src/remake.c:852 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "" + +#: src/remake.c:1422 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: src/rule.c:289 +#, c-format +msgid "warning: ignoring prerequisites on suffix rule definition" +msgstr "" + +#: src/rule.c:530 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" + +#: src/rule.c:548 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "" + +#: 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 "" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/strcache.c:304 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: src/strcache.c:308 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n" +msgstr "" + +#: src/strcache.c:319 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: src/strcache.c:322 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" + +#: 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 "" + +#: src/variable.c:1668 +msgid "command line" +msgstr "" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr "" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "" + +#: src/vmsjobs.c:244 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "" + +#: src/vmsjobs.c:1224 +#, c-format +msgid "DCL: %s\n" +msgstr "" + +#: src/vmsjobs.c:1284 +#, c-format +msgid "Append output to %s\n" +msgstr "" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "" + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:194 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" diff --git a/third_party/make/po/nl.gmo b/third_party/make/po/nl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..12c2d969b6670eedc1a61d530bfd70cb6532f747 GIT binary patch literal 44391 zcmb`Q3!Gh5b^i~F2m>gHfPlb(WSAMqog{z|CIm<_lVr$aLS~W(5#yb?XJ&5Z&b^oW z$Rtq^6!C?K^<9ha7lO1^tJR{dqHWcx^@WfA>)%JwwtpAb2Kt=ZQhE_6b4o_?b%Ox74K{1zyDE zIp780wcu01o4{ki+raa{SAaS2e(+@QyI=@D>eEl`4uVs;UJdqu*MUpGgWzf4Js?#G zJ_4Q%eg=F7_@K$gG_*3v&@KT6!EBHcCcoKL&NLK})^yxnWFX#GEQ2Cc$;`rwh@N}-%gETSN z1M2;+^y%*g&*1t&Q2g*PNLK~F0G|$?eW~Nei$S_1xZYpi4vJsz1D_6l3lyI{>hYv! z1p!?fTnf?!!E-^nD7X{U`#%oqxvzn+ZtxRO{d>Y?i~(>1NELzz6n)ABz%kLy9be*%PsgO`A6|3^U4^RwWW!0&*1?tNFfe*X*bRIYyos{9in zN(f#Gsy;hG<$peS3iuXK<^4V=x_=ft9{g8ObbbPZM*V$;$2H&9`aJ}Sza9fm2hY65-M<)oGS^pvs>dJ*iwFBb)#qOD8Q>p* zs_&OU_1}*`m3Is;)p%G5icZ&nA-Ek>{cZwP&Z|Jx=gpwr|1R)c@K3-Kz`ybM_n_$Y zOMm~Yb*}!aLGjxZsQ$kbJO_L)sB%B&)4u|$zW?B_pMWq^`=1Gl-!_5gff1 zuLH%W4}g*tl2i4zKf@;qMxCDGLcqaHh@OLtpzhZ})$dMF_w(`kxM}-b+E%GY58qYyI^U zsB!arP;|NrRD0h9YW#o5i^e(>W6zk@x|vsjmt+s)%TQPcYOue!}S!XdcGQb0(dVdy4(+{ z9$y9-!oj1Usmu+?J*#)Zn z2B>uE@7JSl(8|O~}#Sf=} zOTj+y0&p8BdN)D!=c~adgC77jAASfF9UcND2fhXBxktf^z*DxndS4CpalIex2j32M zfnNdD?(c#Zf=|27(QOT=`i_DsZw^#@-U_N7p90kn-vRaBpMm0oV|F*Z zb^m#w%6XAbe9npc8$683qaBL z2Ji&s2cHHuLG{ziK+*4`;7Q=8K-KFj;3?qGK=tpFcDi<*3_g|X3qbYDWuWS}2UI`b z4u;_Upyr1!fsz-02d)DD6I=maw#!{lfy(!GQ1ts4sB!icfBj4FG_FtF?dr1>yo~Er z;H6*%WM~HO1~uM(3O*e?{@JdbA*g=71QcCw1VyhmgW|U@f$GnPLAC2YLG|Z}*Sm4k z3yRJIpz6^8)nBg!)!zHSXMkS^HU1w3)jyAcYUg=3xa%FD=zY7t{t$RE*MA49ywmr% z{<$0!-wlF#z5<>Mz8w@ldY3@Hvj3uLC7tZUuG!9#HlA0;uvI z2ld{b8y!72g3sdm7Et*=0!lvoz~j-+b#&_iMbAB;`r##@+VvnPI{qVgHhA)0SKsB} z8C+ils(#M~&jnu&t^w}_SA#zR2f!uIbM<^KsCwKDs((KTs=trPyZWyNRliAaIrwsL z75H)Ra`5M%`1itb*RNNB8VB3J`;Q8O=YXo$aRpbeC7}3t43r$W89V`e8MqXDJt+C{ z2~hm?V^ID7AE4U5ByxOn9Vq&iK=JV#LDl1vp!)Btpvw6^_)PGGNo*0Y4;%t-14ZAz z09Bu#fhzyZDR>Ut1R~0UZ-58DrPI!Cx(B?H>wf}o1urTF!8-7Ma1;0#xEWlv&)GM( zgLiTLHLwBZXRr~$he6S~w}fm3Zv?l4KLz#tRkNAA}?0w`joV*<8mGt8*b~5|p!$C$cq+IVRK7fTEO-Fy0&fGA|4#5E z@XcTde!!=H5xkb`Z-aXOlBVnLmEcmYhrqSqK2Yz!-{a>%z5jdQIpDv6;-}O1yLwy= zF6Vj|cqw=Xcp>;F;7ahvpxXJ2Ima(6z<#c80M7$o?yv6yS8)AZQ13e)ra2w#1}^~D zfa<>j7=rHxuK+&>_JRKeijVpZI(nBtm2)@vRPY0!>h%e575E5v5qQoaXFp#H?&kU~ za0L7@xDmYU`Hs%FfX8tCQc&-^3k<wn3cM1$9eg_YY4A+& zVUIrpRo)3VJ9=COsz06$D*a|q^?sjE{~DQ1!h7dM9bpsrsGsy!bD&jr5%_JNOq;-fQO;pF}%P}ets=YVeqRqsCqd%#CP z@#%@LbmO}h?Be=*Q1mW>W68M zw}O{({U%WI<13)X=M!J+7pAxb|NLKAG#Q!KZ>7L6x%`RJnJ6;@6LXYWLT{ zF7Q|2)4?aa(cM2CRDWLr>bdRUwcu@_=7qlkSAtJ^lcU$=pvt)kRDE9nY8-qFR5?EY z)z7~HmxC9)+0kVe_zbQOfU4JPJbn-ix&Az;_WdI$etO*FGk@2Wb0w&LEP;Cdjo>!$ z!=Sb2Esn0IgW{iUp!($oQ2E{nt_OeY@xtG8a-|HeA^o+W==fDo{PY9xH1IJ{bUEf8 zXUAO*svT=V^~(+5>EKI2@#Wh#@Rl9{RZ$XuKy4W!7qWAg8u}r1(&?t>3oBja1+;?LDB7XpvJ*{ zp!o8upxzg}%Z>ljz)>#G0@Xhia0L7msCqo*-LC#udu)KB_r2g#z=y$SfscUVv$Njg z`e8Gu`b~h!HwT^r-T{i9?*T=ZZ-J}86W;6O}fqKucK#iLv_qzFLE7;BTb3wiTcJKo5 z6W}iJ2jFIK)d!qja6352^~2!h;92)kCvX(J7W^adDloX;(f?{t?=OQ&ef^pY5zC4KGt7r-h2bs`bl=`*TwOCJ460(Z$0Oi zf-mM+$MJ{$-e){+1;;q<;GTZVz~}h$8^9I*{CB}Ga{muFZsL3Z)cAQn=aN7F!f_Jk zck7ztIF8@r&~GQllR4M;m2CPejvCjSIR1w7633f;-YY$l6bx|wZ{W{$!S7EU*#DPs zZ=Jt>C+9EVcom0!%Q-Yx{a6?L_K`lp@pO*uK9AD>nB#?+>)+>kN;fjUXL0@^j#rTH zjXwP+9(zfH}F9mmi`n{9mx&HhB=M9ek z$FYUu0~}{^?*Wd7IsX%mr*VD^_!|GrO`KoI@i~t8_d`yuiZ8(39D6t(<#?Ze?&F-l zl;ay5ALG#PP277D_!oBN{9vm|dxFwA&f~a*d#7@2=eU+5BJK4Y2RYCFUgR(S9IS9` zB+q-mC;Ie|>(&1JJ)A%2&))?ObNxE-E{-b4%eanz|G>#-IbOzbKF9y%h=1SWWFyCS zIqu|{*K!>4H~-AzF`2R|ocD3O%HR7QILom!ljn5KpG{hxR48pD@VRtj^*olN;q{y@301wyOlU`>SAQD zeB0Y;wJWC8u7pb5M)uad*PUq{>xrWiY-pDuVjtbp%wW;2yP2?x0 zqj0=AIT_XT7&qEe2g2@>`nJ^U3zzF|u{>1|*I25qE4BPoA}imXb((5cSv9qR8<*?Dy&?|8NcQVegGYe3mj|K$~-+8=H`}# z(f+6$7AHffJeQ|v?$JIP9J6ZaU|L`uB2$m{-_XQ#C1jKqRjuAav2JXY%lYiH(4@~7 z(x~MpqW0(Q+BH%4JGW;pkDzFl3(;he8s=h2Q4ho2+zIEVX-B>sCOMM99>NK=2tJPB zuY#+`x@Ax(Uz*DwtmkGWKGNUL@wWuLM2YJ_rgTp(9){l+s zxL!piG+vV=ccn#kI$IBmF+3WTw4iW2q7xBi6;U8xKG>M%#Jz7Q939&+yltai79kwh zxJ#8hBw48e;*;pbywzF*opH#mS$fTtGn~FoMHR~vrDh>g{g1fjUc4j?wSnaeDkLxV zblRe~AW9}?a`l6=rDAy|*C@`yCSkY}S=~U$l&E065zZWi6)qH1nRy{iNyWOb1WYouzR zGgN0>jdq6{hPMpq@ww@IBUhYU6JM93xtw}DNyyjh&DkhNx+N|0s`Zs}y;wlPsXVde zcqF019NUN(1(f0{FwVPYJ27+^4o{U~UxXuqcA_%NtX3Q^mWmB8Knk6oQmPyKrAlKl zsTQf_QF(unUKCU3D*K~aje6G?Y2Hx!Owvod%s<`EwUY^zTPP|~kR&Yf!W~h*;Aq)0 z9vu;<)r{$=RGm)}F9tPzF-+>3LNx@U14TcAi+Z+bq|VXyN=;+Q{agoxKGo(ZFO}VE z_l0}5*~k&6?^&}gGsmngl`3=LHa7E_trlm=4Po&AG0;8C4}^>bM%h z&9HiCtnMUpy~5!35|l}_+|v+)&E^Y{E20}_wWi&GhL!RW zy*EG6XxgN~lM>*5Qd}LXY^Od-u?qzchCFZFQ!uL3BAd%% zMyjfrUPVB8&YAM;`p_|av}nrPNgW*T9lby#Btr2}-=122eGLuU_^^NhWo?s|`9YZePq!wbv8 zspL!=nl#bwin8>^^I6{j7ZawEG-s<(p^r<)N)!27q$`s#DtcMS+|KJU1`d-vppu>3 zvVyEuv&E@tlLQS$%mfW^x8RIuGSBcugyc&q5q7!-MylqSr7C5m&<&M_RU%`Cazg?d zP6(vHR_b*(1z|kSOMtP>R*9)d9<{z+!I-G^2TQ_mZCs6I;nuaAhcq)Xl{34=deic{ z*L#u)#64G{5Or>SK*g++`N7M?)4EgV|$)Q8hxpEl*GrKX`biTvku^ zj%^wq4f(e=T(@&$pXJ}+Y#ujPH>(;<1$RS=U!g)NcO{ z`7SaO_1c8NY*Z+U*{U^^>YJLyIyyr70y4(J#}bEQyISp!4ez8D@RNJ?u-TF-&C9x6 z$}L_4Z$BerqS*oC^e)kPxQu2Dk4rz6G86Wom5B0tO)2hSg4IYoPkFcGrGi!pcp=bW zw(p&o zRuiHF(L}Q$9_^ML7ws=%t4UH6%MuWKIJJK__6>wblxd>UWCn5_7*^nJv%gx4FD2!7 zmkRR>Zoj=yku%XjYQD^y65Yd>UD`|w?0oa^#SNgtW@;~%>5=tlUZ0L0FuT>j_;Nk1 zvER|lvLw+!#UdT@1WQLZ4Q<&1pUFlnguSxNos=!3rRfYeh5E<|-9lfuj=2eE7-lNE zN+UYZ2z$?KmWu}th8J8Ao;RLvOib^Ul;3Na+|%(if|q9?tjj23UYKr%a@I8Kyf?js z6wEj7I`QO?(`r#+BCO#OiSXVuDh)IRGU6IiIjC;gD+XbD&pU+l#!NYS^Zas>3Q%rR z0lh;{cGvMm)j3IENIHw;rg;QrpjtVdE%nGim}H6N|3NP~baO*7f^kJ?<6iTIQ7iwF zVU=EMRvXI`zYjWXQ&Sn!rJG6*be9e+3-fq+Xt7*8M)QGiOO)TgaK+*ro$56v+qsdS zt;&8iWkejZI;=Ox(Zd=|8J%%0y-SR7EuGieT*S_uqJJvRr-+{NZ(g}@RE z=v0#p{CCKQgOw&M6S-tq(}_5kpn%4M=MXRQI8zYr$bKsX1w)LqZ6w^icE^sj+s1IW z@tC|W2stUiIFDzGEF%=;x+&%5rs%HY#5Qe%tfpjVI?TrK0{55U>xc@jIFa7+?{Tu_ z#&Ad$H*=y-ZQhs>B!`nVd%9b)%^%k;Lp<&mE+)>^UW#!El*$-ZK~L=8U|^UrQQRK| z7hZT_xRzxb&b&K;$pxjS2bC^CV@ir%+?w2? zBev$*oyW1NCm~|fyi2x%BLlskpOqtbE_nvR{w*WB_wE=P9oe#TYH}VI9ocCIy8Fuhm_KCx#Br$bQA}?bf8tz|Ib&LnJ`kdU~P-U5oAobNWP7)1; zT7*N)9PaDKc5KOA&kfctjL2G~7+k-FZtD-jQQVC>8ywoOcITF{y&Ff?qG6ycwz$8zn*imf>|QoQ)0b*ftu{>5}t~S$u`_vFaVHMq|)B+bquDO0y-4<*S0V zFtOD_I~_XI;qsr_sBSBeF-BbXu$*J=~t$Ch@p3@}j@RqURZQ=SsE8MiSgECWWAt_iVz09$+scmJg!yR{x z`6=-F@~RFQsO530>AG5F1~ab8s!OmAlfm46!TRkxovBhPA{G&n6DG}q_4%@~7{rEj z=%^9qaV?LNNF%f>SU(M)g?Z~7e<7bE9k#w$n`lB$S`c2z99S2FJ45wgSg2JXFATa~ zR2AJMfGC@_*raW$?ZWrt^}F8g0(w$=URTfd0xP8wmM3oOHB5QSIo5RduV9%uSnplg zs*M-?i4>yyxQz^Is%43S54W*isnrr(;5FrmRsYPLV)-yP;2?iTs*#`4#`6<18lS9O zvqFb-NF+AIvR>Fu&-L~tO^;}YwO%)^?nxK5H{JVxWReE!aV=J6;XU*5;UZy}Nl)ks z82bK1N@5Kae~NkpLtDo}mf5Po&}_9q_v3gm$tj17Ph<6Eyiy9yMI%uy1=4hnA+r!w zIoQDa#JYmi5n$wJ>=E$G?NU$aH>=phbTU;EkxTJ(rn&csrftYzRbJ){SH06 zLB_L9h^@*QouA&4O~s(IMGxe8z9ccEr3%Yp=1|)ZN;Vv1EqGh8=vW88JHbqCQ7ml) z?|@L&$5mE?B=~W}R%D(-Yz@==etbI;>g_p`1?gY|CYijuZGuYOrKYPPmLpqPM-&?F z#I*8}Ez1CKtn39%zoZk5PG=WTauR!gSsvob}(TRFWJUeeF>ot`bV`r$AcUrbB40YD} zV8fON7GT$wd`>~lIS<|8S$r$PA!Y}iCu1yho@F+ZRGl)Lc(YWRW~XHDZpS=b0!}s#cX+#h@Sh+bRJjPOA!IgUgsb$z-OEQzB;W;DM%8{HVL7Is&D#( z?UgxZ$w?$HDtNFx(ZC7X|sh2H?3?r2!4_!c8uWJ??!4AxhSQ#+; zl@up4#7W6GoR=y)uS=;_Riacet0C#ij5v$4%oW`VNas9w9vTn~w*g%$zEbxYn|L30 z%Y3!NIm{D=oNW`I|j8yitWK=4A)Pl4Q5)1VKG+=v|>=fpS zc!QKHG}!>f1kk8QrOB{YJHOm=wW=Ub^_uP`GscccQ-vx(b8H0-Z7ONmJaxjV*x?B? zn>y#lRFHeQVfKrflJu=M;8}sQ71KPD8;&vHMH9*~C+=Vk(DKcjd}21!V8@1L{~cll zV|2>4dtKvQS67J>{azhq5Hr$P+!0vn`&Ra8MF<&Bo=UUES_tgg2u6oDYQ<(qC%cEY z4F;pplq_SXuh_C>FgjDL8iVf~+mKrot{d4Z-f9^cU5jOMn=i>Gb1_xR;1QX!Qt(C_ z;@^%6rmTJJGO`$ky-xY>OA{LC{x+wzr8#q$#O!*JCK>$NUf?90r#hIaz#<$RJ>#^v zM8@I@v0YN)rQDYOV9aTdF_#xAO*GuxLDxp>o+58tai{3HMeUzTbK=9)zjsPmpN@@na*XNgr1lke73_5 zyq$6@>t$M0k7sDP-MWJ0R?MR2jw78dk0`TJ@UfNLuE=1gb|p!>4)-|cHZHb3jx}x! zU2$?xdo6vZ&i$@UZ-Ry^DPw->#iXiw@!G#%t!2z3B1BVFv?WKaRi1NySFt9U);8xQ zF2xOrWhh>A>%H0aUD_nO)`b6Llg+SEu)A0;u+-tT8$xTyyU~!e5c4(5DR)d_xATNs zfe!Lb%yQ^G5#Z2HB)it{GFGQ1nYy-T7|T*6Yi8g!NNJ5lZbWnGI|Wdbkff&f7&-%T z;8t+qL2v+L##3vkudji=0N^F42~WH7;qF}6i4v!`3`u9hTcb|nVYK-lY@ z^d<9I^aY-uf%}nb_+UKi zc7C9SVH3Yu4A?VQsUeyZD}7d$4~pBAcmraZM!q7LG}lsZt8cR}m~{T)dFi%bCPl>N zCFFrh#Sycg4W+VeO}YeAc;KO=-)1dZsq4CubZts9W7#EZ$E@u*bbM+2il>Y(DflWz z!Zh9g6}M1|AZz%vGijhPj%hV=9oqbsb|!ljV|POiF+&G97Vh{^(=85AxDh9Ll3t5l z5PEL@u!&j6tzk$iCQ|@jM9QHA^LW&!5pc-JvJ!oonk^kSD2>;aLXy2a+o)AaslU@t zV2Din)}vrK#ac*ZHVUN~sk!ky?hAK|s!Udv(dhJ9vtHo^R35KPR@wNYy&x=$qa)2_ z)}7p)t{|T3f_Mn@xG}Vhkql4G;3!uStc&A9%*wqp5-KS zlA`Y<3T`n6$9Xumb{)+^gu6Y4tI+k)7V1~`B~LmgO%_}hS%u=Ud8Rk_# zO|q@!*Mo9}e{Nk!BEc;yMeL2hbA}H>(jS3}(xMqE_M87!PspGCTRmWY_Hw11V+gUm zV*;VIh@hbSMRT)?&`3o~%M*3&{Kc;HdmIu;)b@zk?6MVmqEbET(UNq_Skb_f$ThK> zRq*gYyLnU&4~%9xI2dP+i|T>*3Gc;RI@mHE+-FV_Rq`2Q%K4>(Dwdtxd>V&tresVM z+Afotca6ON941HPB=rm|VP@VCt;L{#vA`xRtChW5GEZSHW1MAHK+$Nt z5@^bqMoRpIjRkv$G{|v$R^fmdF9T|W{1EjxYpkzJ^x-)%+oq?xyC+b6C_)wWyF=0q zCk(7|u0=74xz9b8>z?TJ6oxv!L(G278CvW~pR#?-`cPB1V~47<)RJWeSvI@2js~_B z+9|NHqd2eqlZYx`LYyVuLXeP~iu=8$aTcw1)*^jT#%N$hHPby`+w1DE*KNDz#VR6x zW^3yDv`$P*RgYNCwh66N9Jggms|a%iE?>SMj2r4FiS9yx*Ncs)wua3pGnW>MXw`fF z2HK|HX4!8V(`>F=NA&2nowoN8 zds(_&oz2Rt^+wz9CZ!_w*QFIT2cA?jeevMsnrx+vOh_}QRfd(~g|-2|fdRJ<^x^Bw zu;-#4bptcFv^J+ps zOu3E(sMH3+brBYAI65&+AD7t{J{4Zcavr-`>E3H5D%$v6?k}^qZHpE?@qpyUqCDHp z2b-E=GI{sciu>w(XIPwUXnS1x0GmciU0d12ls0f>{|dflMr89T+ZbQpgm=iJ0r%LlVYi@`kE5lBz0#^Z&|xqR`#vt6X|RmfZU-IvzV`CiOV(*0 ztiG0T>F~)EFJdCEkLMAx`zs|(Sf;HCJ0h_`sn*)k6w;rW-d8sX3*bNNjKg zcYMpTkZ)D-klB0Po0M;(UXnk8w^`#Y_dI%~x6mSvfHK>UD3>k!r`=^_*=1n_XuPAV zyh}Kjq7vVyGSOi^(HZ)(wTyb`NuIYfdE2^E(S|Ga0k<>Nfw7Yf=>Hpm z2X+y7VB=8sv(V7?|7sNm{-Anw8qBCgl|b+&F$W?)4j6s*ar^?Y2Tb8b`_0YuSX=o{ zIx6!`Rb_?|qn%}Zg^&z}MZUQVwI*f+Iuy}YKIp+=ViZU#Ad~}jcVkv6Kf5tq?wlM8 z?44z444FHl!N9H!6^InY80h%ZEu=5sf}v^1(>sq0(uF#QETHO$cIKKns-cFLxeg^a z*m}e6V@$!KI4oL>1c{Vn|5vR*h=`~*2Mt|6ED+^@_lWtNY%LY{iToJ(?3beLHt)J3 z*7N1tc72nW>|R?#f}@Ak*?J5|QaD9VPzbB1$l#DqFPU$wKv&REI5xC-bWBBA`~ti3 zbhR>Ef@rbTFCd!)a+^-|NK+9UtXGEPO8KwvEPR2lR#Kk=&6A|3IaX1+D$?c}uHzRl zFVM#egeWkvr(SXUV2bou6wYWxOQO0;dqJ z`wB>u@mjM;J-e(r|C0a*;^6%ibY_X`IIaQR+JK^Jgb#m!kB&=bMnyWXmo5SA5tv)Q=AYlALQoC+Cl%{fhRd?Tz;Y4uqk*g@E< z$UjpWqdo zfWourB;v442iX7}$NXp?0Fzm&%fGQELtd%i*|f!ot7^s?kyjXu(D9gSXZHm{A-LH9 zeH^hpBaalFg)R#t+oHCk!UEwCoJeDHhQ_>etGO9K{T9oT1!5x5qm6h(QG&+QHb0c) zV=<}O;CrYBl5h25baAsf1u&_rT%OUFa+>^c7tXl(Yk`0Y2pNnCCu7;`O?@PF#I~Y0 z3^>yWXQ-j30nZ@+TQL=kj=a#k@UbkxvKCq0q`g?6n8j|x&0L{wvE zw1EF%42E=yH>!A9DD^^f8wC$ZVNyVJ%;yO%4(@~Q` z3WRouC5YlGI8hRhAf><@_TpvEmX{HCxMU0Rkkm}MtlAPx`N^qhCeO|ZsZ6?KJZToC zI8V|nN%esq(w^%Z>bX_Ojc<0p5E*jqfa&)%hL^2TpaSF62NdC+CgwB{!A{k#Q zvlI*9(c@eHAqGfNnM6axGGTWS-kE*WrI<(W^kE>B-ZL)@M2{7<)r2u7jYWSLP8r@@ zA$r-MM0b92hVM2S=pJfirCPwAn8s|S8CJ};iuOlRTiC?0dwvo-5$gnX-C7y;4i1kg zD8$gvws8B7k&QdnZr!?e!^qAt7aw3GryI1(AIukl#gib5jz;t3!?9&!Kf}OgU=>?QFA3#FNJp;*U_gZ|m7!tc% zm3^90#xJFeenngwq|sn&1@Y#l?+o$rQsr*4kEu0$A)~f_i-)#FRnq`^kv>LWW20;^ ziQOjA@r1=gC2Y^z5=|oIH_vX1vDa4WTen?;nfhAYBrz~_)L+TGL!EKn^fLZf64#E^ zB<@3}xDtzHlSHvT_5_=XY@{%-+h5ZjKw{AhixpijMQD^IT7&P8>nbg&-DuEbt3KsY+}ToYEF=zEzcr8d*5AI(3FIa8xT9PYfU{ zxulhf%#3J>a=ST!@0=5vU=Iu3a*hla8iS#VShFz~JC~(hxaN45hnDM}SBrv1&! z;U&6Rd2vxKnOta$BYB~Zbn#ncU9ftcYKCf_1jeu#$#`ho>|&={cnZf{8q-1nMSQao z4vt+ziv8j4p=fv|MnW)s0ax<0*q$0Oj2~N=mA1&hH`MxA%E!eZ7-4Iw%05!x{t@Pk zo%=qPhFn}7gK0$JCDI-lVfdMjFq(#{O2C~8X)hqO2?vt*8`o!#EzUt=BSn)o?ma3{J6 zFOc>JV%MzNZjCbcip8>G6tjSd{;Sa`uCZs6SQ{Jg+%P@(M2n$8n>vY(c46iMYP5-v z&Y6xx8g(oVN_lY=%gkn#P=YyyVe8L?-pIvjti_|SZ8L1MigiaPa5dB8+!D*mI^v5( ziC^A8XG+O*k77WL+c*F8hT?GSitnqZDPi1e^{P+D3|XywUgq7hK15%A>>Dqide=jiSvjlUD~ztwyWo*ZYOa*Ho^r+QFx>^)W8`~O>f2ukqV#@VlhCB z$K~eNXOMhR;+IUET7pf@ zE9&f;D@k;P1A>-Bl`FT9Tb7FhjqsH!sTog)?d0~MM;!g2yu3IJOY2A9yP3*lDPx^@ zq&Zb3?U5!ZJDG{m z7QZA*v3Mi$R&%au$Su?mE#0$mJbKgfTF)LAQNj zR7x2HDG98^5t!5SqziMRc|;La5bfGpGe18KX7$kqjty&np$Ig}XA@ zi4v4i3R?YrZTD<51q)IcrcA|wFTWle*u0`eAnc->WWYNyJFiBzN*?PJaC_>Q6g}H3 zpUF6gh-bmF5aBAF&EptI6^#Ya7h!N$=KHT$L=Jryj}-^AGdVwmlB*7QJt#S}9jLE5-OW;|(nFL`~Hm`h6d8 zh3&T}px*M=7u%f2wzB(N$w=TB-`|0gE!+x|ffhMq8OzDj|)WdTEvwj zd~6KjxzCLzO2vonLv8Af`IJ8hFi|U3+1M#RBQ7R=MLaLJK3AAj4_OSBG(*lU2~k~R zT)#pqmkp(L1skJ>?$fu9#0i8lTeRu0KqqHryH4R**2RmTZLLw3$C%h^8!w@Um`0y>_lhFMKL%+t#_mv7&i-WOAw1)}_3DUPd!G%`#gso7>5dvk62z8qY7C z%e9V)-`YO=E0!?6A(gK1Rkb z+veP##NkO9hF;~5wHZI*MP(OCW{b8k&R2wxwe9IH&c`|=vTft?Pr-ad;UaGbxts|x z)Bc!3%`Ey%i#yWKH*TQP-5MjzLsLWmt&D4W5NF3LuL?GzJ*epr3J)PW*X%hM8b{?5)oO<8X!@Cj*T?ht| z7Z#ughq{FdP8@KH&e1%YG{8h^!dkQv(Uz)`d=N&w+?t~F@JSPd$eLW+CDY{?kyK7( zYg)F+Gb-)B#c?XLqkU#Vu>KW8CUJXO%AGHmM2410M+$-$2CX;ZvEU{}7rRHBwiAOA zrQ1Xa9BU3+z7NHFv1epEOF;a^$vuN3LtAb%DdRIp&+&?Sl9K&C!3FeT5?dJ;sezh) zzmVL&n7~usr4@T@Q?{LQwaHA3v^mMIIh9E>CZzK;XJ$kn^hXnli*yG+%d6-#nARnW z7A{OzC)}Eu`~-4Ei6-vLf2!!DB}A~zTIg+>mrW^#rJRNvRL$Hs`_MPVSVUvP?Gkdz zV&a!-ix9+^4B&kq62`R?uGH3Ab_#1YM16{D4%!ZNXAX*y`vbYmw7lso3DXtQ9UC@6 zajDzK`|_pP>JB`Fn1J)$CO{RRcu`c`e1TwN#tOp)iCV}ifwkD?fvn_EMypcCJ5Gge zEu!w`1IylJB_U_PBqOhNmG!o1~e$+24@7rPS(bFjgdF5>`1HsgLk4%;w9KBuezDAl~(#oY2==|BYi3nSgTPiS#bhxhySR zqx5^clbbFoMbF_gh>a#Q_hmY zOei7z;Zh$lu#!)HL>N9vMa!~)e3^JejOfFKB(ic2^8~Yk6!N$(ZW_^8?a9TSESuHv zkV-z7<48td8kDGgsU#DZX#On}PA&IH=SaWG!Vv&(J6Dd$MDtf9fr#R7q+Hz?g>5m4 z61LL_?F!5(fuiER1`@%f%Q-n=e4Z5)@ccYa9vinz*2L|%fq!AVXaJR`4 zXVbLDGGgVrtpttmv}VaDGsg7>x%u1Y4ZD;H(-1~_soTi_j=06;TbdTd|Q^A|4&KI4jNX z`ghY-t8pQv!W*_sOWH5PCU~1u=CrKO3b&SzeU{W?7O;4kjKCf@l-crJ*7RxG7&@1i z0Q0gc1XA{Kr|#^3=)(_vxaK#IX6}bfFKj@uDOMwXfm`z8O2vWko5t)eHd1zI#m~u%pi$z@0msYf48iEtP>%)Uk(ZfW3H)Cu?y%LI1fDDfC z0gJ8_OVzfA^w*(bjQL`?^&xiN!uEB)%b_O?%hYN7Yv*uA2S`nY8UFYpJz&ZNdZ1H8 zNodh4xmJw!Bc-aOEgGX<dxzjp)+ndO#bpFOK9n!gk;`ZY5!AXgLrat=&*e7lr#&8LHYGJ#7I6a4 zmnZYf)CyDci{quD{@5VW#)`6msnILmoz)nN_sXY566%5G!G~JyWSm+bXn9k?j+Vt0gh+P76pTeQ5Gb}W)ev4x*YYpGEx4oS>%`SSLyjGcM0%Y<&& zg@eWit72kwb+pwat7tpH&_-MpR4?;#x{r!AUx}6K#Ck*Zvp^W|mDJQk1h+MEfucIL zz3p*zyD670(goyA*98>dyhG5c&OxqHiP9<1m7eJs>MDIK4WKwb+*PN?74WLl)AW_L fBub~_530ugE-wfIcb5fbH|Wx?c7d=m6a4=N*qX<@ literal 0 HcmV?d00001 diff --git a/third_party/make/po/nl.po b/third_party/make/po/nl.po new file mode 100644 index 00000000000..9b002782545 --- /dev/null +++ b/third_party/make/po/nl.po @@ -0,0 +1,2372 @@ +# Dutch translations for GNU make. +# 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 , 2004. +# Benno Schulenberg , 2005, 2006, 2007, 2010. +# Benno Schulenberg , 2013, 2014, 2016, 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 16:48+0100\n" +"Last-Translator: Benno Schulenberg \n" +"Language-Team: Dutch \n" +"Language: nl\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" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "poging tot gebruik van niet-ondersteunde functie: '%s'" + +#: 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" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: archief '%s' bestaat niet" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: '%s' is geen geldig archief" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: onderdeel '%s' bestaat niet in '%s'" + +#: 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" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() is mislukt, afsluitwaarde = %d" + +#: 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" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (naam kan afgekapt zijn)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: src/arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modus = 0%o.\n" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Recept bevat te veel regels (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Afgebroken.\n" + +#: 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" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Archiefonderdeel '%s' kan onecht zijn; niet verwijderd" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Verwijderen van bestand '%s'" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Verwijderen van bestand '%s'" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# uit te voeren recept" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (ingebouwd):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (uit '%s', regel %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Mappen\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# kan status van %s niet opvragen.\n" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "# %s (sleutel %s, wijzigingstijd %I64u): kan niet worden geopend.\n" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (sleutel %s, wijzigingstijd %I64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (apparaat %d, inode [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (apparaat %ld, inode %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Geen" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " bestanden, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "geen" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " onmogelijkheden" + +#: src/dir.c:1154 +msgid " so far." +msgstr " tot nu toe." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " onmogelijkheden in %lu mappen.\n" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Recursieve variabele '%s' verwijst naar zichzelf (uiteindelijk)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "onafgemaakte verwijzing naar variabele" + +#: 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," + +#: 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," + +#: 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'." + +#: 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'." + +#: 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'" + +#: 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'" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Verwijderen van tussentijds bestand '%s'" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Verwijderen van tussentijdse bestanden...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Huidige tijd" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tijdsstempel ligt buiten bereik; wordt vervangen door %s" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Is geen doel:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Waardevol bestand (vereiste van .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Nepdoel (vereiste van .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Doel afkomstig van opdrachtregel." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" +"# Een standaard Makefile, of eentje via MAKEFILES of '-include/sinclude'." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Ingebouwde regel" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Impliciete regel-zoekopdracht is uitgevoerd." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Impliciete regel-zoekopdracht is niet uitgevoerd." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Impliciete/statische patroonstam: '%s'\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Bestand is een tussentijds vereiste." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Maakt ook:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Wijzigingstijd is nooit gecontroleerd." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Bestand bestaat niet." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Bestand is erg oud." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Laatst gewijzigd %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Bestand is bijgewerkt." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Bestand is niet bijgewerkt." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Nog lopend recept (DIT IS EEN PROGRAMMAFOUT)." + +#: src/file.c:1065 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Nog lopende receptafhankelijkheden (DIT IS EEN PROGRAMMAFOUT)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Met succes bijgewerkt." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Moet worden bijgewerkt ('-q' is ingesteld)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Bijwerken is mislukt." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Ongeldige waarde in 'command_state'-onderdeel!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Bestanden" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# hashtabel-statistieken van bestanden:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Veld '%s' is niet gecached: %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "niet-numeriek eerste argument van 'word'-functie" + +#: 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" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "niet-numeriek eerste argument van 'wordlist'-functie" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "niet-numeriek tweede argument van 'wordlist'-functie" + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() is mislukt (e=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() is mislukt\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Opschonen van tijdelijk batch-bestand %s\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "file: ontbrekende bestandsnaam" + +#: 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: te veel argumenten" + +#: 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: ongeldige bestandsbewerking: %s" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "onvoldoende aantal argumenten (%d) voor functie '%s'" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "niet-geïmplementeerd op dit platform: functie '%s'" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "onafgemaakte aanroep van functie '%s': '%c' ontbreekt" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Lege functienaam" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Ongeldige functienaam: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Functienaam is te lang: %s" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "Ongeldig minimumaantal argumenten (%u) voor functie %s" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "Ongeldig maximumaantal argumenten (%u) voor functie %s" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: optie '%s' is niet eenduidig\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: onbekende optie '--%s'\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: onbekende optie '%c%s'\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ongeldige optie -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ongeldige optie -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: optie '-W %s' is niet eenduidig\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expanderen van '%s'\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Evalueren van '%s'\n" + +#: 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" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Belasting=%lu/%lu=%.0f%%, " + +#: src/hash.c:282 +#, c-format +msgid "Rehash=%u, " +msgstr "Herhash=%u, " + +#: src/hash.c:283 +#, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Botsingen=%lu/%lu=%.0f%%" + +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Zoeken naar impliciete regel voor '%s'.\n" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Impliciete regelrecursie wordt ontweken.\n" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Stam is te lang: '%s%.*s'.\n" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Patroonregel wordt geprobeerd met stam '%.*s'.\n" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Onmogelijke regelvereiste '%s' wordt verworpen.\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Onmogelijke impliciete vereiste '%s' wordt verworpen.\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Proberen van regelvereiste '%s'.\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Proberen van impliciete vereiste '%s'.\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Vereiste '%s' gevonden als VPATH '%s'.\n" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Kan geen tijdelijk bestand aanmaken\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (geheugendump gemaakt)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (genegeerd)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Fout %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Wachten op onvoltooide taken..." + +#: src/job.c:704 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Levend dochterproces %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 " (ginds)" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Token vrijgegeven voor dochterproces %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() kan geen proces starten (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 argumenten geteld bij mislukte start\n" + +#: 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" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Token verkregen voor dochterproces %p (%s).\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: doel '%s' bestaat niet" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: bijwerken van doel '%s' vanwege: %s" + +#: src/job.c:2108 +#, c-format +msgid "cannot enforce load limits on this operating system" +msgstr "kan belastingsgrenzen niet afdwingen op dit besturingssysteem" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "kan belastingsgrens niet afdwingen: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Kan standaardinvoer niet herstellen\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Kan standaarduitvoer niet herstellen\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Kan standaardfoutuitvoer niet herstellen\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: mogelijk geen omgevingsruimte meer beschikbaar" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL is gewijzigd (was '%s', is nu '%s')\n" + +#: 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" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Inhoud van batch-bestand:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Inhoud van batch-bestand:%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 (regel %d) Onjuiste shell-context (!unixy && !batch_mode_shell)\n" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Openen van globale symbolentabel is mislukt: %s" + +#: 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" + +#: 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" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Lege symboolnaam om te laden: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Laden van symbool %s uit %s\n" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Opties:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m (genegeerd, maar herkend wegens " +"compatibiliteit)\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make onvoorwaardelijk alle doelen maken\n" + +#: 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" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d veel informatie weergeven voor het debuggen\n" + +#: src/main.c:345 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=VLAGGEN] verschillende soorten debuginformatie " +"weergeven\n" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides omgevingsvariabelen gaan boven Makefiles\n" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" -E TEKST, --eval=TEKST deze TEKST als Makefile-statement evalueren\n" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f BESTAND, --file=BESTAND, --makefile=BESTAND\n" +" het gegeven bestand als Makefile gebruiken\n" +"\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help deze hulptekst tonen en stoppen\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors alle fouten in recepten negeren\n" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I MAP, --include-dir=MAP deze map doorzoeken naar ingesloten " +"Makefiles\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] het uitvoeren van N taken tegelijk toestaan;\n" +" zonder N is het aantal onbeperkt\n" + +#: 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" + +#: 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" +" alleen extra taken starten als de\n" +" systeembelasting lager is dan 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 van een symbolische koppeling en zijn doel\n" +" de laatste wijzigingstijd gebruiken\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" +" recepten niet uitvoeren, alleen weergeven\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 BESTAND, --old-file=BESTAND, --assume-old=BESTAND\n" +" BESTAND als oud beschouwen, niet opnieuw " +"maken\n" + +#: 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" +" uitvoer van parallelle taken synchroniseren " +"op TYPE\n" + +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question geen recepten uitvoeren; de afsluitwaarde\n" +" geeft aan of alles bijgewerkt is\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet recepten niet weergeven\n" + +#: 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" + +#: 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" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr " --trace tracing-informatie weergeven\n" + +#: src/main.c:399 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version programmaversie tonen en stoppen\n" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory de huidige map weergeven\n" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory optie '-w' uitzetten, ook als deze impliciet\n" +" was aangezet\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 BESTAND, --what-if=BESTAND, --new-file=BESTAND, --assume-new=BESTAND\n" +" BESTAND als oneindig nieuw beschouwen\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables waarschuwen als naar een ongedefinieerde\n" +" variabele wordt verwezen\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "lege tekenreeks is ongeldig als bestandsnaam" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "onbekende aanduiding '%s' voor debug-niveau" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "onbekend uitvoersynchronisatie-type: '%s'" + +#: 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" + +#: 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" +"Filter voor onbehandelde uitzondering is aangeroepen vanuit programma %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 "Toegangsrechtenovertreding: schrijfopdracht op adres 0x%p\n" + +#: src/main.c:865 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Toegangsrechtenovertreding: leesopdracht op adres 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() stelt default_shell = %s in\n" + +#: 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" + +#: src/main.c:1609 +#, c-format +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"Waarschuwing: taakserver is onbeschikbaar: '-j1' wordt gebruikt. Voeg '+' " +"toe aan de ouderregel." + +#: src/main.c:1617 +#, c-format +msgid "warning: -j%d forced in submake: resetting jobserver mode." +msgstr "" +"Waarschuwing: '-j%d' is afgedwongen in een deelproces: taakserver-modus " +"uitgezet." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefile op standaardinvoer is dubbel opgegeven." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (tijdelijk bestand)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (tijdelijk bestand)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Opnieuw instellen op enkele-taakmodus (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "" +"Symbolische koppelingen worden niet ondersteund: '-L' wordt uitgeschakeld." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Bijwerken van Makefiles...\n" + +#: 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" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Opnieuw maken van Makefile '%s' is mislukt." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Ingesloten Makefile '%s' is niet gevonden." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefile '%s' is niet gevonden." + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Kan niet terugkeren naar oorspronkelijke map." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Opnieuw uitvoeren[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "verwijderen (van tijdelijk bestand): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL bevat meer dan één doel" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Geen doelen" + +#: 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" + +#: 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." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Gebruik: %s [OPTIES] [DOEL]...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Dit programma is gecompileerd voor %s.\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Dit programma is gecompileerd voor %s (%s).\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Rapporteer programmafouten aan ;\n" +"meld gebreken in de vertaling aan .\n" + +#: 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" + +#: 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" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sDit programma is gecompileerd voor %s.\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sDit programma is gecompileerd voor %s (%s).\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLicentie GPLv3+: GNU GPL versie 3 of nieuwer \n" +"%sDit is vrije software: u mag het vrijelijk wijzigen en verder " +"verspreiden.\n" +"%sEr is GEEN GARANTIE, voor zover de wet dit toestaat.\n" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make-gegevensbank, weergegeven op %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Make-gegevensbank voltooid op %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Toegang geïnitialiseerd" + +#: src/misc.c:743 +msgid "User access" +msgstr "Gebruikerstoegang" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Make-toegang" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Dochterprocestoegang" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Een onbekende map wordt binnengegaan\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Een onbekende map wordt verlaten\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Map '%s' wordt binnengegaan\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Map '%s' wordt verlaten\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Een onbekende map wordt binnengegaan\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Een onbekende map wordt verlaten\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Map '%s' wordt binnengegaan\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Map '%s' wordt verlaten\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "schrijffout: standaarduitvoer" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Gestopt.\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 "" +"Optie '-O[TYPE]' (--output-sync[=TYPE]) is niet meegecompileerd in dit " +"programma." + +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "aanmaken van takenpijp" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "dupliceren van takenpijp" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "initialiseren van taakserverpijp" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "*interne fout*: ongeldige tekenreeks '%s' voor '--jobserver-auth'" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Taakservercliënt (bestandsdescriptor %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "taakserverpijplijn" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "schrijven naar taakserver" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "lezen van takenpijp" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Lezen van Makefiles...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Lezen van Makefile '%s'" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (geen standaarddoel)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (zoekpad)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (maakt niet uit)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (geen expansie van ~)" + +#: 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" + +#: 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" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "ongeldige syntax in voorwaardelijk deel" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: laden is mislukt" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "recept begint voor eerste doel" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "ontbrekende regel vóór recept" + +#: 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?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "ontbrekend scheidingsteken" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "ontbrekend doelpatroon" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "meerdere doelpatronen" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "doelpatroon bevat geen '%%'" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "ontbrekende 'endif'" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "lege naam van variabele" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "extra tekst na 'define'-opdracht" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "ontbrekende 'endef', onafgemaakte 'define'" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "extra tekst na 'endef'-opdracht" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "extra tekst na '%s'-opdracht" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "extra '%s'" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "slechts één 'else' per voorwaardelijk deel" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Onjuiste doelspecifieke variabele-definitie" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "vereisten kunnen niet in recepten gedefinieerd worden" + +#: 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" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "gemengde impliciete en normale regels" + +#: src/read.c:2107 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "doel '%s' komt niet overeen met doelpatroon" + +#: 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" + +#: 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" + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "Waarschuwing: er wordt voorbijgegaan aan recept voor doel '%s'" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "Waarschuwing: oud recept voor doel '%s' wordt genegeerd" + +#: src/read.c:2254 +#, c-format +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "*** gemengde impliciete en normale regels: verouderde syntax" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Er hoeft niets gedaan te worden voor '%s'." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "'%s' is up-to-date." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Snoeien van bestand '%s'.\n" + +#: 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" + +#: 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" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Doelbestand '%s' wordt overwogen.\n" + +#: 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" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Bestand '%s' was al overwogen.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Bestand '%s' wordt nog bijgewerkt.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Bijwerken van bestand '%s' is voltooid.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Bestand '%s' bestaat niet.\n" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Waarschuwing: .LOW_RESOLUTION_TIME-bestand '%s' heeft een hoge-resolutie " +"tijdsstempel" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Standaardrecept wordt gebruikt voor '%s'.\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Circulaire afhankelijkheid %s <- %s is verworpen." + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Vereisten van doelbestand '%s' zijn voltooid.\n" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "De vereisten van '%s' worden nu gemaakt.\n" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Pogingen voor doelbestand '%s' worden gestaakt.\n" + +#: src/remake.c:699 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Doel '%s' is niet opnieuw gemaakt vanwege fouten." + +#: 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" + +#: 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" + +#: src/remake.c:761 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Vereiste '%s' is nieuwer dan doel '%s'.\n" + +#: src/remake.c:764 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Vereiste '%s' is ouder dan doel '%s'.\n" + +#: 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" + +#: 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" + +#: src/remake.c:794 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Maken van '%s' vanwege 'always-make'-vlag.\n" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Doel '%s' hoeft niet opnieuw gemaakt te worden" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; VPATH-naam '%s' wordt gebruikt" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Doel '%s' moet opnieuw gemaakt worden.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " VPATH-naam '%s' wordt genegeerd.\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Recept van '%s' wordt nu uitgevoerd.\n" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Opnieuw maken van doelbestand '%s' is mislukt.\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Doelbestand '%s' is met succes opnieuw gemaakt.\n" + +#: 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" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Standaardopdrachten worden gebruikt voor '%s'.\n" + +#: 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" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS-element '%s' is geen patroon" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs kan niet exporteren: %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" +"# Impliciete regels" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Geen impliciete regels." + +#: src/rule.c:548 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u impliciete regels, %u (%.1f%%) eindpunten." + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "PROGRAMMAFOUT: num_pattern_rules() is verkeerd! %u != %u" + +#: 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. +#: src/signame.c:92 +msgid "Hangup" +msgstr "Opgehangen" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Onderbroken" + +# Verleden tijd, "Afgesloten", net als de andere actiesignaalnamen. +#: src/signame.c:98 +msgid "Quit" +msgstr "Afgesloten" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Ongeldige instructie" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Traceer/breekpunt-instructie" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Afgebroken" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "IOT-instructie" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "EMT-instructie" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Drijvendekomma-berekeningsfout" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Geëlimineerd" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Busfout" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Segmentatiefout" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Onjuiste systeemaanroep" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Gebroken pijp" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Wekker" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Beëindigd" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Gebruikergedefinieerd signaal 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Gebruikergedefinieerd signaal 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Dochterproces is afgesloten" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Stroomstoring" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Gepauzeerd" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Gepauzeerd (terminalinvoer)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Gepauzeerd (terminaluitvoer)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Gepauzeerd (signaal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Limiet op processortijd is overschreden" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Limiet op bestandsgrootte is overschreden" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtuele timer is afgelopen" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Timer voor profilering is afgelopen" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Venster is veranderd" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Doorgegaan" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Urgente in-/uitvoertoestand" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "In-/uitvoer is mogelijk" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Hulpbron verloren" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Gevaarsignaal" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Verzoek om informatie" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Drijvendekomma-coprocessor is niet beschikbaar" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Geen 'strcache'-buffers\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'-buffers: %lu (%lu) / strings = %lu / opslag = %lu B / " +"gemiddeld = %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 huidig buffer: grootte = %hu B / gebruikt = %hu B / aantal = %hu / " +"gemiddeld = %u B\n" + +#: 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" + +#: 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 vrij: totaal = %lu B / max = %lu B / min = %lu B / gemiddeld = %hu " +"B\n" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s 'strcache'-prestatie: lookups = %lu / treffersverhouding = %lu%%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# hashtabel-statistieken van bestanden:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automatisch" + +#: src/variable.c:1656 +msgid "default" +msgstr "standaard" + +#: src/variable.c:1659 +msgid "environment" +msgstr "omgeving" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "Makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "omgeving onder -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "opdrachtregel" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "'override'-opdracht" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (uit '%s', regel %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# Statistieken van hashtabel van variabelenverzameling:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabelen\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Patroonspecifieke variabelewaarden" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Geen patroonspecifieke variabelewaarden" + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u patroonspecifieke variabelewaarden" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "Waarschuwing: ongedefinieerde variabele '%.*s'" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() is mislukt met afsluitwaarde %d\n" + +#: 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" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "INGEBOUWDE 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 "Uitvoer wordt toegevoegd aan %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Toevoegen van %.*s en opschoning\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "In plaats daarvan wordt %s uitgevoerd\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-zoekpaden\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Geen 'vpath'-zoekpaden." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u 'vpath'-zoekpaden.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Geen algemeen zoekpad ('VPATH'-variabele)." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Algemeen zoekpad ('VPATH'-variabele):\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Taakserver-plaatsen zijn beperkt tot %d\n" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "aanmaken van taakserver-semafoor: (Fout %ld: %s)" + +#: 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)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Taakservercliënt (semafoor %s)\n" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "vrijgeven van taakserver-semafoor: (Fout %ld: %s)" + +#: 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" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] Fout 0x%x%s" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Waarschuwing: lege omleiding\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "*interne fout*: '%s' command_state" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Onbekende ingebouwde opdracht '%s'\n" + +#~ msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +#~ msgstr "" +#~ "Ingebouwde opdracht is onbekend of wordt niet ondersteund in .ONESHELL: " +#~ "'%s'\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Fout: lege opdracht\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Invoer wordt omgeleid van %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Foutuitvoer wordt omgeleid naar %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Uitvoer wordt omgeleid naar %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Fout bij processtart, %d\n" + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "*interne fout*: meerdere opties '--sync-mutex'" + +#~ msgid "virtual memory exhausted" +#~ msgstr "onvoldoende geheugen beschikbaar" + +#~ msgid "write error" +#~ msgstr "schrijffout" + +#~ msgid "# Invalid value in 'update_status' member!" +#~ msgstr "# Ongeldige waarde in 'update_status'-onderdeel!" + +#~ msgid "unknown trace mode '%s'" +#~ msgstr "onbekende trace-modus '%s'" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Fout 0x%x (genegeerd)" + +#~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +#~ msgstr "Recept uit %s:%lu wordt aangeroepen om doel '%s' bij te werken.\n" + +#~ msgid "Invoking builtin recipe to update target `%s'.\n" +#~ msgstr "Ingebouwd recept wordt aangeroepen om doel '%s' bij te werken.\n" + +#~ 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 "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() kan geen proces starten (e=%ld)\n" + +#~ msgid "empty `override' directive" +#~ msgstr "lege 'override'-opdracht" + +#~ msgid "invalid `override' directive" +#~ msgstr "ongeldige 'override'-opdracht" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-waarschuwing: CTRL-Y zal subproces(sen) achterlaten.\n" diff --git a/third_party/make/po/pl.gmo b/third_party/make/po/pl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..da819d0ca0079157f8066edb767b9a81fba13189 GIT binary patch literal 44530 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 IYzY4U0pPri761SM literal 0 HcmV?d00001 diff --git a/third_party/make/po/pl.po b/third_party/make/po/pl.po new file mode 100644 index 00000000000..34d33fb169d --- /dev/null +++ b/third_party/make/po/pl.po @@ -0,0 +1,2252 @@ +# Polish translation for GNU make. +# 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 , 1996. +# Jakub Bogusz , 2002-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:30+0100\n" +"Last-Translator: Jakub Bogusz \n" +"Language-Team: Polish \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" + +#: src/ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "próba użycia nieistniejącej funkcji: '%s'" + +#: src/ar.c:123 +#, c-format +msgid "touch archive member is not available on VMS" +msgstr "element biblioteki `touch' jest niedostępny pod VMS" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Archiwum '%s' nie istnieje" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: '%s' nie jest poprawnym archiwum" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Brak elementu '%s' w '%s'" + +#: 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'" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() nie powiodło się, status = %d" + +#: 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" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (nazwa może zostać okrojona)" + +#: 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, mode = 0%o.\n" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Polecenia mają za dużo linii (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Przerwano.\n" + +#: 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" + +#: 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" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Kasuję plik '%s'" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Kasuję plik '%s'" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# polecenia do wykonania" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (wbudowane):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (z '%s', linia %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Katalogi\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: stat() zwraca błąd.\n" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "# %s (klucz %s, czas modyfikacji %I64u): otwarcie było niemożliwe.\n" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (klucz %s, czas modyfikacji %I64u): " + +#: 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]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (urządzenie %ld, i-węzeł %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Nie" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " pliki, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "nie" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " niemożliwości" + +#: src/dir.c:1154 +msgid " so far." +msgstr " jak dotąd." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " niemożliwości w %lu katalogach.\n" + +#: src/expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekurencyjna zmienna '%s' wskazuje na samą siebie" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "niezakończone odwołanie do zmiennej" + +#: 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," + +#: 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," + +#: 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'." + +#: 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'." + +#: 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" + +#: 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" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Kasowanie pliku pośredniego '%s'" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Kasowanie plików pośrednich...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Aktualny czas" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Oznaczenie czasu spoza zakresu; zastąpiono %s" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# To nie jest obiekt:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Cenny plik (zależność .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Obiekt niejawny (zależność .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Obiekt podany w linii poleceń." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Makefile domyślny, wymieniony w MAKEFILES lub -include/sinclude." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Reguła wbudowana" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Szukanie reguł domyślnych zostało wykonane." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Szukanie reguł domyślnych nie zostało wykonane." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Gałąź wzorców domyślnych/statycznych: '%s'\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Plik jest zależnością przejściową." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Robi również:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Czas modyfikacji nie był sprawdzany." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Plik nie istnieje." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Plik jest bardzo stary." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Ostatnio modyfikowany %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Plik został uaktualniony." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Plik nie został uaktualniony." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Aktualnie uruchamiane polecenia (TO JEST BŁĄD)." + +#: src/file.c:1065 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Aktualnie uruchamiane polecenia zależności (TO JEST BŁĄD)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Uaktualnienie powiodło się." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Powinien być uaktualniony (-q jest włączone)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Uaktualnianie nie powiodło się." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Błędna wartość w elemencie 'command_state'!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Pliki" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statystyki tablic haszujących plików:\n" +"# " + +#: 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" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "pierwszy argument funkcji 'word' nie jest liczbowy" + +#: 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" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "pierwszy argument funkcji 'wordlist' nie jest liczbowy" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "drugi argument funkcji 'wordlist' nie jest liczbowy" + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() nie powiodło się (e=%ld)\n" + +#: 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" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Czyszczę tymczasowy plik wsadowy %s\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "plik: brak nazwy" + +#: src/function.c:2234 src/function.c:2265 +#, c-format +msgid "open: %s: %s" +msgstr "otwarcie: %s: %s" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "zapis: %s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "zamknięcie: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "plik: zbyt dużo argumentów" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "odczyt: %s: %s" + +#: src/function.c:2290 +#, c-format +msgid "file: invalid file operation: %s" +msgstr "plik: błędna operacja na pliku: %s" + +#: 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'" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "funkcja '%s' nie jest zaimplementowana na tej platformie" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "nie dokończone wywołanie funkcji '%s': brak '%c'" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Pusta nazwa funkcji" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Błędna nazwa funkcji: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Zbyt długa nazwa funkcji: %s" + +#: 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" + +#: 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" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: opcja '%s' jest niejednoznaczna\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: nieznana opcja '--%s'\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: nieznana opcja '%c%s'\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: niedozwolona opcja -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: błędna opcja -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: opcja '-W %s' jest niejednoznaczna\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Rozwijanie '%s'\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Wyliczanie '%s'\n" + +#: 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" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Wypełnienie=%lu/%lu=%.0f%%, " + +#: src/hash.c:282 +#, c-format +msgid "Rehash=%u, " +msgstr "Przehaszowania=%u, " + +#: src/hash.c:283 +#, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Kolizje=%lu/%lu=%.0f%%" + +#: src/implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Szukanie standardowej reguły dla '%s'.\n" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Pomijanie rekurencyjnego wywołania reguły standardowej.\n" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Gałąź zbyt długa: '%s%.*s'.\n" + +#: 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" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Odrzucenie niemożliwej zależności reguły '%s'.\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Odrzucenie niemożliwej zależności domyślnej '%s'.\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Próbowanie zależności reguły '%s'.\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Próbowanie zależności domyślnej '%s'.\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Znaleziono zależność '%s' jako VPATH '%s'\n" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Nie można utworzyć pliku tymczasowego\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (zrzut pamięci)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (zignorowano)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Błąd %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Oczekiwanie na niezakończone zadania...." + +#: 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" + +#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644 +#, c-format +msgid " (remote)" +msgstr " (zdalne)" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Zwolniony token dla potomka %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() nie mógł uruchomić procesu (e=%ld)\n" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Naliczono %d parametrów nieudanego uruchomienia\n" + +#: 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" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Otrzymano token dla potomka %p (%s).\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: obiekt '%s' nie istnieje" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: uaktualnianie obiektu '%s' z powodu: %s" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "niemożliwe wymuszenie limitu obciążenia: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Nie można odtworzyć stdin\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Nie można odtworzyć stdout\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Nie można odtworzyć stderr\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: mogło zabraknąć miejsca na środowisko" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL się zmienił (był '%s', jest '%s')\n" + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Tworzenie tymczasowego pliku wsadowego %s\n" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Zawartość pliku wsadowego:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Zawartość pliku wsadowego:%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 (linia %d) Zły kontekst powłoki (!unixy && !batch_mode_shell)\n" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Nie udało się otworzyć tablicy symboli globalnych: %s" + +#: 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" + +#: 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" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Pusta nazwa symbolu do wczytania: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Wczytywanie symbolu %s z %s\n" + +#: 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" + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Opcje:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorowane dla kompatybilności.\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Bezwarunkowe utworzenie wszystkich obiektów.\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C KATALOG, --directory=KATALOG\n" +" Przejście do KATALOGu przed robieniem\n" +" czegokolwiek.\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Wyświetla dużo informacji diagnostycznych.\n" + +#: 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" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Zmienne środowiska przykrywają makefile.\n" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" -E ŁAŃCUCH, --eval=ŁAŃCUCH Wyznacza ŁAŃCUCH jako instrukcję pliku " +"makefile.\n" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f PLIK, --file=PLIK, --makefile=PLIK\n" +" Czyta PLIK jako makefile.\n" + +#: 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" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignoruje błędy poleceń.\n" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I KATALOG, --include-dir=KATALOG\n" +" Szuka dołączanych makefile w KATALOGu.\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] Dopuszcza N zadań naraz; brak N oznacza brak\n" +" ograniczeń.\n" + +#: 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" + +#: 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" +" Nie uruchamiaj wielu zadań jeśli load nie " +"jest\n" +" poniżej 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 Używanie ostatniego mtime między dowiązaniem a " +"celem.\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" +" Nie wykonuje poleceń; jedynie je wyświetla.\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 PLIK, --old-file=PLIK, --assume-old=PLIK\n" +" Uznanie PLIKu za bardzo stary i nie tworzenie " +"go\n" +" ponownie.\n" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" +" -O[SPOSÓB], --output-sync[=SPOSÓB]\n" +" Sposób synchronizacji wyjścia zadań " +"równoległych.\n" + +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Nie uruchamia żadnych poleceń; status powrotu\n" +" wskazuje aktualność.\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Nie wypisuje poleceń.\n" + +#: 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" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Wyłącza -k.\n" + +#: src/main.c:395 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " -t, --touch Uaktualnia obiekty zamiast je robić.\n" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr " --trace Wypisywanie informacji ze śledzenia.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Wyświetla aktualny katalog.\n" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Wyłącza -w, nawet jeśli było ono włączone\n" +" domyślnie.\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 PLIK, --what-if=PLIK, --new-file=PLIK, --assume-new=PLIK\n" +" Uznaje PLIK za nieskończenie nowy.\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Ostrzega przy odwołaniach do " +"niezdefiniowanych\n" +" zmiennych.\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "pusty łańcuch nie może być nazwą pliku" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "nieznany poziom diagnostyki '%s'" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "nieznany sposób synchronizacji wyjścia '%s'" + +#: 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" + +#: 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" +"Nieobsługiwany filtr wyjątku wywołany z programu %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 "Naruszenie praw dostępu: zapis pod adresem 0x%p\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/main.c:1609 +#, c-format +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." + +#: 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ń." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefile ze standardowego wejścia podano dwukrotnie." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (plik tymczasowy)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (plik tymczasowy)" + +#: 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" + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Przełączanie w tryb jednozadaniowy (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "Dowiązania symboliczne nie są obsługiwane: wyłączono -L." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Uaktualnianie plików makefile....\n" + +#: 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" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Nie udało się ponownie przetworzyć pliku makefile '%s'." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Nie znaleziono włączanego pliku makefile '%s'." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Nie znaleziono pliku makefile '%s'" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Niemożliwy powrót do katalogu startowego." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Ponowne uruchamianie[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (plik tymczasowy): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL zawiera więcej niż jeden cel" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Brak obiektów" + +#: 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" + +#: 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." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Składnia: %s [opcje] [obiekt] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Ten program został zbudowany dla %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Ten program został zbudowany dla %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "Błędy proszę zgłaszać na adres \n" + +#: 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" + +#: 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ą" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sTen program został zbudowany dla systemu %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sTen program został zbudowany dla systemu %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLicencja GPLv3+: GNU GPL wersja 3 lub nowsza \n" +"%sTo oprogramowanie jest wolnodostępne: można je swobodnie zmieniać i " +"rozpowszechniać.\n" +"%sNie ma ŻADNEJ GWARANCJI w zakresie dopuszczalnym przez prawo.\n" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Baza danych Make, wyświetlana na %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Zakończono tworzenie bazy danych Make na %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Zainicjalizowany dostęp" + +#: src/misc.c:743 +msgid "User access" +msgstr "Dostęp użytkownika" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Dostęp make" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Dostęp potomka" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Wejście do nieznanego katalogu\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Opuszczenie nieznanego katalogu\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Wejście do katalogu '%s'\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Opuszczenie katalogu '%s'\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Wejście do nieznanego katalogu\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Opuszczenie nieznanego katalogu\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Wejście do katalogu '%s'\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Opuszczenie katalogu '%s'\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "błąd zapisu: standardowe wyjście" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Stop.\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[TYP] (--output-sync[=TYP]) nie zostało skonfigurowane przy tym budowaniu." + +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "tworzenie potoku zadań" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "duplikowanie potoku zadań" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "inicjowanie potoku serwera zadań" + +#: 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'" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Klient serwera zadań (fds %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "potok serwera zadań" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "zapis do serwera zadań" + +#: 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ń" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "odczyt potoku zadań" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Czytanie makefile...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Czytanie pliku makefile '%s'" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (brak celu domyślnego)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (przeszukiwana ścieżka)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (nieważne)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (brak rozszerzenia ~)" + +#: 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" + +#: 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" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "błędna składnia wyrażenia warunkowego" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: nie udało się załadować" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "polecenia zaczynają się przed pierwszym obiektem" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "brakuje reguły przed poleceniami" + +#: 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?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "brakujący separator" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "brakujący wzorzec obiektu" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "wielokrotne wzorce obiektu" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "wzorzec obiektu nie zawiera '%%'" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "brakujący 'endif'" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "pusta nazwa zmiennej" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "nadmiarowy tekst po dyrektywie 'define'" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "brakujący 'endef', niezakończone 'define'" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "nadmiarowy tekst po dyrektywie 'endef'" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "niezwiązany tekst po dyrektywie '%s'" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "nadmiarowy '%s'" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "tylko jedno 'else' w wyrażeniu warunkowym" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Źle sformułowana definicja zmiennej dla celu" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "wymagania nie mogą być definiowane w opisach poleceń" + +#: 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" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "pomieszane standardowe i normalne reguły" + +#: src/read.c:2107 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "obiekt '%s' nie pasuje do wzorca obiektu" + +#: 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 ::" + +#: 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" + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "uwaga: polecenia zakrywające dla obiektu '%s'" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "uwaga: ignoruję stare polecenia dla obiektu '%s'" + +#: 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" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Nie ma nic do zrobienia w '%s'." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "'%s' jest aktualne." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Czyszczenie pliku '%s'.\n" + +#: 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" + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sBrak reguł do wykonania obiektu '%s'%s" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Przetwarzanie pliku obiektowego '%s'.\n" + +#: 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" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Plik '%s' był już przetwarzany.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Wciąż uaktualniam plik '%s'.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Skończyłem uaktualniać plik '%s'.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Plik '%s' nie istnieje.\n" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Uwaga: plik .LOW_RESOLUTION_TIME '%s' ma dużą rozdzielczość znacznika " +"czasu" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Stosowanie standardowych poleceń dla '%s'.\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Okrężna dyrektywa %s <- %s porzucona." + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Zakończono zależności pliku obiektu '%s'.\n" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Zależności '%s' są wykonywane.\n" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Zaniechany plik obiektowy '%s'.\n" + +#: 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." + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:794 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Tworzenie '%s' z powodu flagi always-make.\n" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Nie ma potrzeby ponownego robienia obiektu '%s'" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; użyto nazwy VPATH '%s'" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Konieczne ponowne wykonanie obiektu '%s'.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Zignorowano nazwę VPATH '%s'.\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Uruchomiono polecenia dla '%s'.\n" + +#: 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" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Ponowne tworzenie pliku obiektu '%s' powiodło się.\n" + +#: 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" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Stosowanie standardowych poleceń dla '%s'.\n" + +#: 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" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "Element .LIBPATTERNS '%s' nie jest wzorcem" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Zasady nie eksportowane: %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" +"# Reguły stadardowe" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Brak standardowych reguł." + +#: src/rule.c:548 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u standardowych reguł, %u (%.1f%%) końcowych." + +#: 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" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "nieznany sygnał" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Rozłączenie" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Przerwanie" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Wyjście" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Błędna instrukcja" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Pułapka śledzenia" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Przerwany" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "Pułapka IOT" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "Pułapka EMT" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Wyjątek zmiennoprzecinkowy" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Zabity" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Błąd szyny" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Naruszenie ochrony pamięci" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Błędne wywołanie systemowe" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Przerwany potok" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Budzik" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Zakończony" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Sygnał użytkownika 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Sygnał użytkownika 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Potomek powrócił" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Przerwa w zasilaniu" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Zatrzymany" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Zatrzymany (wejście z tty)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Zatrzymany (wyjście na tty)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Zatrzymany (sygnał)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Przekroczony czas CPU" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Przekroczony limit wielkości pliku" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Wyczerpany stoper wirtualny" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Wyczerpany stoper profilujący" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Zmienione okno" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Kontynuowany" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Nagła sytuacja I/O" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "I/O możliwe" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Zaginione zasoby" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Sygnał niebezpieczeństwa" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Żądanie informacji" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Koprocesor obliczeń zmiennoprzecinkowych niedostępny" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Brak buforów 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 bufory strcache: %lu (%lu) / łańcuchów = %lu / miejsce = %lu B / śr = %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 bieżący buf: rozmiar = %hu B / użyty = %hu B / liczba = %hu / śr = %u B\n" + +#: 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" + +#: 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" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s wydajność strcache: wyszukiwań = %lu / wsp. trafień = %lu%%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# statystyki tablic haszujących:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automatyczna" + +#: src/variable.c:1656 +msgid "default" +msgstr "domyślna" + +#: src/variable.c:1659 +msgid "environment" +msgstr "środowiskowa" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "środowisko pod -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "z linii poleceń" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "dyrektywa 'override'" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (z '%s', linia %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# statystyki tablic haszujących ustawionych zmiennych:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Zmienne\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Wartości zmiennych dla wzorca" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Brak wartości zmiennych dla wzorca." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u wartości zmiennych dla wzorca" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "uwaga: niezdefiniowana zmienna '%.*s'" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() nie powiodło się - %d\n" + +#: 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" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "WBUDOWANE 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 "Dołączanie wyjścia do %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Dołączanie %.*s i czyszczenie\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Zamiast tego wykonywanie %s\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Ścieżki przeszukiwania VPATH\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Brak ścieżek przeszukiwania 'vpath'" + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u ścieżek przeszukiwania 'vpath'.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Brak ogólnej (zmienna 'VPATH') ścieżki przeszukiwania." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Ogólna (zmienna 'VPATH') ścieżka przeszukiwania:\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Pojemność serwera zadań ograniczona do %d\n" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "tworzenie semafora serwera zadań: (Błąd %ld: %s)" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" +"błąd wewnętrzny: nie udało się otworzyć semafora serwera zadań '%s': (Błąd " +"%ld: %s)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Klient serwera zadań (semafor %s)\n" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "zwalnianie semafora serwera zadań: (Błąd %ld: %s)" + +#: 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/third_party/make/po/pt.gmo b/third_party/make/po/pt.gmo new file mode 100644 index 0000000000000000000000000000000000000000..c0c750e31ce718c0af5a1a25f15d8cc39386bed5 GIT binary patch literal 43530 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 G;r|C>byC#; literal 0 HcmV?d00001 diff --git a/third_party/make/po/pt.po b/third_party/make/po/pt.po new file mode 100644 index 00000000000..ab04c11d670 --- /dev/null +++ b/third_party/make/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 , 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 \n" +"Language-Team: Portuguese \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 "" +msgstr "" + +#: 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 \n" +msgstr "Reportar erros em \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 \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 \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." diff --git a/third_party/make/po/pt_BR.gmo b/third_party/make/po/pt_BR.gmo new file mode 100644 index 0000000000000000000000000000000000000000..82195dab9b5724b7dfd43022874ca2f2f00fa829 GIT binary patch literal 44043 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, 2000. +# Fábio Henrique F. Silva , 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 +# Fábio Henrique F. Silva , 2017, 2018, 2019 +# +msgid "" +msgstr "" +"Project-Id-Version: GNU make 4.2.91\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\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 \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\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: Poedit 2.0.6\n" + +# 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' " + +#: 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" + +#: 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: O 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: O ar_member_touch retornou um código de erro inválido em '%s'" + +#: 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" + +#: 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 "" +"erro na abertura da biblioteca '%s' para localizar o status 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 de %ld (%ld).\n" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (o 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 "O comando tem muitas linhas (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Quebra.\n" + +#: 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." + +#: 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." + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "** [%s] Apagando arquivo '%s'" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "** Apagando arquivo '%s'" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# comandos a executar" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (embutido):" + +#: 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" +"# Diretórios\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: não pôde ser estabelecido.\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (chave %s, mtime %ull): " + +#: 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 " arquivos, " + +#: 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 diretórios.\n" + +#: 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)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "referência a variável não finalizada" + +#: 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," + +#: 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," + +#: 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'." + +#: 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'." + +#: 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'" + +#: 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'" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "** Apagando arquivo intermediário '%s'" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Apagando arquivo intermediário...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Hora atual" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Data/Hora fora de faixa; substituindo %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 "# Arquivo importante (prerequisito de .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Alvo Falso (prerequisito de .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Linha de Comando do Alvo." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Um Padrão, arquivo MAKEFILES ou -include/sinclude makefile." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Regra implícita" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Pesquisa por regra implícita concluida." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Pesquisa por regra implícita não concluida." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Derivação padrão implícita/estática: '%s'\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# O arquivo é um pré-requisito intermediário." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Também faz:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# O Período da modificação nunca foi verificado." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# O Arquivo não existe." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# O Arquivo está desatualizado." + +#: 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 Arquivo foi atualizado." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# O Arquivo não foi atualizado." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Comandos em execução (ISTO É UMA FALHA)." + +#: src/file.c:1065 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Comandos de dependências em execução (ISTO É UMA FALHA)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Atualizado com sucesso." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Precisa ser atualizado (-q está definido)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Problemas com a atualização." + +#: 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" +"# Arquivos" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# tabela hash de arquivos:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Campo '%s' não memorizado: %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "primeiro argumento não numérico para a função 'word'" + +#: 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" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "primeiro argumento não numérico para a função 'wordlist' " + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "segundo argumento não numérico para a função 'wordlist' " + +#: src/function.c:1533 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "" +"windows32_openpipe(): DuplicateHandle(In) falhou (e=%ld)\n" +" \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" +"\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 "Apagando o arquivo de lote temporário %s\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "arquivo: faltando o nome do arquivo" + +#: src/function.c:2234 src/function.c:2265 +#, c-format +msgid "open: %s: %s" +msgstr "aberto: %s: %s" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "gravação: %s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "fechado: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "arquivo: muitos argumentos" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "lido: %s: %s" + +#: src/function.c:2290 +#, c-format +msgid "file: invalid file operation: %s" +msgstr "arquivo: operação de arquivo inválida: %s" + +#: 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' " + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "A função '%s' não foi implementada nesta plataforma " + +#: 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' " + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Nome da função vazio" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Nome da função inválido: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Nome da função muito longo: %s" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "O número mínimo de argumentos é inválido (%u) para a função %s" + +#: src/function.c:2677 +#, c-format +msgid "Invalid maximum argument count (%u) for function %s" +msgstr "O número máximo de argumentos é inválido (%u) para a função %s" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "" +"%s: a opção '%s' é ambigua\n" +"\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" +"\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" +"\n" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "" +"%s: a opção é desconhecida '--%s'\n" +"\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "" +"%s: a opção é desconhecida '%c%s'\n" +"\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: a opção é ilegal -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: a 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' é ambigua\n" +"\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 um argumento\n" +"\n" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expandindo '%s'\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Avaliando '%s'\n" + +#: 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" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Carga=%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 "Colisões=%lu/%lu=%.0f%%" + +#: 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" +" \n" + +#: 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" +" \n" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitando recursão em regra implícita.\n" + +#: 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" +"\n" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "" +"Rejeitando pré-requisito para regra '%s'.\n" +"\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "" +"Rejeitando pré-requisitos implícitos '%s'.\n" +"\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "" +"Tentanto pré-requisito para a regra '%s'.\n" +"\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "" +"Tentando pré-requisito implícito '%s'.\n" +"\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "" +"Pré-requisito '%s' encontrado como VPATH '%s'\n" +"\n" + +#: 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" +"\n" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Não foi possível criar um arquivos temporário\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (arquivo core criado)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr "(ignorado)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: 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 "** Esperando que outros processos terminem." + +#: src/job.c:704 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Filho ativo %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 "Descarregando processo filho %p PID %s %s\n" + +#: src/job.c:899 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Descarregando processo filho %p PID %s %s\n" + +#: src/job.c:950 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Apagando o arquivo de lote temporário: %s\n" + +#: src/job.c:956 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Ao apagar o arquivo de lote temporário %s houve uma falha (%d)\n" + +#: 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" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Liberado sinalizador para o processo 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 executar o 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 args na falha de execução\n" + +#: 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" + +#: 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" + +#: 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 atualizado '%s'devido a: %s" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "não pôde forçar a carga limite:" + +#: 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" + +#: 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" + +#: 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 stderr\n" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Não é possível restaurar stdin\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Não é possível restaurar stdout\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Não é possível restaurar stderr\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: o espaço de ambiente pode estar cheio" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "" +"$SHELL alterado (era '%s' e agora é '%s')\n" +"\n" + +#: 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" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Conteúdo do arquivo de lote:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Conteúdo do arquivo de lote:%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) contexto inválido (!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 de símbolos globais: %s" + +#: src/load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "O objeto carregado %s não foi declarado compatível com a GPL" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Falhou ao carragar o símbolo %s de %s: %s" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Nome do símbolo vazio: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Carregando 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 Ignorado para compatibilidade.\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Processa todos os alvos incondicionalmente.\n" + +#: 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" + +#: 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[=OPÇÕES] Imprime vários tipos de informações de " +"depuração.\n" + +#: 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" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +"-E STRING, --eval=STRING Avalia a STRING como uma declaração para um " +"makefile.\n" + +#: 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" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Imprime esta mensagem e sai.\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignora os erros dos comandos.\n" + +#: 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 " +"incluir.\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 vez; tarefas infinitas " +"sem argumentos.\n" + +#: 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 " +"processados.\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 inicia múltiplas tarefas a menos 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 o tempo mais antigo entre o vínculo simbólico " +"e o 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 quaisquer comandos; apenas imprime-" +"os.\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 ARQUIVO, --old-file=ARQUIVO, --assume-old=ARQUIVO\n" +" Considera o ARQUIVO como muito antigo e não " +"reprocessá-o.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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 " +"embutidas.\n" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\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" + +#: 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" + +#: 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" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr " -trace Imprime informação de depuração.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Imprime o diretório atual.\n" + +#: 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 " +"implicitamente ativada.\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 ARQUIVO, --what-if=ARQUIVO, --new-file=ARQUIVO, --assume-new=ARQUIVO\n" +" Considera o ARQUIVO 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 um variável não definida for " +"referenciada.\n" + +#: 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" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "nível de depuração desconhecido: '%s' " + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "tipo output-sync desconhecido '%s'" + +#: 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" + +#: 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" +"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" + +#: 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() definiu o 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(), caminho de pesquisa do 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: usando -j1. Inclua '+' na regra pai. " + +#: 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." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefile na entrada padrão especificado duas vezes." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (arquivo temporário)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (arquivo temporário)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Reiniciando no modo de tarefa única (-j1)." + +#: 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." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Atualizando os arquivos makefiles ...\n" + +#: 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" +"\n" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Problemas ao reprocessar o arquivo '%s'. " + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Arquivo '%s' incluido não foi encontrado. " + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "O arquivo '%s' não foi encontrado. " + +#: 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." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Re-executando[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "desvinculado (arquivos temporário): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ". DEFAULT_GOAL contém mais do que um alvo" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Sem alvo" + +#: 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" + +#: 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." + +#: 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 foi compilado para %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Este programa foi compilado para %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "Informe os problemas para .\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 não vazio " + +#: 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 "%sCompilado para %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sCompilado para %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 \n" +"%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" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Banco de dados do Make, impresso em %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Banco de dados do Make finalizado em %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Acesso inicializado" + +#: src/misc.c:743 +msgid "User access" +msgstr "Acesso do usuário" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Acesso do 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: Entrando em um diretório desconhecido\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Saindo de um diretório desconhecido\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "" +"%s: Entrando no diretório '%s'\n" +"\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "" +"%s: Saindo do diretório '%s'\n" +"\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Entrando em um diretório desconhecido\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Saindo de um diretório desconhecido\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "" +"%s[%u]: Entrando no diretório '%s'\n" +"\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "" +"%s[%u]: Saindo do diretório '%s'\n" +"\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "Erro de gravação: stdout" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Pare.\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[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" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "duplicando canalização de tarefas" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "inicializando a canalização do jobserver" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "erro interno: valor '%s' inválido para --jobserver-auth" + +#: 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 "canalização do jobserver" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "gravar jobserver" + +#: 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 pselect" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "tarefas canalizadas lidas" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Lendo arquivos makefile ...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Lendo arquivos makefile '%s' " + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (não há objetivo padrão)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (caminho de pesquisa)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (sem importância)" + +#: 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 "Ignorando UTF-8 BOM no makefile '%s'\n" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Ignorando UTF-8 BOM no makefile buffer\n" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "síntaxe inválida na condicional" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: falhou ao carregar" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "comandos começam antes do primeiro alvo" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "falta uma regra antes dos comandos" + +#: src/read.c:1136 +#, c-format +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr "faltando separador (você pensou em TAB ao invés de 8 espaços?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "faltando o separador" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "faltando o padrão dos alvos" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "múltiplos padrões para o alvo" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "padrão para o alvo não contém '%%' " + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "faltando 'endif' " + +#: 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 depois da diretiva 'define' " + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "faltando 'endef', 'define' não terminado " + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "Texto estranho depois da diretiva 'endef'" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "Texto estranho depois da diretiva '%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 "use apenas um 'else' por condicional " + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Definição de variável para o alvo mau formada" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +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" + +#: 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" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "As regras implícitas e normais misturadas" + +#: 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 " + +#: 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 :: " + +#: 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. " + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "aviso: sobrescrevendo os comandos para o alvo '%s'" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "aviso: ignorando comandos antigos para o alvo '%s' " + +#: src/read.c:2254 +#, c-format +msgid "*** mixed implicit and normal rules: deprecated syntax" +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'" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Nada a ser feito para '%s'. " + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "'%s' está atualizado. " + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "" +"Atualizando o arquivo '%s'.\n" +"\n" + +#: 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 " + +#: src/remake.c:399 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sSem regra para processar o alvo '%s'%s " + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "" +"Considerando o arquivo alvo '%s'.\n" +"\n" + +#: 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" +"\n" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "" +"O arquivo '%s' já foi considerado.\n" +"\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "" +"Ainda está atualizando o arquivo '%s'.\n" +"\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "" +"Atualização do arquivo '%s' concluida.\n" +"\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "" +"O arquivo '%s' não existe.\n" +"\n" + +#: 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 " + +#: 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" +"\n" + +#: 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" +"\n" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "" +"Usando os comandos padrões para '%s'.\n" +"\n" + +#: src/remake.c:549 src/remake.c:1088 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Dependência circular %s <- %s abandonada." + +#: src/remake.c:674 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "" +"Pré-requisitos do alvo '%s' concluido.\n" +"\n" + +#: 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" +"\n" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "" +"Desistindo do arquivo '%s'.\n" +"\n" + +#: 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. " + +#: 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" +"\n" + +#: 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" +"\n" + +#: 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" +"\n" + +#: 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" +"\n" + +#: src/remake.c:782 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "O alvo '%s' são dois-pontos duplos 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 "" +"Nenhum comando para '%s' e nenhum pré-requisito foi alterado.\n" +"\n" + +#: 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" +"\n" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Não é necessário reprocessar o alvo '%s' " + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; usando o nome VPATH '%s' " + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "" +"O alvo '%s' deve ser reprocessado.\n" +"\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr "" +" Ignorando o nome VPATH '%s'.\n" +"\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "" +"Os comandos de '%s' estão rodando.\n" +"\n" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "" +"Falha ao reprocessar o alvo '%s'.\n" +"\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "" +"Alvo '%s' reprocessado com sucesso.\n" +"\n" + +#: 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" +"\n" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "" +"Usando os comandos padrões para '%s'.\n" +"\n" + +#: 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 " + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "O elemento .LIBPATTERNS '%s' não é um padrão " + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %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 "" + +#: src/rule.c:530 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Regras implícitas." + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Faltam as 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 errada! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "sinal desconhecido" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Desconectar" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Interrupção" + +#: 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 "Aviso Trace/breakpoint" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Abortado" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "Aviso IOT" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "Aviso EMT" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Exceção de ponto flutuante" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Finalizado" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Erro de barramento" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Falha de segmentação" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Chamada de sistema inválida" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Canalização interrompida" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Despertador" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Terminado" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Sinal 1 definido pelo usuário" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Sinal 2 definido pelo usuário" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "O Filho saiu" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Falha na Energia Elétrica" + +#: 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 (saida tty)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Parado (sinal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Tempo de CPU excedido" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Tamanho do arquivo excedido" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Temporizador virtual expirou" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Temporizador de perfil expirou" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Janela alterada" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Continuação" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Condição de E/S urgente" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "Possível E/S" + +#: 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 perigoso" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Solicitação de informação" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Co-processador aritmético indisponível" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Não há strcache buffers\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 buffers: %lu (%lu) / strings = %lu / armazenamento = %lu / med = " +"%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 buf atual: tamanho = %hu B / usado = %hu B / contado = %hu / med = %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: total = %lu B / contado = %lu / med = %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: total = %lu B / max = %lu B / min = %lu B / med = %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: pesquisados = %lu / encontrados = %lu%%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# tabela hash de arquivos:\n" +"#" + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automático" + +#: src/variable.c:1656 +msgid "default" +msgstr "padrão" + +#: 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 comando" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "diretiva '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 "# tabela hash do conjunto de variávies:\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 da variável de padrões específicos" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Faltam valores para variável de padrões específicos" + +#: 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" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "aviso: variável indefinida '%.*s' " + +#: 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 "-warning, pode ser preciso reativar o CTRL-Y no DCL.\n" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "CD EMBUTIDO %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 "Saida redirecionada para %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Acrescentado %.*s e limpo\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Executando %s ao invés de\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Caminho VPATH\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Sem caminho 'vpath'. " + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u caminhos 'vpath'.\n" +"\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Sem caminho genérico (variável 'VPATH')." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Caminho genérico (variável 'VPATH'):\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Slots Jobserver limitados a %d)\n" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "criando semáforos 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: falha ao abrir o 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 "liberar semáforos do jobserver: (Erro %ld: %s)" + +#: src/w32/w32os.c:194 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +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' !" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Erro 0x%x (ignorado)" + +#~ msgid "*** [%s] Error 0x%x" +#~ msgstr "*** [%s] Erro 0x%x" + +#~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +#~ msgstr "Chamando os comandos de %s:%lu para atualizar o alvo `%s'.\n" + +#~ msgid "Invoking builtin recipe to update target `%s'.\n" +#~ 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" + +#~ msgid "dup jobserver" +#~ msgstr "dup jobserver" + +#~ msgid "virtual memory exhausted" +#~ msgstr "A memória virtual encheu" + +#~ msgid "write error" +#~ 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" + +#~ msgid "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# tabela hash de arquivos:\n" +#~ "#" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Aviso: Redireção vazia\n" + +#~ msgid "internal error: `%s' command_state" +#~ msgstr "erro interno: `%s' command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "EMBUTIDO [%s][%s]\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "RM EMBUTIDO %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Comando embutido desconhecido `%s'.\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Erro, comando vazio\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Entrada de %s redirecionada\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Erro redirecionado para %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Saida redirecionada para %s\n" + +#~ msgid "Error spawning, %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" + +#~ 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 "" +#~ "%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" + +#~ msgid "empty `override' directive" +#~ msgstr "diretiva `override' vazia" + +#~ msgid "invalid `override' directive" +#~ 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" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Erro de sintaxe dentro de '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ 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." + +#~ msgid "Resetting make for single job mode." +#~ 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" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Nenhum arquivo." diff --git a/third_party/make/po/quot.sed b/third_party/make/po/quot.sed new file mode 100644 index 00000000000..0122c46318d --- /dev/null +++ b/third_party/make/po/quot.sed @@ -0,0 +1,6 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g diff --git a/third_party/make/po/remove-potcdate.sin b/third_party/make/po/remove-potcdate.sin new file mode 100644 index 00000000000..2436c49e786 --- /dev/null +++ b/third_party/make/po/remove-potcdate.sin @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/third_party/make/po/ru.gmo b/third_party/make/po/ru.gmo new file mode 100644 index 0000000000000000000000000000000000000000..8bfdf7e2e58ba90344f7bf82a8229efaae463de0 GIT binary patch literal 56673 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 NsLukkNz=*Q{|6ILjP3vc literal 0 HcmV?d00001 diff --git a/third_party/make/po/ru.po b/third_party/make/po/ru.po new file mode 100644 index 00000000000..c2ccf94738a --- /dev/null +++ b/third_party/make/po/ru.po @@ -0,0 +1,2409 @@ +# Translation of make messages to Russian. +# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# +# Oleg S. Tihonov , 1998. +# Alexey Mahotkin , 2001. +# Denis Perchine , 2001, 2002. +# Pavel Maryanov , 2009. +# Yuri Kozlov , 2009, 2010, 2013, 2014, 2016, 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 22:09+0300\n" +"Last-Translator: Yuri Kozlov \n" +"Language-Team: Russian \n" +"Language: ru\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 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" + +#: 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" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "обновление времени изменения: Архив «%s» не существует" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "обновление времени изменения: Неверный архив: «%s»" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "обновление времени изменения: Элемент «%s» не содержится в «%s»" + +#: src/ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "" +"обновление времени изменения: Функция ar_member_touch вернула\n" +"ошибочное значение для «%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$init_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, mtime %l64u): невозможно открыть.\n" + +#: 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" + +#: src/dir.c:1099 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (устройство %ld, inode %ld): невозможно открыть.\n" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (ключ %s, mtime %l64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (устройство %d, inode [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (устройство %ld, inode %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(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 "файл: отсутствует имя файла" + +#: 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" + +# Сообщения getopt исключены, т.к. они относятся к уже +# устаревшей версии этой библиотеки, и исчезнут в следующей версии make +#: 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 "" +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).\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 "закончились файловые дескрипторы: не удалось сделать копию stdin\n" + +#: src/job.c:2212 +#, c-format +msgid "no more file handles: could not duplicate stdout\n" +msgstr "закончились файловые дескрипторы: не удалось сделать копию stdout\n" + +#: src/job.c:2226 +#, c-format +msgid "no more file handles: could not duplicate stderr\n" +msgstr "закончились файловые дескрипторы: не удалось сделать копию stderr\n" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Не удалось восстановить stdin\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Не удалось восстановить stdout\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Не удалось восстановить stderr\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) Плохой контекст командного процессора (!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" + +#: 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=КАТАЛОГ\n" +" Искать включаемые make-файлы в КАТАЛОГЕ.\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" +" если 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" + +#: src/main.c:369 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Использовать последнее mtime при выборе между\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" +" напечатать его.\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" +" заданий с типом ТИП.\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" + +# Что такое "variable settings"? +#: src/main.c:386 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Выключить установку встроенных\n" +" значений переменных.\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 Установить время доступа целей в текущее,\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" + +#: 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 "неизвестный тип output-sync «%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 "" +"предупреждение: сервер заданий недоступен: используется -j1. Добавьте «+» к " +"правилу в родительском make." + +#: src/main.c:1617 +#, c-format +msgid "warning: -j%d forced in submake: resetting jobserver mode." +msgstr "" +"предупреждение: в суб-Makefile принудительно задан -j%d; сброс режима " +"сервера заданий" + +#: 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 "" +"предупреждение: в makefile принудительно задан -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 "Обновление make-файлов....\n" + +#: src/main.c:2226 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Make-файл «%s», возможно, зациклен, он не будет пересобираться.\n" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Попытка пересобрать make-файл «%s» завершилась неудачно." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Включаемый make-файл «%s» не найден." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Make-файл «%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 "Не заданы цели и не найден make-файл" + +#: 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 \n" +msgstr "Сообщайте об ошибках по адресу \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 \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 GPL версии 3 или новее \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),\n" +"группа %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 "ошибка записи: stdout" + +#: 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 "Чтение make-файлов...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Чтение make-файла «%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 "Пропуск UTF-8 BOM в make-файле «%s»\n" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Пропуск UTF-8 BOM в буфере make-файла\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 "излишний текст после директивы «define»" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "отсутствует «endif», незавершённая «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 "" +"*** Предупреждение: у файла «%s» параметр LOW_RESOLUTION_TIME содержит метку " +"времени с высокой точностью" + +#: 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» из-за установленного флага always-make.\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 "ОШИБКА: неверное значение 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 "Останов (ввод с терминала) " + +#: 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 "Возможен ввод/вывод" + +#: 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 Б / сред = %lu " +"Б\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 текущий buf: размер = %hu Б / используется = %hu Б / кол-во = %hu / сред " +"= %u Б\n" + +#: 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" + +#: 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" + +#: 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 "make-файл" + +#: 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 "" +"-предупреждение, возможно вам потребуется повторно разрешить\n" +"обработку 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)" + +#~ 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»" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] Ошибка 0x%x%s" + +#~ msgid "%s[%s] %s%s%s" +#~ msgstr "%s[%s] %s%s%s" + +#~ msgid "dup jobserver" +#~ msgstr "создаю копию сервера заданий" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Предупреждение: Пустое перенаправление\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "внутренняя ошибка: «%s» command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "ВСТРОЕННЫЙ [%s][%s]\n" + +#~ msgid "BUILTIN ECHO %s->%s\n" +#~ msgstr "ВСТРОЕННАЯ ECHO %s->%s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Неизвестная встроенная команда «%s»\n" + +#~ msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +#~ msgstr "" +#~ "Встроенная команда неизвестна или не поддерживается в .ONESHELL: «%s»\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Ошибка, пустая команда\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Стандартный ввод перенаправлен из %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Поток ошибок перенаправлен в %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Стандартный вывод перенаправлен в %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Ошибка порождения процесса, %d\n" + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "внутренняя ошибка: несколько ключей --sync-mutex" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "внутренняя ошибка: несколько ключей --jobserver-fds" + +#~ msgid "virtual memory exhausted" +#~ msgstr "закончилась виртуальная память" + +#~ msgid "write error" +#~ msgstr "ошибка записи" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "ВСТРОЕННЫЙ RM %s\n" + +#~ msgid "# Invalid value in 'update_status' member!" +#~ msgstr "# Неверное значение члена «update_status»!" + +#~ msgid "unknown trace mode '%s'" +#~ msgstr "неизвестный режим трассировки «%s»" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Ошибка 0x%x (игнорирована)" + +#~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +#~ msgstr "Применяется способ из %s:%lu для обновления цели `%s'.\n" + +#~ msgid "Invoking builtin recipe to update target `%s'.\n" +#~ msgstr "Выполняется встроенный способ для обновления цели `%s'.\n" + +#~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +#~ msgstr "%s # буферов strcache: %d (* %d B/buffer = %d B)\n" + +#~ msgid "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# состояние хеш-таблицы strcache:\n" +#~ "# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() не смогла запустить процесс (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 "" +#~ "%sЭто свободная программа; подробности об условиях распространения " +#~ "смотрите\n" +#~ "%sв исходном коде. Мы НЕ предоставляем гарантий; даже гарантий\n" +#~ "%sКОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ КАКОЙ-ЛИБО ЦЕЛИ.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "излишний `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "пустая директива `override'" + +#~ msgid "invalid `override' directive" +#~ msgstr "неправильная директива `override'" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-предупреждение, после CTRL-Y останутся суб-процессы.\n" diff --git a/third_party/make/po/sr.gmo b/third_party/make/po/sr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..42ba5efa3ccb7333ebb90cd9d1b5188e92bd4433 GIT binary patch literal 53185 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, 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: Мирослав Николић \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 "" +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 \n" +msgstr "Грешке пријавите на \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 \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. издање или новије \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 " терминал." diff --git a/third_party/make/po/stamp-po b/third_party/make/po/stamp-po new file mode 100644 index 00000000000..9788f70238c --- /dev/null +++ b/third_party/make/po/stamp-po @@ -0,0 +1 @@ +timestamp diff --git a/third_party/make/po/sv.gmo b/third_party/make/po/sv.gmo new file mode 100644 index 0000000000000000000000000000000000000000..c85b0685b49f848b0d167c847c7a935c50a2e973 GIT binary patch literal 43480 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, 1996-2002. +# Christer Andersson , 2007. +# Göran Uddeborg , 2011, 2013, 2014, 2016, 2019, 2020. +# +# $Id: make.po,v 1.27 2020-01-06 16:22:49+01 göran Exp $ +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-06 16:19+0100\n" +"Last-Translator: Göran Uddeborg \n" +"Language-Team: Swedish \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" + +#: 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”" + +#: 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" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "nudda: Arkivet ”%s” finns inte" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "nudda: ”%s” är inte något giltigt arkiv" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "nudda: medlemmen ”%s” finns inte i ”%s”" + +#: 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”" + +#: 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" + +#: src/arscan.c:236 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() misslyckades och gav status = %d" + +#: 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" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (namnet kan vara avkortat)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: src/arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, flaggor = 0%o.\n" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Receptet har för många rader (%ud)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Avbrott.\n" + +#: 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" + +#: src/commands.c:632 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Arkivmedlemmen ”%s” kan vara felaktig; ej borttagen" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Tar bort filen ”%s”" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Tar bort filen ”%s”" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# recept att utföra" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (inbyggd):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (från ”%s”, rad %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Kataloger\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: kunde inte ta status.\n" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "# %s (nyckel %s, mtid %I64u): kunde inte öppnas.\n" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (nyckel %s, mtid %I64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (enhet %d, inod [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (enhet %ld, inod %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Inga" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " filer, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "inga" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " omöjligheter" + +#: src/dir.c:1154 +msgid " so far." +msgstr " hittills." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " omöjligheter i %lu kataloger.\n" + +#: 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)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "oavslutad variabelreferens" + +#: 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," + +#: 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," + +#: 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”." + +#: 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”." + +#: 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”" + +#: 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”" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Tar bort mellanfilen ”%s”" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Tar bort mellanfiler …\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Nuvarande tid" + +#: 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" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Inte ett mål:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Värdefull fil (nödvändig för .PRECIOUS)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Låtsasmål (nödvändig för .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Kommandoradsmål." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" +"# En standardmakefil, eller enligt MAKEFILES, eller en -include/sinclude-" +"makefil." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Inbyggd regel" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Implicit regelsökning har genomförts." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Implicit regelsökning har inte genomförts." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Implicit/statisk mönsterstam: ”%s”\n" + +#: src/file.c:1036 +msgid "# File is an intermediate prerequisite." +msgstr "# Filen är ett övergående beroende." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Skapar också:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Ändringstiden har inte kontrollerats." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Filen finns inte." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Filen är mycket gammal." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Senast ändrad %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Filen har uppdaterats." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Filen har inte uppdaterats." + +#: src/file.c:1062 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Recept körs just nu (DETTA ÄR ETT FEL)." + +#: src/file.c:1065 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Beroenderecept körs (DETTA ÄR ETT FEL)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Uppdateringen lyckades." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Behöver uppdateras (-q har angivits)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Uppdateringen misslyckades." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Ogiltigt värde i medlemmen ”command_state”!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Filer" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistik för filhashtabell:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Fältet ”%s” cachas inte: %s" + +#: src/function.c:794 +msgid "non-numeric first argument to 'word' function" +msgstr "icke-numeriskt första argument till funktionen ”word”" + +#: 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" + +#: src/function.c:819 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "icke-numeriskt första argument till funktionen ”wordlist”" + +#: src/function.c:821 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "icke-numeriskt andra argument till funktionen ”wordlist”" + +#: src/function.c:1533 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) misslyckades (e=%ld)\n" + +#: src/function.c:1557 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(Fel) misslyckades (e=%ld)\n" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() misslyckades (e=%ld)\n" + +#: src/function.c:1572 +#, c-format +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() misslyckades\n" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Städar bort tillfällig satsfil %s\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "file: filnamn saknas" + +#: src/function.c:2234 src/function.c:2265 +#, c-format +msgid "open: %s: %s" +msgstr "öppna: %s: %s" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "skriv: %s: %s" + +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "stäng: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "file: för många argument" + +#: src/function.c:2277 +#, c-format +msgid "read: %s: %s" +msgstr "läs: %s: %s" + +#: src/function.c:2290 +#, c-format +msgid "file: invalid file operation: %s" +msgstr "file: felaktig filåtgärd: %s" + +#: src/function.c:2405 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "otillräckligt antal argument (%d) till funktionen ”%s”" + +#: src/function.c:2417 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "ej implementerat på denna plattform: funktionen ”%s”" + +#: src/function.c:2483 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "oavslutat funktionsanrop ”%s”: ”%c” saknas" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Tomt funktionsnamn" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Felaktigt funktionsnamn: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Funktionsnamnet är för långt: %s" + +#: src/function.c:2674 +#, c-format +msgid "Invalid minimum argument count (%u) for function %s" +msgstr "Felaktigt minsta antal argument (%u) till funktionen ”%s”" + +#: 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”" + +#: src/getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: flaggan ”%s” är tvetydig\n" + +#: src/getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: flaggan ”--%s” tar inget argument\n" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: okänd flagga ”--%s”\n" + +#: src/getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: okänd flagga ”%c%s”\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: otillåten flagga -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ogiltig flagga -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: flaggan ”-W %s” är tvetydig\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expanderar ”%s”\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Evaluerar ”%s”\n" + +#: 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" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Fyllnadsgrad=%lu/%lu=%.0f %%, " + +#: src/hash.c:282 +#, c-format +msgid "Rehash=%u, " +msgstr "Omhash=%u, " + +#: src/hash.c:283 +#, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Kollisioner=%lu/%lu=%.0f %%" + +#: 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" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Undviker rekursion orsakad av implicit regel.\n" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Stammen är för lång: ”%s%.*s”.\n" + +#: src/implicit.c:490 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Prövar mönsterregel med stammen ”%.*s”.\n" + +#: src/implicit.c:717 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Avvisar den omöjliga regelförutsättningen ”%s”.\n" + +#: src/implicit.c:718 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Avvisar den omöjliga implicita förutsättningen ”%s”.\n" + +#: src/implicit.c:732 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Prövar det regelförutsättningen ”%s”.\n" + +#: src/implicit.c:733 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Prövar den implicita förutsättningen ”%s”.\n" + +#: src/implicit.c:772 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Hittade förutsättningen ”%s” som VPATH ”%s”\n" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Kan inte skapa en temporärfil\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (minnesdump)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (ignoreras)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Fel %d%s" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Inväntar oavslutade jobb..." + +#: src/job.c:704 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Levande barnprocess %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 " (fjärr)" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1120 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Frigjorde symbol för barnprocessen %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() misslyckades med processtart (e=%ld)\n" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Räknade till %d argument vid misslyckad start\n" + +#: 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" + +#: src/job.c:1875 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Erhöll symbol för barnprocessen %p (%s).\n" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: målet ”%s” finns inte" + +#: src/job.c:1905 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: uppdatera målet ”%s” på grund av: %s" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "kan inte upprätthålla lastbegränsning: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Kunde inte återställa standard in\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Kunde inte återställa standard ut\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Kunde inte återställa standard fel\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: miljöutrymmet kanske är slut" + +#: src/job.c:2862 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL ändrades (var ”%s”, är nu ”%s”)\n" + +#: src/job.c:3300 src/job.c:3485 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Skapar tillfällig satsfil %s\n" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Satsfilinnehåll:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Satsfilinnehåll:%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 (rad %d) Felaktigt skalsammanhang (!unixy && !batch_mode_shell)\n" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Misslyckades att öppna den globala symboltabellen: %s" + +#: 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" + +#: 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" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Tomt symbolnamn för laddning: %s" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Laddar symbol %s från %s\n" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Flaggor:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoreras av kompatibilitetsskäl.\n" + +#: src/main.c:338 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Bygg ovillkorligen alla mål.\n" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C KATALOG, --directory=KATALOG\n" +" Byt katalog till KATALOG innan något görs.\n" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Skriv ut massor av felsökningsinformation.\n" + +#: src/main.c:345 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGGOR] Skriv ut olika sorters " +"felsökningsinformation.\n" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Miljövariabler åsidosätter makefiler.\n" + +#: src/main.c:350 +msgid "" +" -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" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FIL, --file=FIL, --makefile=FIL\n" +" Använd FIL som makefil.\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Skriv ut detta meddelande och avsluta.\n" + +#: src/main.c:357 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignorera fel från recept.\n" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I KATALOG, --include-dir=KATALOG\n" +" Genomsök KATALOG efter inkluderade makefiler.\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] Tillåt N samtidiga jobb; oändligt många om " +"inget antal anges.\n" + +#: 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" + +#: 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" +" Påbörja fler jobb endast om lasten understiger " +"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 Använd den senaste av mtiderna för symboliska " +"länkar eller mål.\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" +" Kör inte något recept, skriv bara ut dem.\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 FIL, --old-file=FIL, --assume-old=FIL\n" +" Betrakta FIL som mycket gammal och återskapa " +"den inte.\n" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" +" -O[TYP], --output-sync[=TYP]\n" +" Synkronisera utmatningen av parallella jobb\n" +" enligt TYP.\n" + +#: 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" + +#: src/main.c:382 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Kör inga recept; slutstatus visar om det är " +"aktuellt.\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Återge inte recept.\n" + +#: 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" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Stäng av -k.\n" + +#: 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" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr " --trace Skriv spårningsinformation.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Skriv ut aktuell katalog.\n" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Stäng av -w, även om det är implicit " +"påslaget.\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 FIL, --what-if=FIL, --new-file=FIL, --assume-new=FIL\n" +" Betrakta FIL som hur ny som helst.\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Varna vid användning av en odefinierad " +"variabel.\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "en tom sträng är ett ogiltigt filnamn" + +#: src/main.c:754 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "okänd felsökningsnivå ”%s” angiven" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "okänd typ av utmatningssynkronisering ”%s”" + +#: 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" + +#: 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" +"Ett ohanterat undantagsfilter anropades från programmet %s\n" +"Undantagskod = %lx\n" +"Undantagsflaggor = %lx\n" +"Undantagsadress = 0x%p\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/main.c:1609 +#, c-format +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." + +#: 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." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefil från standard in angavs dubbelt." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (temporärfil)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (temporärfil)" + +#: 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." + +#: src/main.c:2069 +#, c-format +msgid "Resetting to single job (-j1) mode." +msgstr "Återställer till enkeljobbsläge (-j1)." + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "Symboliska länkar stöds inte: inaktiverar -L." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Uppdaterar makefiler...\n" + +#: src/main.c:2226 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Makefilen ”%s” kan loopa; återskapas inte.\n" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Misslyckades med att återskapa makefilen ”%s”." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Den inkluderade makefilen ”%s” fanns inte." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefilen ”%s” fanns inte" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Kunde inte återgå till ursprungskatalogen." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Utför på nytt[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "avlänka (temporärfil): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL innehåller fler än ett mål" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Inga mål" + +#: 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" + +#: 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." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Användning: %s [flaggor] [mål] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Detta program byggdes för %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Detta program byggdes för %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Anmäl fel till .\n" +"Skicka synpunkter på översättningen till .\n" + +#: 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" + +#: 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" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sByggt för %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sByggt för %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sLicens GPLv3+: GNU GPL version 3 eller senare \n" +"%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" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make-databas, utskriven %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Färdigställde Make-databas %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Åtkomst inledd" + +#: src/misc.c:743 +msgid "User access" +msgstr "Användaråtkomst" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Make-åtkomst" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Barnåtkomst" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Går till en okänd katalog\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Lämnar en okänd katalog\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Går till katalogen ”%s”\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Lämnar katalogen ”%s”\n" + +#: 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" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Lämnar en okänd katalog\n" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Går till katalogen ”%s”\n" + +#: src/output.c:115 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Lämnar katalogen ”%s”\n" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "skrivfel: standard ut" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Stannar.\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[TYP] (--output-sync[=TYP]) är inte konfigurerat för detta bygge." + +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "skapar jobbrör" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "duplicerar jobbrör" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "iordningställer rör till jobbserver" + +#: src/posixos.c:119 +#, c-format +msgid "internal error: invalid --jobserver-auth string '%s'" +msgstr "internt fel: ogiltig sträng --jobserver-auth ”%s”" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Jobbserverklient (fb %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "rör till jobbserver" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "skriver till jobbserver" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "läser från jobbledning" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Läser makefiler...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Läser makefilen ”%s”" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (inget standardmål)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (sökväg)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (oviktigt)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ingen ~-expansion)" + +#: 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" + +#: 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" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "ogiltig syntax i villkorssats" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: misslyckades att ladda" + +#: src/read.c:986 +#, c-format +msgid "recipe commences before first target" +msgstr "recept inleds före första målet" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "regel saknas före recept" + +#: 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?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "separator saknas" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "målmönster saknas" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "flera målmönster" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "målmönstret innehåller inget ”%%”" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "”endif” saknas" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "tomt variabelnamn" + +#: src/read.c:1478 +#, c-format +msgid "extraneous text after 'define' directive" +msgstr "överflödig text efter direktivet ”define”" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "”endef” saknas, oavslutad ”define”" + +#: src/read.c:1531 +#, c-format +msgid "extraneous text after 'endef' directive" +msgstr "överflödig text efter direktivet ”endef”" + +#: src/read.c:1603 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "överflödig text efter direktivet ”%s”" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "överflödigt ”%s”" + +#: src/read.c:1632 +#, c-format +msgid "only one 'else' per conditional" +msgstr "endast ett ”else” per villkor" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Felformad målberoende variabeldefinition" + +#: src/read.c:1968 +#, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "beroenden kan inte definieras i recept" + +#: 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" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "blandade implicita regler och normala regler" + +#: src/read.c:2107 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "målet ”%s” motsvarar inte målmönstret" + +#: 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 ::" + +#: 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" + +#: src/read.c:2138 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "varning: åsidosätter recept för målet ”%s”" + +#: src/read.c:2141 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "varning: ignorerar gammalt recept för målet ”%s”" + +#: 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" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Inget behöver göras för ”%s”." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "”%s” är aktuell." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Beskär filen ”%s”.\n" + +#: 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" + +#: 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" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Överväger målfilen ”%s”.\n" + +#: 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" + +#: src/remake.c:444 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Filen ”%s” har redan övervägts.\n" + +#: src/remake.c:454 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Uppdaterar fortfarande filen ”%s”.\n" + +#: src/remake.c:457 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Slutförde uppdaterandet av filen ”%s”.\n" + +#: src/remake.c:486 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Filen ”%s” finns inte.\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:515 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Använder standardrecept för ”%s”.\n" + +#: 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." + +#: 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" + +#: src/remake.c:680 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Förutsättningarna för ”%s” skapas.\n" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Ger upp med målfilen ”%s”.\n" + +#: src/remake.c:699 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Målet ”%s” återskapades inte på grund av fel." + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Inget behov att återskapa målet ”%s”" + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; använder VPATH-namnet ”%s”" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Måste återskapa målet ”%s”.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Bortser från VPATH-namnet ”%s”.\n" + +#: src/remake.c:839 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Receptet för ”%s” körs.\n" + +#: src/remake.c:846 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Misslyckades med att återskapa målfilen ”%s”.\n" + +#: src/remake.c:849 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Återskapade målfilen ”%s”.\n" + +#: 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" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Använder standardkommandon för ”%s”.\n" + +#: 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" + +#: src/remake.c:1662 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS-elementet ”%s” är inte ett mönster" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs kommer inte att exportera %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" +"# Implicita regler" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Inga implicita regler." + +#: src/rule.c:548 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u implicita regler, %u (%.1f %%) slutliga." + +#: src/rule.c:557 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FEL: num_pattern_rules är felaktigt! %u != %u" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "okänd signal" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Avringd" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Avbrott" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Avslutad" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Otillåten instruktion" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Spårningsfälla" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Avbruten" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "IO-fälla" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "Emulatorfälla" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Flyttalsundantag" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Dödad" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Bussfel" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Segmenteringsfel" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Felaktigt systemanrop" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Ledningsbrott" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Alarmklocka" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Avslutad" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Användarsignal 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Användarsignal 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Barn avslutades" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Strömavbrott" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Stoppades" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Stoppades (tty-läsning)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Stoppades (tty-utskrift)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Stoppades (signal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU-tidsgräns överskreds" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Filstorleksgräns överskreds" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtuellt tidur löpte ut" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Profileringstidur löpte ut" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Fönster ändrat" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Fortsatte" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Brådskande I/O-läge" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "I/O-tillfälle" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Miste resurs" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Farosignal" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Informationsbegäran" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Flyttalsprocessor inte tillgänglig" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Inga strcache-buffertar\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-buffertar: totalt = %lu (%lu) / strängar = %lu / lagring = %lu " +"B / snitt = %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 aktuell buf: storlek = %hu B / använt = %hu B / antal = %hu / snitt = %u " +"B\n" + +#: 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" + +#: 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" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s strcache-prestanda: uppslagningar = %lu / träffsäkerhet = %lu %%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# statistik för hashtabell:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "automatisk" + +#: src/variable.c:1656 +msgid "default" +msgstr "normal" + +#: src/variable.c:1659 +msgid "environment" +msgstr "miljö" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "makefil" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "miljö enligt -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "kommandorad" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "”override”-direktiv" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (från ”%s”, rad %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# statistik för variabelmängd-hashtabell:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabler\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Mönsterspecifika variabelvärden" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Inga mönsterspecifika variabelvärden." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u mönsterspecifika variabelvärden" + +#: src/variable.h:229 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "varning: odefinierad variabel ”%.*s”" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() misslyckades med %d\n" + +#: 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" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "INBYGGT 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 "Lägg till utdata till %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Lägg till %.*s och rensa upp\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Utför %s i stället\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-sökvägar\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Inga ”vpath”-sökvägar." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u ”vpath”-sökvägar.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Ingen allmän sökväg (enligt ”VPATH”-variabeln)." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Allmän sökväg (enligt ”VPATH”-variabeln):\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Jobbserverfack begränsat till %d\n" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "skapar jobbserversemafor: (Fel %ld: %s)" + +#: 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)" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Jobbserverklient (semafor %s)\n" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "släpp jobbserversemafor: (Fel %ld: %s)" + +#: 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)" diff --git a/third_party/make/po/tr.gmo b/third_party/make/po/tr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..b795bb1e91606449b7c58c8a1f0ead1171bf5d91 GIT binary patch literal 18996 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 j}, 2001, ..., 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\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 \n" +"Language-Team: Turkish \n" +"Language: tr\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: KBabel 1.9.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "desteklenmeyen özelliği kullanmaya çalışıyor: `%s'" + +#: 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" + +#: src/ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "Dokunulup geçildi: Arşiv `%s' yok" + +#: 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" + +#: 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" + +#: 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ı" + +#: 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" + +#: 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" + +#: 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ı" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr "(isim kırpılmış olmalı)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Tarih %s" + +#: 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" + +#: src/commands.c:403 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Bırakıldı.\n" + +#: 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" + +#: src/commands.c:632 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Arşiv üyesi `%s' sahte olabilir; silinmedi" + +#: src/commands.c:646 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] `%s' dosyası siliniyor" + +#: src/commands.c:648 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** `%s' dosyası siliniyor" + +#: src/commands.c:684 +#, fuzzy +msgid "# recipe to execute" +msgstr "# çalıştırma komutları" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (paket içinde):" + +#: src/commands.c:689 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (`%s'den, satır %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Dizin\n" + +#: src/dir.c:1085 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: durumlanamadı.\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +#, fuzzy +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (anahtar (key) %s, değişiklik tarihi (mtime) %d):" + +#: 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]):" + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (aygıt %ld, i-düğüm %ld):" + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Hayır" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " dosyaları," + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "hayır" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr "olanaksızlıklar" + +#: src/dir.c:1154 +msgid " so far." +msgstr " çok uzak." + +#: src/dir.c:1171 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " %lu dizinde olanaksızlıklar.\n" + +#: 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)" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "sonlandırılmamış değişken bağıntısı" + +#: 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," + +#: 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," + +#: 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." + +#: 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." + +#: 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" + +#: 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" + +#: src/file.c:408 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Aracı dosya `%s' siliniyor" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Aracı dosyalar siliniyor...\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Şu an" + +#: src/file.c:876 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tarih damgası kapsamdışı; yerine %s kullanılıyor" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Bir hedef değil:" + +#: src/file.c:1021 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Kıymetli dosya (.PRECIOUS önceden gerekliliği)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Sahte hedef (.PHONY önceden gerekliliği)." + +#: src/file.c:1025 +#, fuzzy +msgid "# Command line target." +msgstr "# Komut-satırı hedefi." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Bir öntanımlı,MAKEFILES veya -include/sinclude makefile." + +#: src/file.c:1029 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# Örtük kural yok." + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Örtük kural araştırması yapılmıştı." + +#: src/file.c:1032 +msgid "# Implicit rule search has not been done." +msgstr "# Örtük kural araştırması yapılmamıştı." + +#: 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" + +#: 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)" + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Oluştursa da:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Değişiklik zamanı hiç kontrol edilmedi." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Dosya yok." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Dosya çok eski." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Son değişiklik tarihi %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Dosya güncelleştirilmişti." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Dosya güncelleştirilmemişti." + +#: 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)." + +#: 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)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Tamamen güncellendi." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Güncellenmiş olması gerekir (-q verildi)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Güncellenmiş olamadı." + +#: src/file.c:1086 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# `command_state' üyesinde geçersiz değer!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Dosyalar" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# dosyaların hash tablosu durumları:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: src/function.c:794 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "`word' işlevinde sayısal olmayan ilk argüman" + +#: 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ı" + +#: src/function.c:819 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "`wordlist' işlevinde sayısal olmayan ilk argüman" + +#: src/function.c:821 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "`wordlist' işlevinde sayısal olmayan ikinci argüman" + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() başarısız (e=%ld)\n" + +#: 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" + +#: src/function.c:1857 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Geçici komut-listesi (batch) dosyası %s temizleniyor\n" + +#: src/function.c:2230 src/function.c:2255 +#, c-format +msgid "file: missing filename" +msgstr "" + +#: src/function.c:2234 src/function.c:2265 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: src/function.c:2242 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "yazma hatası: %s" + +#: src/function.c:2245 src/function.c:2282 +#, fuzzy, c-format +msgid "close: %s: %s" +msgstr "%s%s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "" + +#: src/function.c:2277 +#, fuzzy, c-format +msgid "read: %s: %s" +msgstr "%s: %s" + +#: src/function.c:2290 +#, fuzzy, c-format +msgid "file: invalid file operation: %s" +msgstr "%s: geçersiz seçenek -- %c\n" + +#: 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" + +#: src/function.c:2417 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "bu platformda gerçekleştirilmemiş: işlev `%s'" + +#: 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" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: 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" + +#: 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" + +#: src/getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: `%s' seçeneği belirsiz\n" + +#: 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" + +#: 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" + +#: 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" + +#: src/getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: `--%s' seçeneği bilinmiyor\n" + +#: src/getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: `%c%s' seçeneği bilinmiyor\n" + +#: src/getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: kuraldışı seçenek -- %c\n" + +#: src/getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: geçersiz seçenek -- %c\n" + +#: 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" + +#: src/getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: `-W %s' seçeneği belirsiz\n" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: 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" + +#: src/hash.c:280 +#, fuzzy, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Yük=%ld/%ld=%.0f%%, " + +#: src/hash.c:282 +#, fuzzy, c-format +msgid "Rehash=%u, " +msgstr "Rehash=%d, " + +#: src/hash.c:283 +#, fuzzy, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Çakışmalar=%ld/%ld=%.0f%%" + +#: 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" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Örtük kural çevrimi görmezden geliniyor.\n" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "" + +#: 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" + +#: 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" + +#: 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" + +#: src/implicit.c:732 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Kural önceden gerekliliği `%s' deneniyor.\n" + +#: src/implicit.c:733 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Örtük önceden gereklilik `%s' deneniyor.\n" + +#: src/implicit.c:772 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Önceden gereklilik `%s' VPATH `%s' olarak bulundu.\n" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Bir geçici dosya oluşturulamıyor\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (bellek kopyası - core dosyası - diske yazıldı)" + +#: src/job.c:553 +#, fuzzy +msgid " (ignored)" +msgstr "[%s] Hata %d (yoksayıldı)" + +#: src/job.c:557 src/job.c:1892 +#, fuzzy +msgid "" +msgstr " (paket içinde):" + +#: src/job.c:573 +#, fuzzy, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "*** [%s] Hata %d" + +#: src/job.c:662 +#, c-format +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Bitmemiş işler için bekliyor...." + +#: 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" + +#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644 +#, c-format +msgid " (remote)" +msgstr " (karşıdan)" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Sayılan %d argüman ile başarısız oldu\n" + +#: 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" + +#: 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" + +#: src/job.c:1902 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "Dokunulup geçildi: Arşiv `%s' yok" + +#: 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" + +#: 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ı " + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "ulaşılamayan yük sınırı: " + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Standart girdi eski haline getirilemedi\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Standart çıktı eski haline getirilemedi\n" + +#: src/job.c:2257 +#, fuzzy, c-format +msgid "Could not restore stderr\n" +msgstr "Standart girdi eski haline getirilemedi\n" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: ortam alanı tükenmiş olabilir" + +#: 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" + +#: 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" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: 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" + +#: src/load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: src/load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: src/load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: src/load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Seçenekler:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Uyumluluk için yoksayıldı.\n" + +#: 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" + +#: 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" + +#: src/main.c:343 +msgid " -d Print lots of debugging information.\n" +msgstr " -b, -m Bir sürü hata ayıklama bilgisi basar.\n" + +#: 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" + +#: 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" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f DOSYA, --file=DOSYA, --makefile=DOSYA\n" +" DOSYAyı bir makefile olarak okur.\n" + +#: src/main.c:355 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Bu iletiyi basar ve çıkar.\n" + +#: 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" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DİZİN, --include-dir=DİZİN\n" +" Eklenecek makefile'ları DİZİNde arar.\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] Bir defada N işe izin verir; argumansız iş\n" +" sayısı sınırsızdır.\n" + +#: 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" + +#: 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" +" Yük N'den az olmadıkça çoklu işler " +"başlatılmaz.\n" + +#: src/main.c:369 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times sembolik bağlarla hedef arasında en son mtime\n" +" kullanılır\n" + +#: src/main.c:371 +#, fuzzy +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" +" Gerçekte komutlar çalıştırılmaz, gösterilir.\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 DOSYA, --old-file=DOSYA, --assume-old=DOSYA\n" +" DOSYAnın çok eski olduğu varsayılır ve\n" +" yeniden işlem yapılmaz.\n" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: 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" + +#: src/main.c:382 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Komut çalıştırmaz; güncelse çıkışta belirtir\n" + +#: 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" + +#: 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" + +#: src/main.c:388 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Komutlar işlenirken gösterilmez.\n" + +#: 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" + +#: 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" + +#: src/main.c:397 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr " -b, -m Bir sürü hata ayıklama bilgisi basar.\n" + +#: 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" + +#: src/main.c:401 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Kullanılan dizini basar.\n" + +#: src/main.c:403 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Dolaylı olarak açılmış olsa bile -w 'yi " +"kapatır\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 DOSYA, --what-if=DOSYA, --new-file=DOSYA, --assume-new=DOSYA\n" +" DOSYA sonsuz yeni varsayılır.\n" + +#: src/main.c:408 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Atanmamış bir değişkene bağıntı yapıldığında\n" +" uyarır.\n" + +#: src/main.c:671 +#, c-format +msgid "empty string invalid as file name" +msgstr "dosyaismi olarak boş dizge geçersiz" + +#: src/main.c:754 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "Hata ayıklama düzeyi özelliği `%s' bilinmiyor" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: 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" + +#: src/main.c:856 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"program %s tarafından elde edilmemiş olağandışı-durum süzgeci çağrıldı\n" +"OlağandışılıkKodu = %lx\n" +"OlağandışılıkBayrakları = %lx\n" +"OlağandışılıkAdresi = %lx\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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." + +#: 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." + +#: src/main.c:1781 +#, c-format +msgid "Makefile from standard input specified twice." +msgstr "Makefile standart girdiden iki kez belirtildi." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (geçici dosya)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (geçici dosya)" + +#: 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." + +#: 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" + +#: src/main.c:2109 +#, c-format +msgid "Symbolic links not supported: disabling -L." +msgstr "Sembolik bağlar desteklenmiyor: -L iptal ediliyor" + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "makefile'ları güncelliyor...\n" + +#: 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" + +#: src/main.c:2303 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "`%s' make dosyası yeniden derlenemiyor." + +#: src/main.c:2323 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "İçerilen make dosyası `%s' bulunamadı." + +#: src/main.c:2328 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "`%s' make dosyası bulunamadı" + +#: src/main.c:2394 +#, c-format +msgid "Couldn't change back to original directory." +msgstr "Geriye, özgün dizine geçilemiyor." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Yeniden çalıştırılıyor[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (geçici dosya): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL bir hedeften fazlasını içeriyor" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Hedef yok" + +#: 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" + +#: src/main.c:2610 +#, c-format +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "uyarı: Clock skew saptandı. Derleme tamamlanamayabilir." + +#: src/main.c:2804 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Kullanım: %s [seçenekler] [hedef] ...\n" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Bu program %s için kurgulanmış\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Bu program %s için kurgulanmış (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Yazılım hatalarını adresine,\n" +"çeviri hatalarını adresine bildiriniz.\n" + +#: 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" + +#: 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" + +#: src/main.c:3363 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sBu program %s için derlenmiş\n" + +#: src/main.c:3365 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sBu program %s için derlenmiş (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make veri tabanı, %s üzerine basıldı" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# %s üzerindeki Make veri tabanı tamamlandı\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "İlklendirilmiş erişim" + +#: src/misc.c:743 +msgid "User access" +msgstr "Kullanıcı erişimi" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Make erişimi" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Asta erişim" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: bilinmeyen bir dizine giriliyor\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: bilinmeyen dizinden çıkılıyor\n" + +#: src/output.c:102 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: `%s' dizine giriliyor\n" + +#: src/output.c:104 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: `%s' dizininden çıkılıyor\n" + +#: src/output.c:108 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Bilinmeyen bir dizine giriliyor\n" + +#: src/output.c:110 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Bilinmeyen dizinden çıkılıyor\n" + +#: src/output.c:113 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]:`%s' dizinine giriliyor\n" + +#: src/output.c:115 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: `%s' dizininden çıkılıyor\n" + +#: src/output.c:442 src/output.c:444 +#, fuzzy, c-format +msgid "write error: stdout" +msgstr "yazma hatası: %s" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Durdu.\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 "" + +#: src/posixos.c:90 +msgid "creating jobs pipe" +msgstr "işleri yaratıyor" + +#: src/posixos.c:98 src/posixos.c:251 +#, fuzzy +msgid "duping jobs pipe" +msgstr "işleri yaratıyor" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "işleri hazırlıyor" + +#: 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" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: src/posixos.c:138 +#, fuzzy +msgid "jobserver pipeline" +msgstr "işleri hazırlıyor" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "iş-sunucusu yazıyor" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "görev listesi okunuyor" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Makefile'lar okunuyor...\n" + +#: src/read.c:336 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "`%s' make dosyası okunuyor" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (öntanımlı amaç yok)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (arama yolu)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (umurunda değil)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr "( ~ uzantısı yok)" + +#: src/read.c:655 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: src/read.c:787 +#, c-format +msgid "invalid syntax in conditional" +msgstr "şartlı ifade de yazılış hatası" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: src/read.c:986 +#, fuzzy, c-format +msgid "recipe commences before first target" +msgstr "komutlar ilk hedeften önce başlıyor" + +#: src/read.c:1035 +#, fuzzy, c-format +msgid "missing rule before recipe" +msgstr "komutlardan önceki kural kayıp" + +#: 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?)" + +#: src/read.c:1138 +#, fuzzy, c-format +msgid "missing separator" +msgstr "kayıp ayraç%s" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "hedef kalıp kayıp" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "çok sayıda hedef kalıp" + +#: src/read.c:1289 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "hedef kalıp `%%' içermiyor" + +#: src/read.c:1404 +#, fuzzy, c-format +msgid "missing 'endif'" +msgstr "`endif' kayıp" + +#: src/read.c:1443 src/read.c:1488 src/variable.c:1600 +#, c-format +msgid "empty variable name" +msgstr "boş değişken ismi" + +#: src/read.c:1478 +#, fuzzy, c-format +msgid "extraneous text after 'define' directive" +msgstr "`endef' yönergesinden sonraki metin yersiz" + +#: src/read.c:1503 +#, fuzzy, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "`endef' kayıp, `define' sonlandırılmamış" + +#: src/read.c:1531 +#, fuzzy, c-format +msgid "extraneous text after 'endef' directive" +msgstr "`endef' yönergesinden sonraki metin yersiz" + +#: src/read.c:1603 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "`%s' yönergesinden sonraki metin yersiz" + +#: src/read.c:1604 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "`%s' yersiz" + +#: src/read.c:1632 +#, fuzzy, c-format +msgid "only one 'else' per conditional" +msgstr "her şartlı ifade de sadece bir `else'" + +#: src/read.c:1908 +#, c-format +msgid "Malformed target-specific variable definition" +msgstr "Hedefe özgü değişken tanımı bozuk" + +#: src/read.c:1968 +#, fuzzy, c-format +msgid "prerequisites cannot be defined in recipes" +msgstr "öngereksinimler komut betiklerinde tanımlanamaz" + +#: 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ış" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "örtük ve normal kurallar karışmış" + +#: 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" + +#: 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" + +#: 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ş." + +#: 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" + +#: 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" + +#: src/read.c:2254 +#, fuzzy, c-format +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "örtük ve normal kurallar karışmış" + +#: 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" + +#: src/remake.c:226 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "`%s' için hiçbir şey yapılmadı." + +#: src/remake.c:227 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "`%s' güncel" + +#: src/remake.c:323 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Budanmış dosya `%s'.\n" + +#: 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" + +#: 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" + +#: src/remake.c:425 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "hedef dosya `%s' hesaba katılıyor.\n" + +#: 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" + +#: src/remake.c:444 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "`%s' dosyası zaten hesaba katıldı.\n" + +#: src/remake.c:454 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "`%s' dosyası hala güncelleniyor.\n" + +#: src/remake.c:457 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "`%s' dosyasının güncellenmesi tamamlandı.\n" + +#: src/remake.c:486 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "`%s' dosyası yok.\n" + +#: src/remake.c:494 +#, fuzzy, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Uyarı: .LOW_RESOLUTION_TIME dosyası `%s' yüksek çözünürlüklü bir zaman " +"damgası içeriyor" + +#: 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" + +#: 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" + +#: 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" + +#: 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." + +#: 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" + +#: 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" + +#: src/remake.c:694 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "`%s' hedef dosyasında umut kesiliyor.\n" + +#: src/remake.c:699 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Hedef `%s' hatalardan dolayı yeniden derlenemez." + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:802 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Hedef `%s' nin yeniden derlenmesine gerek yok" + +#: src/remake.c:804 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr "; VPATH ismi `%s' kullanılıyor" + +#: src/remake.c:824 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "Hedef `%s' yeniden derlenmeli.\n" + +#: src/remake.c:830 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " VPATH ismi `%s' yoksayılıyor.\n" + +#: src/remake.c:839 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "`%s' nin komutları çalışmaya devam ediyor.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:1662 +#, fuzzy, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS elemanı `%s' bir kalıp değil" + +#: src/remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Özelleştirilmiş olanlar dışarı aktarılmayacak: %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" +"# Örtük Kurallar" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Örtük kural yok." + +#: src/rule.c:548 +#, fuzzy, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u örtük kural, %u" + +#: 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" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "bilinmeyen sinyal" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Tıkanma" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Kesme" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Çık" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Yönergeler uygun değil" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "İzleme/kesmenoktası yakalayıcı" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "İptal edildi" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "IOT tuzağı" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "EMT tuzağı" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Gerçek sayı olağandışı durumu" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Süreç durduruldu" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Veri yolu hatası" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Parçalama arızası" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Sistem çağrısı hatalı" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Veri alınamıyor" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Alarm saati" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Sonlandırıldı" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Kullanıcı tanımlı sinyal 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Kullanıcı tanımlı sinyal 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Ast bıraktı" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Güç kesilmesi" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Durduruldu" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Durduruldu (konsol girdisi)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Durduruldu (konsol çıktısı)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Durduruldu (sinyal)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU zaman sınırı aşıldı" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Dosya uzunluğu sınırı aşıldı" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Sanal süreölçer kullanım süresi doldu" + +#: src/signame.c:180 +msgid "Profiling timer expired" +msgstr "Tanıtım süreölçer kullanım süresi doldu" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Pencere boyutları değiştirildi" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Devam ediliyor" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Acil G/Ç koşulu" + +#: src/signame.c:199 src/signame.c:208 +msgid "I/O possible" +msgstr "G/Ç mümkün" + +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Kaynak kaybı" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Tehlike sinyali" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Bilgi isteği" + +#: src/signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Aritmetik işlemci kullanılabilir değil" + +#: 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" + +#: src/strcache.c:304 +#, fuzzy, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "%s dizge belleği boş: toplam = %d / max = %d / min = %d / ort = %d\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 dizge belleği boyu: toplam = %d / max = %d / min = %d / ort = %d\n" + +#: 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" + +#: 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" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: src/strcache.c:328 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# dosyaların hash tablosu durumları:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "otomatik" + +#: src/variable.c:1656 +msgid "default" +msgstr "öntanımlı" + +#: src/variable.c:1659 +msgid "environment" +msgstr "çevre" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "derleme dosyası" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "çevre -e altında" + +#: src/variable.c:1668 +msgid "command line" +msgstr "komut satırı" + +#: src/variable.c:1671 +#, fuzzy +msgid "'override' directive" +msgstr "`override' yönergesi" + +#: src/variable.c:1682 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (`%s'den, satır %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# değişken kümesi hash tablosunun durumu:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Değişkenler\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Kalıba özgü Değişken Değerleri" + +#: src/variable.c:1774 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Örneğe duyarlı değişken değeri yok." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u örneğe duyarlı değişken değeri" + +#: src/variable.h:229 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "uyarı: `%.*s' değişkeni atanmamış" + +#: src/vmsfunctions.c:91 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search %d ile başarısız\n" + +#: 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" + +#: src/vmsjobs.c:681 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "OLUŞUMİÇİ CD %s\n" + +#: src/vmsjobs.c:1224 +#, c-format +msgid "DCL: %s\n" +msgstr "" + +#: src/vmsjobs.c:1284 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "%s e yönlendirilmiş çıktı\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s yerine çalıştırılıyor\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Arama yolu\n" + +#: src/vpath.c:620 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# `vpath' arama yolları yok" + +#: src/vpath.c:622 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u `vpath' arama yolu.\n" + +#: src/vpath.c:625 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Genel arama yolu (`VPATH' çevre değişkeni) yok." + +#: src/vpath.c:631 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Genel (`VPATH' çevre değişkeni) arama yolu:\n" +"# " + +#: src/w32/w32os.c:44 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: src/w32/w32os.c:60 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:79 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:82 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: src/w32/w32os.c:123 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: src/w32/w32os.c:194 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#~ msgid "# Invalid value in `update_status' member!" +#~ msgstr "# `update_status' üyesinde geçersiz değer!" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Hata 0x%x (yoksayıldı)" + +#~ msgid "*** [%s] Error 0x%x" +#~ msgstr "*** [%s] Hata 0x%x" + +#~ 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" + +#~ msgid "dup jobserver" +#~ msgstr "çift iş sunucusu" + +#~ 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 "" +#~ "%sBu bir serbest yazılımdır; kopyalama koşulları için kaynak koduna " +#~ "bakınız.\n" +#~ "%sHiçbir garantisi yoktur; hatta SATILABİLİRLİĞİ veya ŞAHSİ " +#~ "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" + +#~ msgid "write error" +#~ msgstr "yazma hatası" + +#~ msgid "extraneous `endef'" +#~ msgstr "yersiz `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "boş `override' yönergesi" + +#~ 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" +#~ msgstr "" +#~ "\n" +#~ "%s dizge belleğindeki dizgelerin sayısı: %d\n" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Uyarı: Boş yönlendirme\n" + +#~ msgid "internal error: `%s' command_state" +#~ msgstr "içsel hata: `%s' command_state" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-uyarı, CTRL-Y etraftaki alt-süreç(ler)i bıraktıracak.\n" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "OLUŞUMİÇİ [%s][%s]\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "OLUŞUMİÇİ RM %s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Oluşumiçi komut '%s' bilinmiyor\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Hata, boş komut\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "%s den yönlendirilmiş girdi\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "%s e yönlendirilmiş hata\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "doğum hatası, %d\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Dosyada hala yazılış hatası var: '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "SIGCHLD sinyali alındı; %u sağlanmamış ast dosya.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "sh.exe yoksa -j veya --jobs belirtilemez." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Tek iş kipi için make'i başlatma konumuna alıyor" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "`%sinclude' için dosyaismi yok" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "hedef `%s' önceden gereklilik kalıbını boş bırakıyor" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Dosyalar yok." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u dosya %u hash kümesinde.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# her tabloda ortalama %.3f dosya, bir tabloda en çok %u dosya.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DİZİN" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "Hiç bir şey yapmadan DİZİNe geçer" + +#~ msgid "FLAGS" +#~ msgstr "BAYRAKLAR" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Bir hata ayıklayıcı eklemeye izin vermek için süreci askıya alır" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "Çevre değişkenleri makefile'ları geçersiz kılıyor" + +#~ msgid "FILE" +#~ msgstr "DOSYA" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "DOSYAyı bir makefile olarak okur" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "İçerilmiş makefile'lar için DİZİNi araştırır" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Yük N'in altında olmadıkça işler başlatılmaz" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "Genellikle hiçbir komut çalıştırılmaz; onları basar" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "DOSYAnın çok eski olduğunu hesaba katarak yeniden derlemez." + +#~ msgid "Don't echo commands" +#~ msgstr "Komutları ekolamaz" + +#~ msgid "Turns off -k" +#~ msgstr "-k 'yı kapatır" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "DOSYAnın ne kadar yeni olduğundaki belirsizliği hesaba katar." + +#~ msgid "Entering" +#~ msgstr " Dizine girdi:" + +#~ msgid "Leaving" +#~ msgstr "Dizini bıraktı:" + +#~ msgid "# No variables." +#~ msgstr "# Değişkenker yok" + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# her tabloda %.1f değişken ortalaması, bir tabloda en çok %u\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# her tabloda %d.%d değişken ortalaması, bir tabloda en çok %u\n" diff --git a/third_party/make/po/uk.gmo b/third_party/make/po/uk.gmo new file mode 100644 index 0000000000000000000000000000000000000000..3112ee8664b235a35b0d389832d40ef256cdde78 GIT binary patch literal 56014 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 H#o_-CUT+7^ literal 0 HcmV?d00001 diff --git a/third_party/make/po/uk.po b/third_party/make/po/uk.po new file mode 100644 index 00000000000..2ed7e54d87c --- /dev/null +++ b/third_party/make/po/uk.po @@ -0,0 +1,2354 @@ +# Переклад make українською. +# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# +# Volodymyr M. Lisivka , 2001-2012. +# Yuri Chornoivan , 2012, 2013, 2014, 2016, 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 12:37+0200\n" +"Last-Translator: Yuri Chornoivan \n" +"Language-Team: Ukrainian \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 19.11.70\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" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "оновлення часу зміни: Архів \"%s\" не існує" + +#: src/ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "оновлення часу зміни: некоректний архів: \"%s\"" + +#: src/ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "оновлення часу зміни: Член \"%s\" не міститься у \"%s\"" + +#: src/ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "" +"оновлення часу зміни: Функція ar_member_touch повернула\n" +"помилковий код відповіді для \"%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 " uid = %d, gid = %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, івузол [%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 +#, 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 "" +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 "Підбираємо вдалий дочірній процес з PID %p %s %s\n" + +#: 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" + +#: 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 "Вилучаємо PID дочірнього процесу %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 "Додаємо дочірній процес з PID %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 "не вистачає файлових дескрипторів: не вдалося здублювати stdin\n" + +#: src/job.c:2212 +#, c-format +msgid "no more file handles: could not duplicate stdout\n" +msgstr "не вистачає файлових дескрипторів: не вдалося здублювати stdout\n" + +#: src/job.c:2226 +#, c-format +msgid "no more file handles: could not duplicate stderr\n" +msgstr "не вистачає файлових дескрипторів: не вдалося здублювати stderr\n" + +#: src/job.c:2241 +#, c-format +msgid "Could not restore stdin\n" +msgstr "Не вдалося відновити stdin\n" + +#: src/job.c:2249 +#, c-format +msgid "Could not restore stdout\n" +msgstr "Не вдалося відновити stdout\n" + +#: src/job.c:2257 +#, c-format +msgid "Could not restore stderr\n" +msgstr "Не вдалося відновити stderr\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) Поганий контекст оболонки (!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" + +#: 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=КАТАЛОГ\n" +" Виконати пошук включених 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 Змінювати час доступу до мети замість її " +"повторного збирання.\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, навіть якщо вмикання було " +"виконано неявним чином.\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 "" +"попередження: сервер завдань недоступний: використовуємо -j1. Додайте «+» до " +"батьківського правила збирання." + +#: src/main.c:1617 +#, c-format +msgid "warning: -j%d forced in submake: resetting jobserver mode." +msgstr "попередження: у submake вказано -j%d: вимикаємо режим сервера завдань." + +#: 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 "" +"попередження: у makefile вказано -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 "Оновлення make-файлів...\n" + +#: src/main.c:2226 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Make-файл \"%s\", можливо, зациклений, він не перезбиратиметься.\n" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Спроба перезібрати make-файл \"%s\" безуспішна." + +#: src/main.c:2323 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Make-файл \"%s\", який включається, не було знайдено." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Make-файл \"%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 "Не задані цілі і не знайдений make-файл" + +#: 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 \n" +msgstr "Повідомлюйте про помилки до \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 \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 GPL версії 3 або новішій, " +"\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 "Доступ 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 "помилка запису: stdout" + +#: 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 "Клієнт сервера завдань (fd %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 "Читання make-файлів...\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Читання make-файла \"%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 "Пропускаємо мітку UTF-8 у файлі makefile «%s»\n" + +#: src/read.c:658 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Пропускаємо мітку UTF-8 у буфері файла makefile\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 замість 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 "пропущена \"endif\", незавершена \"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» через встановлення ключа always-make.\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 "ПОМИЛКА: значення 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 "Зупинено (ввід з термінала) " + +#: 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 "Можливий ввід/вивід" + +#: 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" +"Буфери strcache %s: %lu (%lu) / рядків = %lu / сховище = %lu Б / сер = %lu " +"Б\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 Б / використано = %hu Б / кількість = %hu / " +"сер = %u Б\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 Б\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 Б / макс = %lu Б / мін = %lu Б / сер = %hu Б\n" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"Швидкодія strcache %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 "файл make" + +#: 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 "" +"-попередження, ймовірно, вам варто повторно увімкнути обробку 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)" + +#~ 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» зазнала невдачі" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] Помилка 0x%x%s" + +#~ msgid "%s[%s] %s%s%s" +#~ msgstr "%s[%s] %s%s%s" + +#~ msgid "dup jobserver" +#~ msgstr "дублюємо сервер завдань" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Попередження: порожнє переспрямування\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "внутрішня помилка: «%s» command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "ВБУДОВАНИЙ [%s][%s]\n" + +#~ msgid "BUILTIN ECHO %s->%s\n" +#~ msgstr "ВБУДОВАНЕ ECHO %s->%s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Невідома вбудована команда \"%s\".\n" + +#~ msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +#~ msgstr "" +#~ "У .ONESHELL ця вбудована команда є невідомою або непідтримуваною: «%s»\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Помилка, порожня команда\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Переспрямоване виведення з %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Повідомлення про помилку переспрямовано до %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Переспрямовуємо виведення до %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Помилка породження процесу, %d\n" + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "внутрішня помилка: вказано декілька параметрів --sync-mutex" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "внутрішня помилка: вказано декілька ключів --jobserver-fds" + +#~ msgid "virtual memory exhausted" +#~ msgstr "віртуальна пам'ять вичерпана" + +#~ msgid "write error" +#~ msgstr "помилка запису" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "ВБУДОВАНИЙ RM %s\n" + +#~ msgid "# Invalid value in 'update_status' member!" +#~ msgstr "# Некоректне значення члена \"update_status\"!" + +#~ msgid "unknown trace mode '%s'" +#~ msgstr "невідомий режим трасування «%s»" diff --git a/third_party/make/po/vi.gmo b/third_party/make/po/vi.gmo new file mode 100644 index 0000000000000000000000000000000000000000..53aac6bfe510dec5e60146c2907e057d2a755003 GIT binary patch literal 47388 zcmch=37ni&neYGNFbF|JKz7lWrRff&IthfWlK@F)YqFAb0+@-hx~jUnNOe_HOBPfF zK@r&nR0bo2fEZZ?6iHm}*oZSa>iz2-XPm`rRCJtinemP@*SVu}zrW|4cd6>??%@3Y z|N7+3?_JJ0?>WzT&a<8Kp8np^2j3U)d+MMdcoTTr5kauvH9_znC+RM~Gu-`yz_Yo0 zGk7L=8F(ak4R|Pc19&R<0WbqT0UibZH5h_F^Y@SF2!dm|o(pz@mxHH+JHX?>ogh^R zo(E3>zXYBDeji)|{sx>2UPdKO1K$Up4DJC#@XKHw{4ux!+{jCm?-Sr6@HgN^;Kf}* zuoB!3UJAYpR>0Rz4}zuOHc;1J1eJg0SwT<&uLqZaKL;-Z=RlO}!FPiyH<%Fwy+98* z2wn$n244YH@5KVw1gY&`LLGj(!JRWnQd*4P-biEHe1pFANetZX8LShj)QTgL}Xe!Owa84ybnj6R2`dfjQN0b3xtDf}+nIUE8h!13mz%yr)6Y{Uz{l@LxgE`85n0_4kP$=YuP_&VqDJ@DzA5_=>+i z=n~`}*B64^3a$mk-!Foq-xw(V`XzWgc+#cr`8nWgxt<5A9*aO&JlG1VK6}6uz)yp! z?>9j8-w#2RcL*=lc$f`}PM3lqxCT`Ht^rlf?V##&KdATb2Hyhi178RJjmN(SMXz7` z=O-_8^`8rh--bZ-|83x#!HT^7({+cu@5|15`aTU4LA8G;h)4;Z169ADf{5_o z;AKuPo(HP@O`!V!ZczQO6BJ+k8K`mj3aI)X)90=)0z0`L0#(mD!PkI$K+)w1Q1$o* z$Pf;G21?F%Ugr4m98mqd2^8J01rGyvf*LoEf$HDyfqMVXJf5`N@&7W9*Mj2HCqU8l zB~a=A3OpD*WQEfshl8TWDIU)S_1->Ed{6?V7w!V*gZ~Y@0Q?=O{ycxBYtIHy<<~*g z^I`CC@VlVKc^V^}}~Tz4xC%@xdW$9euh$(SMG|%RoJU zJE(HrgSul z5PSlZe)u{ldGRCgLh!fXEb#md?s^DRx`#l~?*&lf?3@1j*WhtnA901N&l%wPTwe&z z0V^OwGk65lc>6i{M)2?}T{}Zi{d_Jcx^4nRulqsq+t)$$=XXH0>$jl#^N6e5xak5# z=N?e?sDtXSTS2w=aqtB2+n~n(&p`FhFG02Q)VI3pwV>#IlfQlzJcsKafhzC#jjn$# z0L6EUK;^H1M}ZH4;)iEJ_2Zv_qW?F*8Q}i{l|K9<$Iq98k}ubTdcG4>y}k;n{Qm&; z-p);qo=d^=xV{cl`sYE(hy5N8ew(9PCn$Pu1l14k1=X(4fuiF-fTw^*ZFcpY37*LH z#h~hUCHNNb7H~ee2b>H31ndD%f4i&a+d$RhE>QjZc~Jd*NY>SVE~xqqf-}Kezze|_ z!3)4&f#Tn@23)^h3~C�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 literal 0 HcmV?d00001 diff --git a/third_party/make/po/vi.po b/third_party/make/po/vi.po new file mode 100644 index 00000000000..29fc1f2a888 --- /dev/null +++ b/third_party/make/po/vi.po @@ -0,0 +1,2392 @@ +# Vietnamese translation for Make. +# Bản dịch tiếng Việt dành cho make. +# Copyright © 2016 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Clytie Siddall , 2006-2010. +# Nguyễn Thái Ngọc Duy , 2012. +# Trần Ngọc Quân , 2012-2014, 2016, 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 15:04+0700\n" +"Last-Translator: Trần Ngọc Quân \n" +"Language-Team: Vietnamese \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: \n" +"X-Generator: Poedit 2.2.4\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: 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”" + +#: 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" + +#: src/ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Kho “%s” không tồn tại" + +#: 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ệ" + +#: 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”" + +#: 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”" + +#: 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" + +#: 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" + +#: 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”" + +#: 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" + +#: src/arscan.c:945 +msgid " (name might be truncated)" +msgstr " (có lẽ tên đã bị cắt ngắn)" + +#: src/arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Ngày %s" + +#: src/arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, chế độ = 0%o.\n" + +#: 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)" + +#: src/commands.c:504 +msgid "*** Break.\n" +msgstr "*** Ngắt.\n" + +#: 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ỏ" + +#: 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ỏ" + +#: src/commands.c:646 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Đang xóa tập tin “%s”" + +#: src/commands.c:648 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Đang xóa tập tin “%s”" + +#: src/commands.c:684 +msgid "# recipe to execute" +msgstr "# công thức cần thực hiện" + +#: src/commands.c:687 +msgid " (built-in):" +msgstr " (dựng-sẵn):" + +#: src/commands.c:689 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (từ “%s”, dòng %lu):\n" + +#: src/dir.c:1073 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Thư mục\n" + +#: 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" + +#: src/dir.c:1089 +msgid "# %s (key %s, mtime %I64u): could not be opened.\n" +msgstr "# %s (khóa %s, mtime %I64u): không thể mở.\n" + +#: 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" + +#: 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" + +#: src/dir.c:1126 +msgid "# %s (key %s, mtime %I64u): " +msgstr "# %s (khóa %s, mtime %I64u): " + +#: src/dir.c:1131 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (thiết bị %d, inode [%d,%d,%d]): " + +#: src/dir.c:1136 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (thiết bị %ld, inode %ld): " + +#: src/dir.c:1142 src/dir.c:1163 +msgid "No" +msgstr "Không" + +#: src/dir.c:1145 src/dir.c:1166 +msgid " files, " +msgstr " tập tin, " + +#: src/dir.c:1147 src/dir.c:1168 +msgid "no" +msgstr "không" + +#: src/dir.c:1150 +msgid " impossibilities" +msgstr " việc không thể làm được" + +#: src/dir.c:1154 +msgid " so far." +msgstr " cho đến giờ." + +#: 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" + +#: 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ó" + +#: src/expand.c:271 +#, c-format +msgid "unterminated variable reference" +msgstr "tham chiếu biến chưa chấm dứt" + +#: 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," + +#: 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," + +#: 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”." + +#: 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”." + +#: 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" + +#: 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" + +#: src/file.c:408 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Đang xóa tập tin trung gian “%s”" + +#: src/file.c:412 +#, c-format +msgid "Removing intermediate files...\n" +msgstr "Xóa các tập tin trung gian…\n" + +#: src/file.c:872 +msgid "Current time" +msgstr "Giờ hiện tại" + +#: 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" + +#: src/file.c:1016 +msgid "# Not a target:" +msgstr "# Không phải là đích:" + +#: 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)." + +#: src/file.c:1023 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Đích giả (điều kiện tiên quyết của .PHONY)." + +#: src/file.c:1025 +msgid "# Command line target." +msgstr "# Đích dòng lệnh." + +#: src/file.c:1027 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Mặc định, MAKEFILES, hoặc makefile kiểu -include/sinclude." + +#: src/file.c:1029 +msgid "# Builtin rule" +msgstr "# Quy tắc dựng sẵn" + +#: src/file.c:1031 +msgid "# Implicit rule search has been done." +msgstr "# Hoàn tất tìm quy tắc ngầm." + +#: 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." + +#: src/file.c:1034 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Cuống mẫu ngầm/tĩnh: “%s”\n" + +#: 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." + +#: src/file.c:1040 +msgid "# Also makes:" +msgstr "# Cũng tạo:" + +#: src/file.c:1046 +msgid "# Modification time never checked." +msgstr "# Chưa kiểm tra giờ sửa đổi." + +#: src/file.c:1048 +msgid "# File does not exist." +msgstr "# Tập tin không tồn tại." + +#: src/file.c:1050 +msgid "# File is very old." +msgstr "# Tập tin rất cũ." + +#: src/file.c:1055 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Lần sửa cuối cùng %s\n" + +#: src/file.c:1058 +msgid "# File has been updated." +msgstr "# Tập tin đã được cập nhật." + +#: src/file.c:1058 +msgid "# File has not been updated." +msgstr "# Tập tin chưa được cập nhật." + +#: 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)." + +#: 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)." + +#: src/file.c:1074 +msgid "# Successfully updated." +msgstr "# Cập nhật thành công." + +#: src/file.c:1078 +msgid "# Needs to be updated (-q is set)." +msgstr "# Cần được cập nhật (-q được đặt)." + +#: src/file.c:1081 +msgid "# Failed to be updated." +msgstr "# Gặp lỗi khi cập nhật." + +#: src/file.c:1086 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Gặp giá trị sai trong thành viên “command_state”!" + +#: src/file.c:1105 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Tập tin" + +#: src/file.c:1109 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# thống kê bảng băm tập tin:\n" +"# " + +#: src/file.c:1119 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Trường “%s” chưa được nhớ đệm: %s" + +#: 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”" + +#: 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" + +#: 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”" + +#: 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”" + +#: 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" + +#: 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" + +#: src/function.c:1564 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() bị lỗi (e=%ld)\n" + +#: 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" + +#: 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" + +#: 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 +#: src/function.c:2234 src/function.c:2265 +#, c-format +msgid "open: %s: %s" +msgstr "mở: %s: %s" + +#: src/function.c:2242 +#, c-format +msgid "write: %s: %s" +msgstr "ghi: %s: %s" + +# Variable: do not translate/ biến: đừng dịch +#: src/function.c:2245 src/function.c:2282 +#, c-format +msgid "close: %s: %s" +msgstr "đóng: %s: %s" + +#: src/function.c:2258 +#, c-format +msgid "file: too many arguments" +msgstr "file: quá ít đối số" + +#: 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 "tập tin: Thao tác tập tin không hợp lệ: %s" + +#: 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”" + +#: 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”" + +#: 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”" + +#: src/function.c:2667 +#, c-format +msgid "Empty function name" +msgstr "Tên hàm trống rỗng" + +#: src/function.c:2669 +#, c-format +msgid "Invalid function name: %s" +msgstr "Tên hàm không hợp lệ: %s" + +#: src/function.c:2671 +#, c-format +msgid "Function name too long: %s" +msgstr "Tên hàm quá dài: %s" + +#: 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”" + +#: 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”" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Đang khai triển “%s”\n" + +#: src/guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Đang định giá “%s”\n" + +#: 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ớ" + +#: src/hash.c:280 +#, c-format +msgid "Load=%lu/%lu=%.0f%%, " +msgstr "Tải =%lu/%lu=%.0f%%, " + +#: src/hash.c:282 +#, c-format +msgid "Rehash=%u, " +msgstr "Băm lại=%u, " + +#: src/hash.c:283 +#, c-format +msgid "Collisions=%lu/%lu=%.0f%%" +msgstr "Xung đột =%lu/%lu=%.0f%%" + +#: 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" + +#: 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" + +#: src/implicit.c:311 +#, c-format +msgid "Avoiding implicit rule recursion.\n" +msgstr "Tránh quy tắc ngầm đệ quy.\n" + +#: src/implicit.c:484 +#, c-format +msgid "Stem too long: '%s%.*s'.\n" +msgstr "Stem quá dài: “%s%.*s”.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:370 +msgid "Cannot create a temporary file\n" +msgstr "Không thể tạo tập tin tạm\n" + +#: src/job.c:548 +msgid " (core dumped)" +msgstr " (đổ lõi)" + +#: src/job.c:553 +msgid " (ignored)" +msgstr " (bỏ qua)" + +#: src/job.c:557 src/job.c:1892 +msgid "" +msgstr "" + +#: src/job.c:573 +#, c-format +msgid "%s[%s: %s] Error %d%s" +msgstr "%s[%s: %s] Lỗi %d%s" + +#: 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…" + +#: 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" + +#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644 +#, c-format +msgid " (remote)" +msgstr " (máy chủ)" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:1579 src/job.c:2491 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Đếm được %d đối số trong lần khởi chạy bị lỗi\n" + +#: 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" + +#: 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" + +#: src/job.c:1902 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: đích “%s” không tồn tại" + +#: 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" + +#: 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" + +#: src/job.c:2110 +msgid "cannot enforce load limit: " +msgstr "không thể buộc giới hạn tải: " + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/job.c:2623 +#, c-format +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: cạn không gian dành cho biến môi trường" + +#: 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" + +#: 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" + +#: src/job.c:3308 +#, c-format +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Nội dung tập tin bó lệnh:\n" +"\t@echo off\n" + +#: src/job.c:3497 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Nội dung tập tin bó lệnh:%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òng %d) Ngữ cảnh shell sai (!unixy && !batch_mode_shell)\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/load.c:204 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Đang tải ký hiệu %s từ %s\n" + +#: 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." + +#: src/main.c:335 +msgid "Options:\n" +msgstr "Tùy chọn:\n" + +#: src/main.c:336 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Bỏ qua để tương thích.\n" + +#: 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" + +#: src/main.c:340 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C THƯ_MỤC, --directory=THƯ_MỤC\n" +" Chuyển sang THƯ MỤC này trước khi làm.\n" + +#: 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" + +#: 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" + +#: src/main.c:347 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Biến môi trường đè tập tin makefile.\n" + +#: src/main.c:350 +msgid "" +" -E STRING, --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" -E STRING, --eval=CHUỖI Định lượng CHUỖI như một lệnh makefile.\n" + +#: src/main.c:352 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f TẬP-TIN, --file=TẬP-TIN, --makefile=TẬP-TIN\n" +" Đọc TẬP-TIN dạng makefile.\n" + +#: 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" + +#: 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" + +#: src/main.c:359 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I THƯ_MỤC, --include-dir=THƯ_MỤC\n" +" Quét THƯ-MỤC này tìm makefile con.\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] Cho phép N công việc đồng thời; không có đối " +"số thì vô hạn.\n" + +#: 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" + +#: 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 [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" + +#: 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" + +#: 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" +" Không chạy công thức; chỉ in chúng ra.\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 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" + +#: src/main.c:377 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" +" -O[KIỂU], --output-sync[=KIỂU]\n" +" Đồng bộ hóa kết xuất công việc song song theo " +"KIỂU.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Tắt -k.\n" + +#: 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" + +#: src/main.c:397 +msgid " --trace Print tracing information.\n" +msgstr " --trace Hiển thị thông tin dấu vết.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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 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" + +#: 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" + +#: 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" + +#: 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”" + +#: src/main.c:794 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "không hiểu kiểu output-sync “%s”" + +#: 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" + +#: 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" +"Bộ lọc ngoại lệ không quản lý được gọi từ chương trình %s\n" +"ExceptionCode (mã ngoại lệ) = %lx\n" +"ExceptionFlags (các cờ ngoại lệ) = %lx\n" +"ExceptionAddress (địa chỉ ngoại lệ) = 0x%p\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/main.c:1609 +#, c-format +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." + +#: 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." + +#: 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." + +#: src/main.c:1819 src/vmsjobs.c:1248 +msgid "fopen (temporary file)" +msgstr "fopen (tập tin tạm)" + +#: src/main.c:1825 +msgid "fwrite (temporary file)" +msgstr "fwrite (tập tin tạm)" + +#: 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." + +#: 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)." + +#: 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." + +#: src/main.c:2190 +#, c-format +msgid "Updating makefiles....\n" +msgstr "Cập nhật makefile…\n" + +#: 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" + +#: src/main.c:2303 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Gặp lỗi khi làm lại makefile “%s”." + +#: 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”." + +#: src/main.c:2328 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Không tìm thấy makefile “%s”" + +#: 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." + +#: src/main.c:2402 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Thực hiện lại[%u]:" + +#: src/main.c:2522 +msgid "unlink (temporary file): " +msgstr "unlink (bỏ liên kết tập tin tạm): " + +#: src/main.c:2555 +#, c-format +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL chứa nhiều đích" + +#: src/main.c:2579 +#, c-format +msgid "No targets" +msgstr "Không có đích" + +#: 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" + +#: 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." + +#: 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" + +#: src/main.c:2810 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Chương trình này đã được dịch cho %s\n" + +#: src/main.c:2812 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Chương trình này đã được dịch cho %s (%s)\n" + +#: src/main.c:2815 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Hãy thông báo lỗi cho \n" +"Hãy thông báo lỗi dịch cho .\n" + +#: 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" + +#: 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" + +#: src/main.c:3363 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sĐược biên dịch cho %s\n" + +#: src/main.c:3365 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sĐược biên dịch cho %s (%s)\n" + +#: src/main.c:3376 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \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 "" +"%sGiấy phép GPL pb3+: Giấy phép Công cộng GNU phiên bản 3 hay sau \n" +"%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" + +#: src/main.c:3397 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Cơ sở dữ liệu Make, in lúc %s" + +#: src/main.c:3407 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Hoàn tất cơ sở dữ liệu Make lúc %s\n" + +#: 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" + +#: src/misc.c:664 +msgid "Initialized access" +msgstr "Truy cập đã được khởi tạo" + +#: src/misc.c:743 +msgid "User access" +msgstr "Truy cập người dùng" + +#: src/misc.c:791 +msgid "Make access" +msgstr "Truy cập Make" + +#: src/misc.c:825 +msgid "Child access" +msgstr "Truy cập con" + +#: src/output.c:97 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Vào thư mục lạ\n" + +#: src/output.c:99 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Rời khỏi thư mục lạ\n" + +#: src/output.c:102 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Vào thư mục “%s”\n" + +#: src/output.c:104 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Rời thư mục “%s”\n" + +#: 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" + +#: 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" + +#: src/output.c:113 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Vào thư mục “%s”\n" + +#: 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" + +#: src/output.c:442 src/output.c:444 +#, c-format +msgid "write error: stdout" +msgstr "lỗi ghi: đầu ra tiêu chuẩn" + +#: src/output.c:624 +msgid ". Stop.\n" +msgstr ". Dừng.\n" + +# Variable: don't translate / Biến: đừng dịch +#: src/output.c:658 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +# Variable: do not translate/ biến: đừng dịch +#: 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[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" + +#: src/posixos.c:98 src/posixos.c:251 +msgid "duping jobs pipe" +msgstr "nhân bản ống dẫn công việc" + +#: src/posixos.c:104 +msgid "init jobserver pipe" +msgstr "khởi tạo đường ống “jobserver”" + +#: 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ệ" + +#: src/posixos.c:122 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Ứng dụng khách jobserver (fds %d,%d)\n" + +#: src/posixos.c:138 +msgid "jobserver pipeline" +msgstr "đường ống “jobserver”" + +#: src/posixos.c:186 +msgid "write jobserver" +msgstr "ghi lại trình phục vụ công việc" + +#: 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" + +#: src/posixos.c:319 src/posixos.c:433 +msgid "read jobs pipe" +msgstr "đọc ống dẫn công việc" + +#: src/read.c:181 +#, c-format +msgid "Reading makefiles...\n" +msgstr "Đang đọc makefile…\n" + +#: src/read.c:336 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Đang đọc makefile “%s”" + +#: src/read.c:338 +#, c-format +msgid " (no default goal)" +msgstr " (không có mục đích mặc định)" + +#: src/read.c:340 +#, c-format +msgid " (search path)" +msgstr " (đường dẫn tìm kiếm)" + +#: src/read.c:342 +#, c-format +msgid " (don't care)" +msgstr " (không quan tâm)" + +#: src/read.c:344 +#, c-format +msgid " (no ~ expansion)" +msgstr " (không nối thêm ~)" + +#: 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" + +#: 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" + +#: 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" + +#: src/read.c:960 +#, c-format +msgid "%s: failed to load" +msgstr "%s: gặp lỗi khi tải" + +#: 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" + +#: src/read.c:1035 +#, c-format +msgid "missing rule before recipe" +msgstr "thiếu quy tắc trước công thức" + +#: 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?)" + +#: src/read.c:1138 +#, c-format +msgid "missing separator" +msgstr "thiếu dấu phân cách" + +#: src/read.c:1283 +#, c-format +msgid "missing target pattern" +msgstr "thiếu mẫu đích" + +#: src/read.c:1285 +#, c-format +msgid "multiple target patterns" +msgstr "nhiều mẫu đích" + +#: src/read.c:1289 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "mẫu đích không chứa “%%”" + +#: src/read.c:1404 +#, c-format +msgid "missing 'endif'" +msgstr "thiếu chỉ thị “endif”" + +#: 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" + +#: 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”" + +#: src/read.c:1503 +#, c-format +msgid "missing 'endef', unterminated 'define'" +msgstr "thiếu “endef”, chỉ thị “define” chưa hoàn thiện" + +#: 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”" + +#: 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”" + +#: src/read.c:1604 +#, c-format +msgid "extraneous '%s'" +msgstr "gặp “%s” thừa" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/read.c:2052 +#, c-format +msgid "mixed implicit and normal rules" +msgstr "trộn quy tắc ngầm và thường" + +#: 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" + +#: 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 hạng mục : và ::" + +#: 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" + +#: 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”" + +#: 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”" + +#: 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" + +#: 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" + +#: src/remake.c:226 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Không cần làm gì cho “%s”." + +#: src/remake.c:227 +#, c-format +msgid "'%s' is up to date." +msgstr "“%s” đã cập nhật rồi." + +#: src/remake.c:323 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Xén bớt tập tin “%s”.\n" + +#: 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" + +#: 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" + +#: src/remake.c:425 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Coi tập tin đích “%s”.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:494 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Cảnh báo: tập tin .LOW_RESOLUTION_TIME “%s” có nhãn thời gian độ phân " +"giải cao" + +#: 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" + +#: 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" + +#: 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" + +#: 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." + +#: 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" + +#: 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" + +#: src/remake.c:694 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Chịu thua tập tin đích “%s”.\n" + +#: 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." + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:794 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Tạo “%s” do cờ “always-make”.\n" + +#: src/remake.c:802 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Không cần tạo lại đích “%s”." + +#: src/remake.c:804 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; dùng tên VPATH “%s”" + +#: src/remake.c:824 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Phải tạo lại đích “%s”.\n" + +#: src/remake.c:830 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Bỏ qua tên VPATH “%s”.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" + +#: src/remake.c:1047 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Dùng lệnh mặc định cho “%s”.\n" + +#: 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" + +#: 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" + +#: 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" + +#: 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" +"# Quy tắc ngầm" + +#: src/rule.c:545 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Không có quy tắc ngầm." + +#: src/rule.c:548 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u (%.1f%%) terminal." +msgstr "" +"\n" +"# %u quy tắc ngầm, %u (%.1f%%) đầu cuối." + +#: 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" + +#: src/signame.c:84 +msgid "unknown signal" +msgstr "tín hiệu lạ" + +#: src/signame.c:92 +msgid "Hangup" +msgstr "Treo" + +#: src/signame.c:95 +msgid "Interrupt" +msgstr "Ngắt" + +#: src/signame.c:98 +msgid "Quit" +msgstr "Thoát" + +#: src/signame.c:101 +msgid "Illegal Instruction" +msgstr "Chỉ lệnh không hợp lệ" + +#: src/signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Bẫy vết/điểm ngắt" + +#: src/signame.c:109 +msgid "Aborted" +msgstr "Bị hủy bỏ" + +#: src/signame.c:112 +msgid "IOT trap" +msgstr "Bẫy IOT" + +#: src/signame.c:115 +msgid "EMT trap" +msgstr "Bẫy EMT" + +#: src/signame.c:118 +msgid "Floating point exception" +msgstr "Ngoại lệ dấu chấm động" + +#: src/signame.c:121 +msgid "Killed" +msgstr "Bị buộc kết thúc" + +#: src/signame.c:124 +msgid "Bus error" +msgstr "Lỗi bus" + +#: src/signame.c:127 +msgid "Segmentation fault" +msgstr "Lỗi phân đoạn" + +#: src/signame.c:130 +msgid "Bad system call" +msgstr "Lệnh gọi hệ thống sai" + +#: src/signame.c:133 +msgid "Broken pipe" +msgstr "Ống dẫn hỏng" + +#: src/signame.c:136 +msgid "Alarm clock" +msgstr "Đồng hồ báo động" + +#: src/signame.c:139 +msgid "Terminated" +msgstr "Đã chấm dứt" + +#: src/signame.c:142 +msgid "User defined signal 1" +msgstr "Tín hiệu tự định nghĩa 1" + +#: src/signame.c:145 +msgid "User defined signal 2" +msgstr "Tín hiệu tự định nghĩa 2" + +#: src/signame.c:150 src/signame.c:153 +msgid "Child exited" +msgstr "Tiến trình con đã thoát" + +#: src/signame.c:156 +msgid "Power failure" +msgstr "Mất điện đột ngột" + +#: src/signame.c:159 +msgid "Stopped" +msgstr "Bị ngừng" + +#: src/signame.c:162 +msgid "Stopped (tty input)" +msgstr "Bị ngừng (đầu vào tty)" + +#: src/signame.c:165 +msgid "Stopped (tty output)" +msgstr "Bị ngừng (đầu ra tty)" + +#: src/signame.c:168 +msgid "Stopped (signal)" +msgstr "Bị ngừng (tín hiệu)" + +#: src/signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Vượt giới hạn thời gian CPU" + +#: src/signame.c:174 +msgid "File size limit exceeded" +msgstr "Vượt giới hạn kích cỡ tập tin" + +#: src/signame.c:177 +msgid "Virtual timer expired" +msgstr "Bộ đếm thời gian ảo đã hết hạn" + +#: 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" + +#: src/signame.c:186 +msgid "Window changed" +msgstr "Cửa sổ bị thay đổi" + +#: src/signame.c:189 +msgid "Continued" +msgstr "Đã tiếp tục" + +#: src/signame.c:192 +msgid "Urgent I/O condition" +msgstr "Điều kiện I/O khẩn cấp" + +#: 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 +#: src/signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +# Literal: don't translate / Nghĩa chữ: đừng dịch +#: src/signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: src/signame.c:211 +msgid "Resource lost" +msgstr "Tài nguyên bị mất" + +#: src/signame.c:214 +msgid "Danger signal" +msgstr "Tín hiệu nguy hiểm" + +#: src/signame.c:217 +msgid "Information request" +msgstr "Yêu cầu thông tin" + +#: 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" + +#: src/strcache.c:274 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Không có bộ đệm 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 bộ đệm strcache: %lu (%lu) / chuỗi = %lu / lưu = %lu B / t.bình = " +"%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 đệm hiện tại: kcỡ = %hu B / đã dùng = %hu B / slượng = %hu / tbình = %u " +"B\n" + +#: 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" + +#: 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 trống khác: tổng = %lu B / tđa = %lu B / t.thiểu = %lu B / t.bình = %hu " +"B\n" + +#: src/strcache.c:326 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s hiệu năng strcache: tra cứu = %lu / tỷ lệ trúng = %lu%%\n" + +#: src/strcache.c:328 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# thống kê bảng băm tập tin:\n" +"# " + +#: src/variable.c:1653 +msgid "automatic" +msgstr "tự động" + +#: src/variable.c:1656 +msgid "default" +msgstr "mặc định" + +#: src/variable.c:1659 +msgid "environment" +msgstr "môi trường" + +#: src/variable.c:1662 +msgid "makefile" +msgstr "makefile" + +#: src/variable.c:1665 +msgid "environment under -e" +msgstr "môi trường với -e" + +#: src/variable.c:1668 +msgid "command line" +msgstr "dòng lệnh" + +#: src/variable.c:1671 +msgid "'override' directive" +msgstr "chỉ thị “override”" + +#: src/variable.c:1682 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (từ “%s”, dòng %lu)" + +#: src/variable.c:1745 +msgid "# variable set hash-table stats:\n" +msgstr "# thống kê bảng băm biến được đặt:\n" + +#: src/variable.c:1756 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Biến\n" + +#: src/variable.c:1760 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Giá trị biến đặc tả cho mẫu" + +#: 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." + +#: src/variable.c:1776 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u giá trị biến đặc tả cho mẫu" + +#: 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" + +#: src/vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() gặp lỗi với %d\n" + +#: 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" + +#: 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 "Nối thêm đầu ra vào %s\n" + +#: src/vmsjobs.c:1309 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Nối thêm %.*s và dọn dẹp\n" + +#: src/vmsjobs.c:1322 +#, c-format +msgid "Executing %s instead\n" +msgstr "Thực hiện %s để thay thế\n" + +#: src/vpath.c:603 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Đường dẫn tìm kiếm VPATH\n" + +#: src/vpath.c:620 +msgid "# No 'vpath' search paths." +msgstr "# Không có đường dẫn tìm kiếm “vpath”." + +#: src/vpath.c:622 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u đường dẫn tìm kiếm “vpath”.\n" + +#: src/vpath.c:625 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Không có đường dẫn tìm kiếm chung (biến “VPATH”)." + +#: src/vpath.c:631 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Đường dẫn tìm kiếm chung (biến “VPATH”):\n" +"# " + +#: 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" + +#: 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)" + +#: 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)" + +#: 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" + +#: 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)" + +#: 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" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] Lỗi 0x%x%s" + +# Variable: don't translate / Biến: đừng dịch +#~ msgid "%s[%s] %s%s%s" +#~ msgstr "%s[%s] %s%s%s" + +#~ msgid "dup jobserver" +#~ msgstr "dup jobserver" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "Cảnh báo: Chuyển hướng trống rỗng\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "lỗi nội bộ: command_state “%s”" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "BUILTIN [%s][%s]\n" + +#~ msgid "BUILTIN ECHO %s->%s\n" +#~ msgstr "BUILTIN ECHO %s->%s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "Không hiểu lệnh dựng sẵn “%s”\n" + +#~ msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +#~ msgstr "" +#~ "Lệnh dựng sẵn là chưa biết hoặc không được hỗ trợ trong .ONESHELL: “%s”\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "Lỗi, lệnh trống rỗng\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "Đã chuyển hướng đầu vào từ %s\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "Đã chuyển hướng lỗi tới %s\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "Đã chuyển hướng đầu ra tới %s\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "Gặp lỗi sản sinh tiến trình, %d\n" + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "lỗi nội bộ: có nhiều tùy chọn --sync-mutex" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "lỗi nội bộ: có nhiều tùy chọn --jobserver-fds" + +#~ msgid "virtual memory exhausted" +#~ msgstr "hết bộ nhớ ảo" + +#~ msgid "write error" +#~ msgstr "lỗi ghi" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BUILTIN RM %s\n" + +#~ msgid "# Invalid value in 'update_status' member!" +#~ msgstr "# Gặp giá trị sai trong thành phần “update_status”!" + +#~ msgid "unknown trace mode '%s'" +#~ msgstr "không hiểu chế độ theo vết “%s”" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Lỗi 0x%x (bỏ qua)" + +#~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +#~ msgstr "Gọi công thức từ %s:%lu để cập nhật đích “%s”.\n" + +#~ msgid "Invoking builtin recipe to update target `%s'.\n" +#~ msgstr "Gọi công thức dựng sẵn để cập nhật đích “%s”.\n" + +#~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +#~ msgstr "%s # vùng đệm strcache: %d (* %d B/buffer = %d B)\n" + +#~ msgid "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# thống kê bảng băm strcache:\n" +#~ "# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "" +#~ "Việc process_easy() (tiến trình dễ) bị lỗi khi cố khởi chạy tiến trình (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 "" +#~ "%sPhần mềm này tự do; hãy xem mã nguồn để tìm thấy điều kiện sao chép.\n" +#~ "%sKhông bảo đảm gì cả, dù khả năng bán hay khả năng làm việc dứt khoát.\n" +#~ "%s\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "gặp “endef” bắt nguồn ở ngoài" + +#~ msgid "empty `override' directive" +#~ msgstr "chỉ thị “override” (đè) rỗng" + +#~ msgid "invalid `override' directive" +#~ msgstr "chỉ thị “override” (đè) không hợp lệ" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "* cảnh báo, CTRL-Y sẽ để một số tiến trình con còn lại.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Đừng ghi rõ “-j” hay “--jobs” nếu không sẵn sàng." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Đang đặt lại trình make cho chế độ công việc đơn." diff --git a/third_party/make/po/zh_CN.gmo b/third_party/make/po/zh_CN.gmo new file mode 100644 index 0000000000000000000000000000000000000000..233ca38448a8062d13e883d8719553d368c28e5c GIT binary patch literal 42126 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

    V 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 literal 0 HcmV?d00001 diff --git a/third_party/make/po/zh_CN.po b/third_party/make/po/zh_CN.po new file mode 100644 index 00000000000..2d15ff498ed --- /dev/null +++ b/third_party/make/po/zh_CN.po @@ -0,0 +1,2430 @@ +# Make in zh_CN. +# Copyright (C) 2002 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Wang Li , 2002. +# LI Daobing , 2008, 2013. +# Mingye Wang , 2015, 2016. +# Boyuan Yang <073plan@gmail.com>, 2018, 2019. +# +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-05 15:27-0500\n" +"Last-Translator: Boyuan Yang <073plan@gmail.com>\n" +"Language-Team: Chinese (simplified) \n" +"Language: zh_CN\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: Poedit 2.2.4\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 "" +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 \n" +msgstr "报告错误到 \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 \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 版或更新版本。\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 "正在读入 makefiles...\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 "%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' 的命令配方失败" + +#~ msgid "%s[%s] Error 0x%x%s" +#~ msgstr "%s[%s] 错误 0x%x%s" + +#~ msgid "%s[%s] %s%s%s" +#~ msgstr "%s[%s] %s%s%s" + +#~ msgid "dup jobserver" +#~ msgstr "复制任务服务器" + +#~ msgid "Warning: Empty redirection\n" +#~ msgstr "警告:空的重定向\n" + +#~ msgid "internal error: '%s' command_state" +#~ msgstr "内部错误:“%s”command_state" + +#~ msgid "BUILTIN [%s][%s]\n" +#~ msgstr "BUILTIN [%s][%s]\n" + +#~ msgid "BUILTIN ECHO %s->%s\n" +#~ msgstr "BUILTIN ECHO %s->%s\n" + +#~ msgid "Unknown builtin command '%s'\n" +#~ msgstr "未知的内置命令“%s”\n" + +#~ msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +#~ msgstr "内置命令在 .ONESHELL 内未知或不受支持:“%s”\n" + +#~ msgid "Error, empty command\n" +#~ msgstr "错误,空命令\n" + +#~ msgid "Redirected input from %s\n" +#~ msgstr "来自 %s 的重定向输入\n" + +#~ msgid "Redirected error to %s\n" +#~ msgstr "到 %s 的重定向错误输出\n" + +#~ msgid "Redirected output to %s\n" +#~ msgstr "到 %s 的重定向输出\n" + +#~ msgid "Error spawning, %d\n" +#~ msgstr "错误产生,%d\n" + +#, fuzzy +#~ msgid "# Invalid value in 'update_status' member!" +#~ msgstr "# “update_status”成员中无效的值!" + +#, fuzzy +#~ msgid "unknown trace mode '%s'" +#~ msgstr "未知的内置命令“%s”\n" + +#, fuzzy +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "内部错误:多个 --jobserver-fds 选项" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "内部错误:多个 --jobserver-fds 选项" + +#~ msgid "virtual memory exhausted" +#~ msgstr "虚拟内存耗尽" + +#~ msgid "write error" +#~ msgstr "写错误" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BUILTIN RM %s\n" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] 错误 0x%x (忽略)" + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() 启动进程失败 (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 "" +#~ "%s该程序为自由软件,详情可参阅版权条款。在法律允许的范围内\n" +#~ "%s我们不作任何担保,这包含但不限于任何商业适售性以及针对特\n" +#~ "%s定目的的适用性的担保。\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "多于的“endef”" + +#~ msgid "empty `override' directive" +#~ msgstr "空“override”指令" + +#~ msgid "invalid `override' directive" +#~ msgstr "无效的“override”指令" + +#~ msgid "" +#~ "\n" +#~ "%s # of strings in strcache: %d\n" +#~ msgstr "" +#~ "\n" +#~ "%s strcache 中的字符串数量: %d\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-警告, CTRL-Y 将利刀子进程环境。\n" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# 无文件。" + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# 有 %u 个文件存储在 %u 个杂凑单元中。\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# 每个单元平均含有 %.3f 个文件,一个单元最多含有 %u 个文件。\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "语法错误,仍然在“\"”之中\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "收到 SIGCHLD 信号;尚有 %u 个子进程存在。\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DIRECTORY" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "在做任何事之前转移到 DIRECTORY 中" + +#~ msgid "FLAGS" +#~ msgstr "标志" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "挂起进程以便调试器进行连接" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "环境变量覆盖 makefile" + +#~ msgid "FILE" +#~ msgstr "FILE" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "将 FILE 作为 makefile 读入" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "在 DIRECTORY 中搜索引入的 makefile" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "除非负载低于 N 否则就不启动多个任务" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "不会实际运行任何命令;只是打印它们" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "将 FILE 认定为过于陈旧而不重现创建它" + +#~ msgid "Don't echo commands" +#~ msgstr "不要回显命令" + +#~ msgid "Turns off -k" +#~ msgstr "关闭 -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "将 FILE 看做无限新" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "如果 sh.exe 不可用,就不要给出 -j 或 --jobs。" + +#~ msgid "Resetting make for single job mode." +#~ msgstr "将 make 重置为单任务模式。" + +#~ msgid "Entering" +#~ msgstr "正在进入" + +#~ msgid "Leaving" +#~ msgstr "正在离开" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "“%sinclude” 没有文件名" + +#~ msgid "# No variables." +#~ msgstr "# 没有变量。" + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# 每个杂凑单元平均存储 %.1f 个变量,一个单元最多存储 %u 个。\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# 每个杂凑单元平均存储 %d.%d 个变量,一个单元最多存储 %u 个。\n" diff --git a/third_party/make/po/zh_TW.gmo b/third_party/make/po/zh_TW.gmo new file mode 100644 index 0000000000000000000000000000000000000000..bf951d3d229155f148ee822e44342a8381a402b9 GIT binary patch literal 42268 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, 2002. +# LI Daobing , 2008, 2013. +# Mingye Wang , 2015, 2016. +# Y.C Cheng , 2017. +# Boyuan Yang <073plan@gmail.com>, 2018, 2019. +# pan93412 , 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 \n" +"Language-Team: Chinese (traditional) \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 "" +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 \n" +msgstr "報告錯誤到 \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 \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 版或更新版本。\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/third_party/make/src/amiga.c b/third_party/make/src/amiga.c new file mode 100644 index 00000000000..5189a022a2b --- /dev/null +++ b/third_party/make/src/amiga.c @@ -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 . */ + +#include "makeint.h" +#include "variable.h" +#include "amiga.h" +#include +#include +#include +#include +#include + +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/third_party/make/src/amiga.h b/third_party/make/src/amiga.h new file mode 100644 index 00000000000..5bc35318f82 --- /dev/null +++ b/third_party/make/src/amiga.h @@ -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 . */ + +int MyExecute (char ** argv); +char * wildcard_expansion (char * wc, char * o); diff --git a/third_party/make/src/ar.c b/third_party/make/src/ar.c new file mode 100644 index 00000000000..62919ff398e --- /dev/null +++ b/third_party/make/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 . */ + +#include "makeint.h" + +#ifndef NO_ARCHIVES + +#include "filedef.h" +#include "dep.h" +#include + +/* 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; +} + + +/* 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); +} + +/* 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 */ + +/* 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/third_party/make/src/arscan.c b/third_party/make/src/arscan.c new file mode 100644 index 00000000000..3ce21db8d16 --- /dev/null +++ b/third_party/make/src/arscan.c @@ -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 . */ + +#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 +#else +#include +#endif + +#ifndef NO_ARCHIVES + +#ifdef VMS +#include +#include +#include +#include +#include +#include +#include +#include + +/* 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 +#include + +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 , 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 +# else + /* These platforms don't have but have archives in the same format + * as many other Unices. This was taken from GNU binutils for BeOS. + */ +# define ARMAG "!\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 ) + */ +# include +# include +# include +# 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 apparently defines this. */ +#ifndef AR_HDR_SIZE +# define AR_HDR_SIZE (sizeof (struct ar_hdr)) +#endif + +#include "output.h" + +/* 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 */ + +/* 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 */ +} + +#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 + +#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/third_party/make/src/commands.c b/third_party/make/src/commands.c new file mode 100644 index 00000000000..88c33a324f3 --- /dev/null +++ b/third_party/make/src/commands.c @@ -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 . */ + +#include "makeint.h" +#include "filedef.h" +#include "dep.h" +#include "variable.h" +#include "job.h" +#include "commands.h" +#ifdef WINDOWS32 +#include +#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 + + +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 +} + +/* 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; + } +} + +/* 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); +} + +/* 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__ */ +} + +/* 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; +} + +/* 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/third_party/make/src/commands.h b/third_party/make/src/commands.h new file mode 100644 index 00000000000..d86752c8b53 --- /dev/null +++ b/third_party/make/src/commands.h @@ -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 . */ + +/* 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/third_party/make/src/config.ami b/third_party/make/src/config.ami new file mode 100644 index 00000000000..d7f637d1faa --- /dev/null +++ b/third_party/make/src/config.ami @@ -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 . */ + +/* 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 . */ +/* #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 doesn't define. */ +#define uintmax_t unsigned long + +/* Define to 'int' if doesn't define. */ +#define gid_t int + +/* Define if you have alloca, as a function or macro. */ +/* #undef HAVE_ALLOCA */ + +/* Define if you have 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 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 . */ +#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 . */ +/* #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 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 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 . */ +/* #undef SYS_SIGLIST_DECLARED */ + +/* Define to 'int' if doesn't define. */ +#define uid_t int + +/* Define for Encore UMAX. */ +/* #undef UMAX */ + +/* Define for Encore UMAX 4.3 that has + instead of . */ +/* #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' 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 . */ +/* #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 header file. */ +#define HAVE_DIRENT_H 1 + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_MACH_MACH_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_MEMORY_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_NDIR_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_STDLIB_H */ + +/* Define if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_DIR_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_PARAM_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_TIMEB_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_WAIT_H */ + +/* Define if you have the 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 does not define. */ +#define ssize_t int diff --git a/third_party/make/src/config.h-vms b/third_party/make/src/config.h-vms new file mode 100644 index 00000000000..e2284a324c3 --- /dev/null +++ b/third_party/make/src/config.h-vms @@ -0,0 +1,433 @@ +/* config.h-vms. Generated by hand by Klaus Kmpf -*-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 . */ + +/* 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 +#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 . */ +/* #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 doesn't define. */ +#define uintmax_t unsigned long + +/* Define to 'int' if 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 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 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 . */ +#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 . */ +/* #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 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 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 . */ +/* #undef SYS_SIGLIST_DECLARED */ + +/* Define to 'int' if 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 + instead of . */ +/* #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' 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 . */ +/* #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 header file. */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file. */ +#ifdef __DECC +#define HAVE_FCNTL_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACH_MACH_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MEMORY_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PARAM_H */ + +/* Define to 1 if you have the header file. */ +#ifndef __GNUC__ +#define HAVE_SYS_TIMEB_H 1 +#endif + +/* Define to 1 if you have the 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 +#include +#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/third_party/make/src/config.h.W32 b/third_party/make/src/config.h.W32 new file mode 100644 index 00000000000..be2a33e0392 --- /dev/null +++ b/third_party/make/src/config.h.W32 @@ -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 . */ + +/* 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 . */ +/* #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 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 header file, and it defines 'DIR'. + */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the 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 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 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 header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the 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 header file. */ +/* #undef HAVE_MACH_MACH_H */ + +/* Define to 1 if you have the 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 header file, and it defines 'DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the 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 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 header file. */ +#ifdef __MINGW32__ +#define HAVE_STDINT_H 1 +#endif + +/* Define to 1 if you have the 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 header file. */ +#ifdef __MINGW32__ +#define HAVE_STRINGS_H 1 +#endif + +/* Define to 1 if you have the 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 header file, and it defines 'DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file, and it defines 'DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#ifdef __MINGW32__ +#define HAVE_SYS_PARAM_H 1 +#endif + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_RESOURCE_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIMEB_H 1 + +/* Define to 1 if you have the header file. */ +#ifdef __MINGW32__ +#define HAVE_SYS_TIME_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_WAIT_H */ + +/* Define to 1 if you have the \'union wait' type in . */ +/* #undef HAVE_UNION_WAIT */ + +/* Define to 1 if you have the 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' 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 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 and . */ +#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 instead of + . */ +/* #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 + +/* Define to 'int' if doesn't define. */ +#define gid_t int + +/* Define to 'int' if 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 does not define. */ +#define ssize_t int + +/* Define to 'int' if doesn't define. */ +#define uid_t int + +/* Define uintmax_t if not defined in or . */ +#if !HAVE_STDINT_H && !HAVE_INTTYPES_H +#define uintmax_t unsigned long +#endif + +/* Define if you have 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/third_party/make/src/config.h.in b/third_party/make/src/config.h.in new file mode 100644 index 00000000000..4757a50c4cb --- /dev/null +++ b/third_party/make/src/config.h.in @@ -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 . */ +#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 , a header that + may be supplied by this distribution. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have 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 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 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 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 header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the 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 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 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 header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the 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 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 header file. */ +#undef HAVE_SPAWN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the 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 header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the 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 header file. */ +#undef HAVE_SYS_BITYPES_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_FILE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_LOADAVG_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIMEB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the 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 . */ +#undef HAVE_UNION_WAIT + +/* Define to 1 if you have the 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 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 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 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' 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 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 and . */ +#undef TIME_WITH_SYS_TIME + +/* Define to 1 for Encore UMAX. */ +#undef UMAX + +/* Define to 1 for Encore UMAX 4.3 that has instead of + . */ +#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 predates C++11. */ +#undef __STDC_CONSTANT_MACROS + +/* Define to 1 if the system 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 + + 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 + . + + 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 . 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 . + 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 + and + . */ +#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 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 does not define. */ +#undef mode_t + +/* Define to `long int' if does not define. */ +#undef off_t + +/* Define to `int' if 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 does not define. */ +#undef size_t + +/* Define to `int' if does not define. */ +#undef ssize_t + +/* Define to `int' if doesn't define. */ +#undef uid_t + +/* Define to the widest unsigned integer type if and + 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/third_party/make/src/configh.dos b/third_party/make/src/configh.dos new file mode 100644 index 00000000000..38c8bde92c1 --- /dev/null +++ b/third_party/make/src/configh.dos @@ -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 . */ + +/* Include this header to make __DJGPP_MINOR__ available because DJGPP ports + of GCC 4.3.0 and later no longer do it automatically. */ +#include + +/* Many things are defined already by a system header. */ +#include + +#if __DJGPP__ > 2 || __DJGPP_MINOR__ > 1 + +/* Define to 1 if 'sys_siglist' is declared by or . */ +# 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 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 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 does not define. */ +#define ssize_t int diff --git a/third_party/make/src/debug.h b/third_party/make/src/debug.h new file mode 100644 index 00000000000..514b7e8e29b --- /dev/null +++ b/third_party/make/src/debug.h @@ -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 . */ + +#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/third_party/make/src/default.c b/third_party/make/src/default.c new file mode 100644 index 00000000000..751ea154e54 --- /dev/null +++ b/third_party/make/src/default.c @@ -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 . */ + +#include "makeint.h" + +#include + +#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 + }; + +/* 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/third_party/make/src/dep.h b/third_party/make/src/dep.h new file mode 100644 index 00000000000..76718f002c0 --- /dev/null +++ b/third_party/make/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 . */ + + +/* 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/third_party/make/src/dir.c b/third_party/make/src/dir.c new file mode 100644 index 00000000000..862a18ead91 --- /dev/null +++ b/third_party/make/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 . */ + +#include "makeint.h" +#include "hash.h" +#include "filedef.h" +#include "dep.h" + +#ifdef HAVE_DIRENT_H +# include +# 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 +# endif +# ifdef HAVE_SYS_DIR_H +# include +# endif +# ifdef HAVE_NDIR_H +# include +# endif +# ifdef HAVE_VMSDIR_H +# include "vmsdir.h" +# endif /* HAVE_VMSDIR_H */ +#endif + +/* In GNU systems, 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 */ + +#ifdef __MSDOS__ +#include +#include + +/* 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 +#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 */ + +/* 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 + +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; +} + +/* 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); +} + +/* 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); +} + +/* 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); +} + +/* 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; +} + +/* 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; +} + +/* 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); +} + +/* 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/third_party/make/src/expand.c b/third_party/make/src/expand.c new file mode 100644 index 00000000000..0b6bb255f4b --- /dev/null +++ b/third_party/make/src/expand.c @@ -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 . */ + +#include "makeint.h" + +#include + +#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; +} + +/* 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; +} + +/* 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); +} + +/* 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); +} + +/* 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; +} + +/* 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; +} + +/* 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/third_party/make/src/file.c b/third_party/make/src/file.c new file mode 100644 index 00000000000..a979ca550e8 --- /dev/null +++ b/third_party/make/src/file.c @@ -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 . */ + +#include "makeint.h" + +#include + +#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; +} + +/* 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; + } +} + +/* 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); + } +} + +/* 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 +} + +/* 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; +} + +/* 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; +} + +/* 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, ×pec) == 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'; +} + +/* 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); +} + +/* 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/third_party/make/src/filedef.h b/third_party/make/src/filedef.h new file mode 100644 index 00000000000..972f85331c4 --- /dev/null +++ b/third_party/make/src/filedef.h @@ -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 . */ + + +/* 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/third_party/make/src/function.c b/third_party/make/src/function.c new file mode 100644 index 00000000000..0917e0cd21b --- /dev/null +++ b/third_party/make/src/function.c @@ -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 . */ + +#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; + + +/* 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; +} + + +/* 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); +} + + +/* 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); +} + + +/* 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)); +} + + +/* 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; +} + + +/* 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; +} + +/* + 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 ) + + 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 +#include +#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 +#include + + 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 + + +#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)) + + +/* 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; +} + + +/* 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/third_party/make/src/getopt.c b/third_party/make/src/getopt.c new file mode 100644 index 00000000000..35e71ef8cfc --- /dev/null +++ b/third_party/make/src/getopt.c @@ -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 . */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include + +/* 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 +# 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 +# include +#endif /* GNU C library. */ + +#ifdef VMS +# include +# if HAVE_STRING_H - 0 +# include +# 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; + +#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 +# define my_index strchr +#else + +# if HAVE_STRING_H +# include +# else +# include +# 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__ */ + +/* 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; +} + +/* 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. */ + +#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/third_party/make/src/getopt.h b/third_party/make/src/getopt.h new file mode 100644 index 00000000000..abfc31e70da --- /dev/null +++ b/third_party/make/src/getopt.h @@ -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 . */ + +#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/third_party/make/src/getopt1.c b/third_party/make/src/getopt1.c new file mode 100644 index 00000000000..0bef6b03cc0 --- /dev/null +++ b/third_party/make/src/getopt1.c @@ -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 . */ + +#ifdef HAVE_CONFIG_H +#include +#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 + +/* 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 +#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 +#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. */ + +#ifdef TEST + +#include + +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/third_party/make/src/gettext.h b/third_party/make/src/gettext.h new file mode 100644 index 00000000000..8647b370470 --- /dev/null +++ b/third_party/make/src/gettext.h @@ -0,0 +1,57 @@ +/* Convenience header for conditional use of GNU . +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 . */ + +#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 + +#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/third_party/make/src/gmk-default.h b/third_party/make/src/gmk-default.h new file mode 100644 index 00000000000..9fa09a6e7c9 --- /dev/null +++ b/third_party/make/src/gmk-default.h @@ -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/third_party/make/src/gmk-default.scm b/third_party/make/src/gmk-default.scm new file mode 100644 index 00000000000..ffcea6bd80a --- /dev/null +++ b/third_party/make/src/gmk-default.scm @@ -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 . + +(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/third_party/make/src/gnumake.h b/third_party/make/src/gnumake.h new file mode 100644 index 00000000000..fe0f7f3094a --- /dev/null +++ b/third_party/make/src/gnumake.h @@ -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 . */ + +#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/third_party/make/src/guile.c b/third_party/make/src/guile.c new file mode 100644 index 00000000000..52f0e5cbb89 --- /dev/null +++ b/third_party/make/src/guile.c @@ -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 . */ + +#include "makeint.h" + +#ifdef HAVE_GUILE + +#include "gnumake.h" + +#include "debug.h" +#include "filedef.h" +#include "dep.h" +#include "variable.h" + +#include + +/* 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/third_party/make/src/hash.c b/third_party/make/src/hash.c new file mode 100644 index 00000000000..004097d0aa2 --- /dev/null +++ b/third_party/make/src/hash.c @@ -0,0 +1,495 @@ +/* hash.c -- hash table maintenance +Copyright (C) 1995, 1999, 2002, 2010 Free Software Foundation, Inc. +Written by Greg McGary + +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 . */ + +#include "makeint.h" +#include "hash.h" +#include + +#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/third_party/make/src/hash.h b/third_party/make/src/hash.h new file mode 100644 index 00000000000..667d6508267 --- /dev/null +++ b/third_party/make/src/hash.h @@ -0,0 +1,234 @@ +/* hash.h -- decls for hash table +Copyright (C) 1995, 1999, 2002, 2010 Free Software Foundation, Inc. +Written by Greg McGary + +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 . */ + +#ifndef _hash_h_ +#define _hash_h_ + +#include +#include + +#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) + + +/* 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/third_party/make/src/implicit.c b/third_party/make/src/implicit.c new file mode 100644 index 00000000000..b281a1777f1 --- /dev/null +++ b/third_party/make/src/implicit.c @@ -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 . */ + +#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); + +/* 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; +} + + +/* 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/third_party/make/src/job.c b/third_party/make/src/job.c new file mode 100644 index 00000000000..ae1f18b9b8a --- /dev/null +++ b/third_party/make/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 . */ + +#include "makeint.h" + +#include +#include + +#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 /* for strcasecmp, strncasecmp */ +# endif +# include + +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 +# include +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 +static int execute_by_shell; +static int dos_pid = 123; +int dos_status; +int dos_command_running; +#endif /* __MSDOS__ */ + +#ifdef _AMIGA +# include +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 +# endif +# include +# include +static void vmsWaitForChildren (int *); +#endif + +#ifdef WINDOWS32 +# include +# include +# include +# include "sub_proc.h" +# include "w32err.h" +# include "pathstuff.h" +# define WAIT_NOHANG 1 +#endif /* WINDOWS32 */ + +#ifdef __EMX__ +# include +#endif + +#if defined (HAVE_SYS_WAIT_H) || defined (HAVE_UNION_WAIT) +# include +#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 +# 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 *); + +/* 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; + + +#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 + +/* 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 = _(""); + 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 (); +} + + +/* 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; +} + +/* 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); +} + + +/* 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 = _(""); + 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; +} + +/* 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 : 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 , + 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> / + 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; +} + +#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 */ + +#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 */ + +#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; +} + +#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/third_party/make/src/job.h b/third_party/make/src/job.h new file mode 100644 index 00000000000..ee290fb4aea --- /dev/null +++ b/third_party/make/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 . */ + +#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/third_party/make/src/load.c b/third_party/make/src/load.c new file mode 100644 index 00000000000..27f5899f820 --- /dev/null +++ b/third_party/make/src/load.c @@ -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 . */ + +#include "makeint.h" + +#if MAKE_LOAD + +#include +#include +#include +#include +#include + +#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/third_party/make/src/loadapi.c b/third_party/make/src/loadapi.c new file mode 100644 index 00000000000..4914b2d919c --- /dev/null +++ b/third_party/make/src/loadapi.c @@ -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 . */ + +#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/third_party/make/src/main.c b/third_party/make/src/main.c new file mode 100644 index 00000000000..78a27d7130e --- /dev/null +++ b/third_party/make/src/main.c @@ -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 . */ + +#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 +#ifdef _AMIGA +# include +# include +#endif +#ifdef WINDOWS32 +# include +# include +#ifdef HAVE_STRINGS_H +# include /* for strcasecmp */ +#endif +# include "pathstuff.h" +# include "sub_proc.h" +# include "w32err.h" +#endif +#ifdef __EMX__ +# include +# include +#endif +#ifdef HAVE_FCNTL_H +# include +#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); + + +/* 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'; + + +/* 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; + +/* 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; + + +/* 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); +} + +/* 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 \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); +} + +/* 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); +} + +/* 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 \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 (); + } +} + +/* 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/third_party/make/src/makeint.h b/third_party/make/src/makeint.h new file mode 100644 index 00000000000..c428a362a4c --- /dev/null +++ b/third_party/make/src/makeint.h @@ -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 . */ + +/* We use 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 +#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 +#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 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 +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_TIMEB_H +/* SCO 3.2 "devsys 4.2" has a prototype for 'ftime' in that bombs + unless has been included first. */ +# include +#endif +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include + +#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 +/* 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 +#endif + +#ifdef HAVE_LIMITS_H +# include +#endif +#ifdef HAVE_SYS_PARAM_H +# include +#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 +# include +# include +# include +# include +/* Needed to use alloca on VMS. */ +# include + +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 +# include +# define ANSI_STRING 1 +#else /* No standard headers. */ +# ifdef HAVE_STRING_H +# include +# define ANSI_STRING 1 +# else +# include +# endif +# ifdef HAVE_MEMORY_H +# include +# endif +# ifdef HAVE_STDLIB_H +# include +# 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 . */ +#undef strerror +#if !defined(__DECC) +char *strerror (int errnum); +#endif + +#endif /* !ANSI_STRING. */ +#undef ANSI_STRING + +#if HAVE_INTTYPES_H +# include +#endif +#if HAVE_STDINT_H +# include +#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 +#else +# define setlocale(category, locale) +#endif + +#include + +#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 +#endif + +#ifdef WINDOWS32 +# include +# include +# 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 +extern struct rlimit stack_limit; +#endif + +#include + +#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 + + + +/* 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 +#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/third_party/make/src/misc.c b/third_party/make/src/misc.c new file mode 100644 index 00000000000..de19e37547c --- /dev/null +++ b/third_party/make/src/misc.c @@ -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 . */ + +#include "makeint.h" +#include "filedef.h" +#include "dep.h" +#include "debug.h" + +/* GNU make no longer supports pre-ANSI89 environments. */ + +#include + +#ifdef WINDOWS32 +# include +# include +#endif + +#ifdef HAVE_FCNTL_H +# include +#else +# include +#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); +} + +/* 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); +} + +/* Print N spaces (used in debug for target-depth). */ + +void +print_spaces (unsigned int n) +{ + while (n-- > 0) + putchar (' '); +} + + +/* 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; +} + +/* 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 + + + +/* 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; +} + +/* 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; +} + +/* 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); +} + + +/* 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); + } +} + + +#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 + + + +/* 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; +} + + +#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 + +#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 . */ + +/* 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/third_party/make/src/os.h b/third_party/make/src/os.h new file mode 100644 index 00000000000..e7bf37a5c97 --- /dev/null +++ b/third_party/make/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 . */ + + +/* 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/third_party/make/src/output.c b/third_party/make/src/output.c new file mode 100644 index 00000000000..221174963d7 --- /dev/null +++ b/third_party/make/src/output.c @@ -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 . */ + +#include "makeint.h" +#include "os.h" +#include "output.h" + +/* GNU make no longer supports pre-ANSI89 environments. */ + +#include +#include +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifdef HAVE_FCNTL_H +# include +#else +# include +#endif + +#ifdef WINDOWS32 +# include +# include +# 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); + } +} + +/* 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 +} + + +#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 */ + + +/* 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); + } +} + + +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); +} + + +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/third_party/make/src/output.h b/third_party/make/src/output.h new file mode 100644 index 00000000000..a5065058ccd --- /dev/null +++ b/third_party/make/src/output.h @@ -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 . */ + +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 +#elif defined(HAVE_SYS_FILE_H) +# include +#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/third_party/make/src/posixos.c b/third_party/make/src/posixos.c new file mode 100644 index 00000000000..525f292c99c --- /dev/null +++ b/third_party/make/src/posixos.c @@ -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 . */ + +#include "makeint.h" + +#include + +#ifdef HAVE_FCNTL_H +# include +#elif defined(HAVE_SYS_FILE_H) +# include +#endif + +#if defined(HAVE_PSELECT) && defined(HAVE_SYS_SELECT_H) +# include +#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/third_party/make/src/read.c b/third_party/make/src/read.c new file mode 100644 index 00000000000..fa197fb80a2 --- /dev/null +++ b/third_party/make/src/read.c @@ -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 . */ + +#include "makeint.h" + +#include + +#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 +#include "sub_proc.h" +#else /* !WINDOWS32 */ +#ifndef _AMIGA +#ifndef VMS +#include +#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))) + + +/* 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; +} + +/* 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; +} + +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); +} + +/* 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; +} + + +/* 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); +} + + +/* 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); +} + +/* 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; +} + + +/* 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; + } + } + } +} + +/* 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; + } + } +} + +/* 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; +} + +/* 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; +} + +/* 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; +} + +/* 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; +} + +/* 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; +} + +/* 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/third_party/make/src/remake.c b/third_party/make/src/remake.c new file mode 100644 index 00000000000..fb237c5e2c3 --- /dev/null +++ b/third_party/make/src/remake.c @@ -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 . */ + +#include "makeint.h" +#include "filedef.h" +#include "job.h" +#include "commands.h" +#include "dep.h" +#include "variable.h" +#include "debug.h" + +#include + +#ifdef HAVE_FCNTL_H +#include +#else +#include +#endif + +#ifdef VMS +#include +#endif +#ifdef WINDOWS32 +#include +#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); + + +/* 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; +} + +/* 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; + } +} + +/* 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; +} + +/* 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; +} + +/* 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; +} + +/* 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; +} + +/* 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; +} + +/* 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); +} + +/* 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/third_party/make/src/remote-cstms.c b/third_party/make/src/remote-cstms.c new file mode 100644 index 00000000000..e3369288273 --- /dev/null +++ b/third_party/make/src/remote-cstms.c @@ -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 . */ + +#include "makeint.h" +#include "filedef.h" +#include "commands.h" +#include "job.h" +#include "debug.h" + +#include +#include + +#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) +{ +} + +/* 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); +} + +/* 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; +} + +/* 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/third_party/make/src/remote-stub.c b/third_party/make/src/remote-stub.c new file mode 100644 index 00000000000..05ab336db9d --- /dev/null +++ b/third_party/make/src/remote-stub.c @@ -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 . */ + +#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) +{ +} + +/* Return nonzero if the next job should be done remotely. */ + +int +start_remote_job_p (int first_p UNUSED) +{ + return 0; +} + +/* 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; +} + +/* 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/third_party/make/src/rule.c b/third_party/make/src/rule.c new file mode 100644 index 00000000000..7efca58bc61 --- /dev/null +++ b/third_party/make/src/rule.c @@ -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 . */ + +#include "makeint.h" + +#include + +#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); + +/* 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; + +/* 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); +} + +/* 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; +} + +/* 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; +} + +/* 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/third_party/make/src/rule.h b/third_party/make/src/rule.h new file mode 100644 index 00000000000..120a6827b16 --- /dev/null +++ b/third_party/make/src/rule.h @@ -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 . */ + + +/* 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/third_party/make/src/signame.c b/third_party/make/src/signame.c new file mode 100644 index 00000000000..77bae3b6bb6 --- /dev/null +++ b/third_party/make/src/signame.c @@ -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 . */ + +#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 . */ +#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/third_party/make/src/strcache.c b/third_party/make/src/strcache.c new file mode 100644 index 00000000000..cee9d093808 --- /dev/null +++ b/third_party/make/src/strcache.c @@ -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 . */ + +#include "makeint.h" + +#include +#include + +#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/third_party/make/src/variable.c b/third_party/make/src/variable.c new file mode 100644 index 00000000000..e3796224fcb --- /dev/null +++ b/third_party/make/src/variable.c @@ -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 . */ + +#include "makeint.h" + +#include + +#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; +} + +/* 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; + +/* 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; +} + + +/* 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; +} + + +/* 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; +} + +/* 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); +} + +/* 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; + } +} + +/* 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); +} + +/* 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; + } +} + +/* 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 ("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; +} + +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; +} + +/* 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; +} + +/* 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; +} + +/* 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; +} + +/* 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; +} + +/* 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; +} + +/* 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/third_party/make/src/variable.h b/third_party/make/src/variable.h new file mode 100644 index 00000000000..e8cba4fd260 --- /dev/null +++ b/third_party/make/src/variable.h @@ -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 . */ + +#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<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/third_party/make/src/version.c b/third_party/make/src/version.c new file mode 100644 index 00000000000..36fad60d62c --- /dev/null +++ b/third_party/make/src/version.c @@ -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 . */ + +/* We use 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 + +#ifndef MAKE_HOST +# define MAKE_HOST "unknown" +#endif + +const char *version_string = VERSION; +const char *make_host = MAKE_HOST; + +/* + Local variables: + version-control: never + End: + */ diff --git a/third_party/make/src/vms_exit.c b/third_party/make/src/vms_exit.c new file mode 100644 index 00000000000..b54bba1f1eb --- /dev/null +++ b/third_party/make/src/vms_exit.c @@ -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 . */ + + +/* Per copyright assignment agreement with the Free Software Foundation + this software may be available under under other license agreements + and copyrights. */ + +#include + +#include +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/third_party/make/src/vms_export_symbol.c b/third_party/make/src/vms_export_symbol.c new file mode 100644 index 00000000000..9b4ed786f1d --- /dev/null +++ b/third_party/make/src/vms_export_symbol.c @@ -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 . */ + + +/* Per copyright assignment agreement with the Free Software Foundation + this software may be available under under other license agreements + and copyrights. */ + + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#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/third_party/make/src/vms_progname.c b/third_party/make/src/vms_progname.c new file mode 100644 index 00000000000..95d0521d305 --- /dev/null +++ b/third_party/make/src/vms_progname.c @@ -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 . */ + + +/* 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 +#include +#include +#include + +#include +#include +#include +#include +#include + +#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/third_party/make/src/vmsdir.h b/third_party/make/src/vmsdir.h new file mode 100644 index 00000000000..686d526ae36 --- /dev/null +++ b/third_party/make/src/vmsdir.h @@ -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 . */ + +#ifndef VMSDIR_H +#define VMSDIR_H + +#include + +#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/third_party/make/src/vmsfunctions.c b/third_party/make/src/vmsfunctions.c new file mode 100644 index 00000000000..51310da5c10 --- /dev/null +++ b/third_party/make/src/vmsfunctions.c @@ -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 . */ + +#include "makeint.h" +#include "debug.h" +#include "job.h" + +#include +#include + +#ifdef __DECC +#include +#endif + +#include +#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/third_party/make/src/vmsify.c b/third_party/make/src/vmsify.c new file mode 100644 index 00000000000..3427c7bfefe --- /dev/null +++ b/third_party/make/src/vmsify.c @@ -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 . */ + +/* Written by Klaus Kmpf (kkaempf@progis.de) + of proGIS Software, Aachen, Germany */ + + +#include +#include +#include + +#include "makeint.h" + +#if VMS +#include +#include +#include +#include +#include +#include +#include +#include +/* 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 ./ [] .dir +2 ../ .dir + +3 // : :[000000] :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/third_party/make/src/vmsjobs.c b/third_party/make/src/vmsjobs.c new file mode 100644 index 00000000000..979a209d0af --- /dev/null +++ b/third_party/make/src/vmsjobs.c @@ -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 . */ + +#include +#include +#include + +/* TODO - VMS specific header file conditionally included in makeint.h */ + +#include +#include +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 +#include +#include + +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/third_party/make/src/vpath.c b/third_party/make/src/vpath.c new file mode 100644 index 00000000000..d4e7dc73f7b --- /dev/null +++ b/third_party/make/src/vpath.c @@ -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 . */ + +#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; + + +/* 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; + } +} + +/* 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); +} + +/* 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; +} + + +/* 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; +} + + + + +/* 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/third_party/make/src/w32/compat/dirent.c b/third_party/make/src/w32/compat/dirent.c new file mode 100644 index 00000000000..b8ec6152f45 --- /dev/null +++ b/third_party/make/src/w32/compat/dirent.c @@ -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 . */ + + +#include +#include +#include +#include +#include +#include +#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/third_party/make/src/w32/compat/posixfcn.c b/third_party/make/src/w32/compat/posixfcn.c new file mode 100644 index 00000000000..975dfb730f0 --- /dev/null +++ b/third_party/make/src/w32/compat/posixfcn.c @@ -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 . */ + +#include +#include +#include +#include +#include + +#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/third_party/make/src/w32/include/dirent.h b/third_party/make/src/w32/include/dirent.h new file mode 100644 index 00000000000..ae814b31324 --- /dev/null +++ b/third_party/make/src/w32/include/dirent.h @@ -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 . */ + +#ifndef _DIRENT_H +#define _DIRENT_H + +#ifdef __MINGW32__ +# include +# include_next +#else + +#include +#include +#include +#include + +#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/third_party/make/src/w32/include/dlfcn.h b/third_party/make/src/w32/include/dlfcn.h new file mode 100644 index 00000000000..00d1d7d9b16 --- /dev/null +++ b/third_party/make/src/w32/include/dlfcn.h @@ -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 . */ + +#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/third_party/make/src/w32/include/pathstuff.h b/third_party/make/src/w32/include/pathstuff.h new file mode 100644 index 00000000000..63f43251781 --- /dev/null +++ b/third_party/make/src/w32/include/pathstuff.h @@ -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 . */ + +#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/third_party/make/src/w32/include/sub_proc.h b/third_party/make/src/w32/include/sub_proc.h new file mode 100644 index 00000000000..8ab93532d83 --- /dev/null +++ b/third_party/make/src/w32/include/sub_proc.h @@ -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 . */ + +#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/third_party/make/src/w32/include/w32err.h b/third_party/make/src/w32/include/w32err.h new file mode 100644 index 00000000000..f3ca50c2267 --- /dev/null +++ b/third_party/make/src/w32/include/w32err.h @@ -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 . */ + +#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/third_party/make/src/w32/pathstuff.c b/third_party/make/src/w32/pathstuff.c new file mode 100644 index 00000000000..99b6a3fec74 --- /dev/null +++ b/third_party/make/src/w32/pathstuff.c @@ -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 . */ + +#include "makeint.h" +#include +#include +#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/third_party/make/src/w32/subproc/misc.c b/third_party/make/src/w32/subproc/misc.c new file mode 100644 index 00000000000..af5567ce0df --- /dev/null +++ b/third_party/make/src/w32/subproc/misc.c @@ -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 . */ + +#include +#include +#include +#include +#include +#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/third_party/make/src/w32/subproc/proc.h b/third_party/make/src/w32/subproc/proc.h new file mode 100644 index 00000000000..d9f640630ea --- /dev/null +++ b/third_party/make/src/w32/subproc/proc.h @@ -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 . */ + +#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/third_party/make/src/w32/subproc/sub_proc.c b/third_party/make/src/w32/subproc/sub_proc.c new file mode 100644 index 00000000000..c0c4f44d7a8 --- /dev/null +++ b/third_party/make/src/w32/subproc/sub_proc.c @@ -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 . */ + +#include +#include +#include +#include +#include /* for _get_osfhandle */ +#ifdef _MSC_VER +# include /* for intptr_t */ +#else +# include +#endif +#include +#include /* for msvc _beginthreadex, _endthreadex */ +#include +#include + +#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/third_party/make/src/w32/subproc/w32err.c b/third_party/make/src/w32/subproc/w32err.c new file mode 100644 index 00000000000..5ae30435ec3 --- /dev/null +++ b/third_party/make/src/w32/subproc/w32err.c @@ -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 . */ + +#include +#include +#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/third_party/make/src/w32/w32os.c b/third_party/make/src/w32/w32os.c new file mode 100644 index 00000000000..fe74811fa22 --- /dev/null +++ b/third_party/make/src/w32/w32os.c @@ -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 . */ + +#include "makeint.h" + +#include +#include + +#include +#include +#include +#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/third_party/make/tests/README b/third_party/make/tests/README new file mode 100644 index 00000000000..aab3c35373d --- /dev/null +++ b/third_party/make/tests/README @@ -0,0 +1,102 @@ +The test suite was originally written by Steve McGee and Chris Arthur. +It is covered by the GNU General Public License (Version 2), described +in the file COPYING. It has been maintained as part of GNU make proper +since GNU make 3.78. + +This entire test suite, including all test files, are copyright and +distributed under the following terms: + + ----------------------------------------------------------------------------- + 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 . + ----------------------------------------------------------------------------- + +The test suite requires Perl. These days, you should have at least Perl +5.004 (available from ftp.gnu.org, and portable to many machines). It +used to work with Perl 4.036 but official support for Perl 4.x was +abandoned a long time ago, due to lack of testbeds, as well as interest. + +The test suite assumes that the first "diff" it finds on your PATH is +GNU diff, but that only matters if a test fails. + +To run the test suite on a UNIX system, use "perl ./run_make_tests" +(or just "./run_make_tests" if you have a perl on your PATH). + +To run the test suite on Windows NT or DOS systems, use +"perl.exe ./run_make-tests.pl". + +By default, the test engine picks up the first executable called "make" +that it finds in your path. You may use the -make_path option (i.e., +"perl run_make_tests -make_path /usr/local/src/make-3.78/make") if +you want to run a particular copy. This now works correctly with +relative paths and when make is called something other than "make" (like +"gmake"). + +Tests cannot end with a "~" character, as the test suite will ignore any +that do (I was tired of having it run my Emacs backup files as tests :)) + +Also, sometimes the tests may behave strangely on networked +filesystems. You can use mkshadow to create a copy of the test suite in +/tmp or similar, and try again. If the error disappears, it's an issue +with your network or file server, not GNU make (I believe). This +shouldn't happen very often anymore: I've done a lot of work on the +tests to reduce the impacts of this situation. + +The options/dash-l test will not really test anything if the copy of +make you are using can't obtain the system load. Some systems require +make to be setgid sys or kmem for this; if you don't want to install +make just to test it, make it setgid to kmem or whatever group /dev/kmem +is (i.e., "chgrp kmem make;chmod g+s make" as root). In any case, the +options/dash-l test should no longer *fail* because make can't read +/dev/kmem. + +A directory named "work" will be created when the tests are run which +will contain any makefiles and "diff" files of tests that fail so that +you may look at them afterward to see the output of make and the +expected result. + +There is a -help option which will give you more information about the +other possible options for the test suite. + + +Open Issues +----------- + +The test suite has a number of problems which should be addressed. One +VERY serious one is that there is no real documentation. You just have +to see the existing tests. Use the newer tests: many of the tests +haven't been updated to use the latest/greatest test methods. See the +ChangeLog in the tests directory for pointers. + +The second serious problem is that it's not parallelizable: it scribbles +all over its installation directory and so can only test one make at a +time. The third serious problem is that it's not relocatable: the only +way it works when you build out of the source tree is to create +symlinks, which doesn't work on every system and is bogus to boot. The +fourth serious problem is that it doesn't create its own sandbox when +running tests, so that if a test forgets to clean up after itself that +can impact future tests. + + +Bugs +---- + +Any complaints/suggestions/bugs/etc. for the test suite itself (as +opposed to problems in make that the suite finds) should be handled the +same way as normal GNU make bugs/problems (see the README for GNU make). + + + Paul D. Smith + Chris Arthur diff --git a/third_party/make/tests/config-flags.pm.W32 b/third_party/make/tests/config-flags.pm.W32 new file mode 100644 index 00000000000..9d2602bbceb --- /dev/null +++ b/third_party/make/tests/config-flags.pm.W32 @@ -0,0 +1,9 @@ +# This is a -*-perl-*- script +# +# Set variables for Windows systems. + +%CONFIG_FLAGS = ( + USE_SYSTEM_GLOB => 'no' +); + +1; diff --git a/third_party/make/tests/config-flags.pm.in b/third_party/make/tests/config-flags.pm.in new file mode 100644 index 00000000000..90cd98016d4 --- /dev/null +++ b/third_party/make/tests/config-flags.pm.in @@ -0,0 +1,20 @@ +# This is a -*-perl-*- script +# +# Set variables that were defined by configure, in case we need them +# 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@', + USE_SYSTEM_GLOB => '@USE_SYSTEM_GLOB@' +); + +1; diff --git a/third_party/make/tests/config_flags_pm.com b/third_party/make/tests/config_flags_pm.com new file mode 100755 index 00000000000..e7da8ca21c6 --- /dev/null +++ b/third_party/make/tests/config_flags_pm.com @@ -0,0 +1,54 @@ +$! +$! config_flags_pm.com - Build config-flags.pm on VMS. +$! +$! Just good enough to run the self tests for now. +$! +$! 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 +$! 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 . +$! +$! +$ open/read cfpm_in config-flags.pm.in +$! +$ outfile = "sys$disk:[]config-flags.pm" +$! +$ cflags = "/include=([],[.lib]" +$! +$ create 'outfile' +$ open/append cfpm 'outfile' +$! +$cfpm_read_loop: +$ read cfpm_in/end=cfpm_read_loop_end line_in +$ line_in_len = f$length(line_in) +$ if f$locate("@", line_in) .lt. line_in_len +$ then +$ part1 = f$element(0, "@", line_in) +$ key = f$element(1, "@", line_in) +$ part2 = f$element(2, "@", line_in) +$ value = "" +$ 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 +$ write cfpm line_in +$ goto cfpm_read_loop +$cfpm_read_loop_end: +$ close cfpm_in +$ close cfpm +$! diff --git a/third_party/make/tests/guile.supp b/third_party/make/tests/guile.supp new file mode 100644 index 00000000000..9e9b01ba333 --- /dev/null +++ b/third_party/make/tests/guile.supp @@ -0,0 +1,31 @@ +# Guile valgrind suppression file +# Created with Guile 1.8.7 + +# --- Garbage collection +{ + guilegc + Memcheck:Cond + ... + fun:scm_gc_for_newcell +} +{ + guilegc + Memcheck:Value4 + ... + fun:scm_gc_for_newcell +} +{ + guilegc + Memcheck:Value8 + ... + fun:scm_gc_for_newcell +} + + +# -- scm_alloc_struct +{ + guileheap + Memcheck:Leak + ... + fun:scm_alloc_struct +} diff --git a/third_party/make/tests/mkshadow b/third_party/make/tests/mkshadow new file mode 100755 index 00000000000..e7533c830d0 --- /dev/null +++ b/third_party/make/tests/mkshadow @@ -0,0 +1,57 @@ +#!/bin/sh +# +# 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-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 . + +case "$1" in + "") echo 'Usage: mkshadow '; exit 1 ;; +esac + +dest="$1" + +if [ ! -d "$dest" ]; then + echo "Destination directory '$dest' must exist!" + exit 1 +fi + +if [ ! -f run_make_tests ]; then + echo "The current directory doesn't appear to contain the test suite!" + exit 1 +fi + +suite=`pwd | sed 's%^/tmp_mnt%%'` +name=`basename "$suite"` + +files=`echo *` + +set -e + +mkdir "$dest/$name" +cd "$dest/$name" + +ln -s "$suite" .testdir + +for f in $files; do + ln -s .testdir/$f . +done + +rm -rf work + +echo "Shadow test suite created in '$dest/$name'." +exit 0 diff --git a/third_party/make/tests/run_make_tests b/third_party/make/tests/run_make_tests new file mode 100755 index 00000000000..b68b78494ed --- /dev/null +++ b/third_party/make/tests/run_make_tests @@ -0,0 +1,2 @@ +#!/bin/sh +exec perl $0.pl ${1+"$@"} diff --git a/third_party/make/tests/run_make_tests.bat b/third_party/make/tests/run_make_tests.bat new file mode 100644 index 00000000000..45ff9308af8 --- /dev/null +++ b/third_party/make/tests/run_make_tests.bat @@ -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 . + +setlocal +cd "%~dp0" + +perl -I. .\run_make_tests.pl %* diff --git a/third_party/make/tests/run_make_tests.pl b/third_party/make/tests/run_make_tests.pl new file mode 100644 index 00000000000..d76e4f3b01a --- /dev/null +++ b/third_party/make/tests/run_make_tests.pl @@ -0,0 +1,697 @@ +#!/usr/bin/env perl +# -*-perl-*- + +# Test driver for the Make test suite + +# Usage: run_make_tests [testname] +# [-debug] +# [-help] +# [-verbose] +# [-keep] +# [-make ] +# (and others) + +# 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 . + +# 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 +$valgrind_args = ''; +$memcheck_args = '--num-callers=15 --tool=memcheck --leak-check=full --suppressions=guile.supp'; +$massif_args = '--num-callers=15 --tool=massif --alloc-fn=xmalloc --alloc-fn=xcalloc --alloc-fn=xrealloc --alloc-fn=xstrdup --alloc-fn=xstrndup'; +$pure_log = undef; + +# The location of the GNU make source directory +$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') +{ + require VMS::Filespec; + VMS::Filespec->import(); + + sub vms_rmdir { + my $vms_file = vmspath($_[0]); + $vms_file = fileify($vms_file); + my $ret = unlink(vmsify($vms_file)); + return $ret + }; + + *CORE::GLOBAL::rmdir = \&vms_rmdir; + + $CMD_rmfile = 'delete_file -no_ask'; +} + +%CONFIG_FLAGS = (); + +# 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 @_; }; + +sub valid_option +{ + local($option) = @_; + + if ($option =~ /^-make([-_]?path)?$/i) { + $make_path = shift @argv; + if (!-f $make_path) { + print "$option $make_path: Not found.\n"; + exit 0; + } + return 1; + } + + if ($option =~ /^-srcdir$/i) { + $srcdir = shift @argv; + if (! -f File::Spec->catfile($srcdir, 'src', 'gnumake.h')) { + print "$option $srcdir: Not a valid GNU make source directory.\n"; + exit 0; + } + return 1; + } + + if ($option =~ /^-all([-_]?tests)?$/i) { + $all_tests = 1; + return 1; + } + + if ($option =~ /^-(valgrind|memcheck)$/i) { + $valgrind = 1; + $valgrind_args = $memcheck_args; + return 1; + } + + if ($option =~ /^-massif$/i) { + $valgrind = 1; + $valgrind_args = $massif_args; + return 1; + } + +# This doesn't work--it _should_! Someone badly needs to fix this. +# +# elsif ($option =~ /^-work([-_]?dir)?$/) +# { +# $workdir = shift @argv; +# return 1; +# } + + return 0; +} + + +# This is an "all-in-one" function. Arguments are as follows: +# +# [0] (string): The makefile to be tested. undef means use the last one. +# [1] (string): Arguments to pass to make. +# [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 +{ + local $_ = shift; + $makefile and s/#MAKEFILE#/$makefile/g; + s/#MAKEPATH#/$mkpath/g; + s/#MAKE#/$make_name/g; + s/#PERL#/$perl_name/g; + s/#PWD#/$cwdpath/g; + # If we're using a shell + s/#HELPER#/$perl_name $helptool/g; + return $_; +} + +sub run_make_test +{ + local ($makestring, $options, $answer, $err_code, $timeout) = @_; + my @call = caller; + + # If the user specified a makefile string, create a new makefile to contain + # it. If the first value is not defined, use the last one (if there is + # one). + + if (! defined $makestring) { + defined $old_makefile + or die "run_make_test(undef) invoked before run_make_test('...')\n"; + $makefile = $old_makefile; + } else { + if (! defined($makefile)) { + $makefile = &get_tmpfile(); + } + + # Make sure it ends in a newline and substitute any special tokens. + $makestring && $makestring !~ /\n$/s and $makestring .= "\n"; + $makestring = subst_make_string($makestring); + + # Populate the makefile! + open(MAKEFILE, "> $makefile") or die "Failed to open $makefile: $!\n"; + print MAKEFILE $makestring; + close(MAKEFILE) or die "Failed to write $makefile: $!\n"; + } + + # Do the same processing on $answer as we did on $makestring. + if (defined $answer) { + $answer && $answer !~ /\n$/s and $answer .= "\n"; + $answer = subst_make_string($answer); + } + + run_make_with_options($makefile, $options, &get_logfile(0), + $err_code, $timeout, @call); + &compare_output($answer, &get_logfile(1)); + + $old_makefile = $makefile; + $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; + my $code; + my $command = create_command($options); + + $expected_code = 0 unless defined($expected_code); + + # Reset to reflect this one test. + $test_passed = 1; + + if ($filename) { + $command = add_options($command, '-f', $filename); + } + + if ($options) { + 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; + + # If the leading quote is inside non-whitespace, then the + # quote must be doubled, because it will be enclosed in another + # set of quotes. + $options =~ s/(\S)(\".*\")/$1\"$2\"/g; + + # Options must be quoted to preserve case if not already quoted. + $options =~ s/(\S+)/\"$1\"/g; + + # Special fixup for embedded quotes. + $options =~ s/(\"\".+)\"(\s+)\"(.+\"\")/$1$2$3/g; + + $options =~ s/(\A)(?:\"\")(.+)(?:\"\")/$1\"$2\"/g; + + # Special fixup for misc/general4 test. + $options =~ s/""\@echo" "cc""/\@echo cc"/; + $options =~ s/"\@echo link"""/\@echo link"/; + + # Remove shell escapes expected to be removed by bash + if ($options !~ /path=pre/) { + $options =~ s/\\//g; + } + + # special fixup for options/eval + $options =~ s/"--eval=\$\(info" "eval/"--eval=\$\(info eval/; + + print ("Options fixup = -$options-\n") if $debug; + } + + $command = add_options($command, $options); + } + + my $cmdstr = ref($command) ? "'".join("' '", @$command)."'" : $command; + + if (@call) { + $command_string = "#$call[1]:$call[2]\n$cmdstr\n"; + } else { + $command_string = $cmdstr; + } + + if ($valgrind) { + print VALGRIND "\n\nExecuting: $cmdstr\n"; + } + + { + my $old_timeout = $test_timeout; + $timeout and $test_timeout = $timeout; + + # If valgrind is enabled, turn off the timeout check + $valgrind and $test_timeout = 0; + + if (ref($command)) { + $code = run_command_with_output($logname, @$command); + } else { + $code = run_command_with_output($logname, $command); + } + $test_timeout = $old_timeout; + } + + # Check to see if we have Purify errors. If so, keep the logfile. + # For this to work you need to build with the Purify flag -exit-status=yes + + if ($pure_log && -f $pure_log) { + if ($code & 0x7000) { + $code &= ~0x7000; + + # 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") or die "Can't rename $pure_log to $tn: $!\n"; + ++$purify_errors; + } else { + unlink($pure_log); + } + } + + if ($code != $expected_code) { + print "Error running @make_command (expected $expected_code; got $code): $cmdstr\n"; + $test_passed = 0; + &create_file (&get_runfile, $command_string); + # If it's a SIGINT, stop here + if ($code & 127) { + print STDERR "\nCaught signal ".($code & 127)."!\n"; + ($code & 127) == 2 and exit($code); + } + return 0; + } + + if ($profile & $vos) { + system "add_profile @make_command"; + } + + return 1; +} + +sub print_usage +{ + &print_standard_usage ("run_make_tests", + "[-make MAKE_PATHNAME] [-srcdir SRCDIR] [-memcheck] [-massif]",); +} + +sub print_help +{ + &print_standard_help ( + "-make", + "\tYou may specify the pathname of the copy of make to run.", + "-srcdir", + "\tSpecify the make source directory.", + "-valgrind", + "-memcheck", + "\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 tool.", + "\tChange the default valgrind args with the VALGRIND_ARGS env var." + ); +} + +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 { + $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 ($v, $d, $f); +} + +sub get_config +{ + return exists($CONFIG_FLAGS{$_[0]}) ? $CONFIG_FLAGS{$_[0]} : ''; +} + +sub set_more_defaults +{ + my $string; + + # Now that we have located make_path, locate the srcdir and blddir + my ($mpv, $mpd, $mpf) = find_prog($make_path); + + # 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; + } + } + + # 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; + } + } + + 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; + } + } + + # If we have srcdir but not blddir, set them equal + if ($srcdir && !$blddir) { + $blddir = $srcdir; + $bldvol = $srcvol; + } + + # 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"; + } + } + + # 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 ''; + } + + $string = `$make_path -v`; + $string =~ /^(GNU Make [^,\n]*)/ or die "$make_path is not GNU make. Version:\n$string"; + $testee_version = "$1\n"; + + create_file('null.mk', ''); + + 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; + } + + # prepend pwd if this is a relative path (ie, does not + # start with a slash, but contains one). Thanks for the + # clue, Roland. + + 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; + } + + # 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; + $_ = ; + close(MF); + /^abs_srcdir\s*=\s*(.*?)\s*$/m; + -f File::Spec->catfile($1, 'src', 'gnumake.h') and $srcdir = $1; + } + + # At this point we should have srcdir and blddir: get fq versions + $fqsrcdir = File::Spec->rel2abs($srcdir); + $fqblddir = File::Spec->rel2abs($blddir); + + # Find the helper tool + $helptool = File::Spec->catfile($fqsrcdir, 'tests', 'thelp.pl'); + + # 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 +{ + $makefile = &get_tmpfile; + if (-f $makefile) { + unlink $makefile; + } + + # Get rid of any Purify logs. + if ($pure_log) { + ($pure_testname = $testname) =~ tr,/,_,; + $pure_testname = "$pure_log.$pure_testname"; + system("rm -f $pure_testname*"); + print("Purify testfiles are: $pure_testname*\n") if $debug; + } +} + +exit !&toplevel; diff --git a/third_party/make/tests/scripts/features/archives b/third_party/make/tests/scripts/features/archives new file mode 100644 index 00000000000..dcd38e5a81c --- /dev/null +++ b/third_party/make/tests/scripts/features/archives @@ -0,0 +1,241 @@ +# -*-mode: perl-*- + +$description = "Test GNU make's archive management features."; + +$details = "\ +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') { + # VMS AR needs real object files at this time. + foreach $afile ('a1', 'a2', 'a3') { + # Use non-standard extension to prevent implicit rules from recreating + # objects when the test tampers with the timestamp. + 1 while unlink "$afile.c1"; + 1 while unlink "$afile.o"; + open (MYFILE, ">$afile.c1"); + print MYFILE "int $afile(void) {return 1;}\n"; + close MYFILE; + system("cc $afile.c1 /object=$afile.o"); + } +} else { + utouch(-60, qw(a1.o a2.o a3.o)); +} + +# Fallback if configure did not find AR +my $ar = get_config('AR') || 'ar'; + +my $redir = '2>&1'; +$redir = '' if $osname eq 'VMS'; + +my $arflags = 'rv'; +my $arvar = "AR=$ar"; + +# Newer versions of binutils can be built with --enable-deterministic-archives +# which forces all timestamps (among other things) to always be 0, defeating +# GNU make's archive support. See if ar supports the U option to disable it. +unlink('libxx.a'); +$_ = `$ar U$arflags libxx.a a1.o $redir`; +if ($? == 0) { + $arflags = 'Urv'; + $arvar = "$arvar ARFLAGS=$arflags"; +} + +# 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`; +$add =~ s/a2\.o/#OBJECT#/g; + +# Some versions of ar print different things on replacement. Find out. +my $repl = `$ar $arflags libxx.a a2.o $redir`; +$repl =~ s/a2\.o/#OBJECT#/g; + +unlink('libxx.a'); + +# Very simple +($_ = $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'; +} +run_make_test('all: libxx.a(a1.o)', $arvar, $answer); + +# Multiple .o's. Add a new one to the existing library +($_ = $add) =~ s/#OBJECT#/a2.o/g; + +$answer = "$ar $arflags libxx.a a2.o\n$_"; +if ($port_type eq 'VMS-DCL') { + $answer = 'library /replace libxx.a a2.o'; +} +run_make_test('all: libxx.a(a1.o a2.o)', $arvar, $answer); + +# Touch one of the .o's so it's rebuilt +if ($port_type eq 'VMS-DCL') { + # utouch is not changing what VMS library compare is testing for. + # So do a real change by regenerating the file. + 1 while unlink('a1.o'); + # Later time stamp than last insertion. + sleep(2); + system('cc a1.c1 /object=a1.o'); + # Next insertion will have a later timestamp. + sleep(2); +} else { + utouch(-40, 'a1.o'); +} + +($_ = $repl) =~ s/#OBJECT#/a1.o/g; +$answer = "$ar $arflags libxx.a a1.o\n$_"; +if ($port_type eq 'VMS-DCL') { + $answer = 'library /replace libxx.a a1.o'; +} +run_make_test(undef, $arvar, $answer); + +# Use wildcards +$answer = "#MAKE#: Nothing to be done for 'all'.\n"; +run_make_test('all: libxx.a(*.o)', $arvar, $answer); + +# Touch one of the .o's so it's rebuilt +if ($port_type eq 'VMS-DCL') { + # utouch is not changing what VMS library compare is testing for. + # So do a real change by regenerating the file. + 1 while unlink('a1.o'); + # Make timestamp later than last insertion. + sleep(2); + system('cc a1.c1 /object=a1.o'); +} else { + utouch(-30, 'a1.o'); +} +($_ = $repl) =~ s/#OBJECT#/a1.o/g; +$answer = "$ar $arflags libxx.a a1.o\n$_"; +if ($port_type eq 'VMS-DCL') { + $answer = 'library /replace libxx.a a1.o'; +} +run_make_test(undef, $arvar, $answer); + +# Use both wildcards and simple names +if ($port_type eq 'VMS-DCL') { + # utouch is not changing what VMS library compare is testing for. + # So do a real change by regenerating the file. + 1 while unlink('a2.o'); + sleep(2); + system('cc a2.c1 /object=a2.o'); +} else { + utouch(-50, 'a2.o'); +} +($_ = $add) =~ s/#OBJECT#/a3.o/g; +$_ .= "$ar $arflags libxx.a a2.o\n"; +($_ .= $repl) =~ s/#OBJECT#/a2.o/g; +$answer = "$ar $arflags libxx.a a3.o\n$_"; +if ($port_type eq 'VMS-DCL') { + $answer = 'library /replace libxx.a a3.o'; +} + +run_make_test('all: libxx.a(a3.o *.o)', $arvar, $answer); + +# Check whitespace handling +if ($port_type eq 'VMS-DCL') { + # utouch is not changing what VMS library compare is testing for. + # So do a real change by regenerating the file. + 1 while unlink('a2.o'); + sleep(2); + system('cc a2.c1 /object=a2.o'); +} else { + utouch(-40, 'a2.o'); +} +($_ = $repl) =~ s/#OBJECT#/a2.o/g; +$answer = "$ar $arflags libxx.a a2.o\n$_"; +if ($port_type eq 'VMS-DCL') { + $answer = 'library /replace libxx.a a2.o'; +} +run_make_test('all: libxx.a( a3.o *.o )', $arvar, $answer); + +rmfiles(qw(a1.c1 a2.c1 a3.c1 a1.o a2.o a3.o libxx.a)); + +# Check non-archive targets +# See Savannah bug #37878 +$mk_string = q! +all: foo(bar).baz +foo(bar).baz: ; @echo '$@' +!; + +if ($port_type eq 'VMS-DCL') { + $mk_string =~ s/echo/write sys\$\$output/; + $mk_string =~ s/\'/\"/g; +} +run_make_test($mk_string, $arvar, "foo(bar).baz\n"); + +# Check renaming of archive targets. +# See Savannah bug #38442 + +mkdir('artest', 0777); +touch('foo.vhd'); +$mk_string = q! +DIR = artest +vpath % $(DIR) +default: lib(foo) +(%): %.vhd ; @cd $(DIR) && touch $(*F) && $(AR) $(ARFLAGS) $@ $(*F) >/dev/null 2>&1 && rm $(*F) +.PHONY: default +!; +if ($port_type eq 'VMS-DCL') { + $mk_string =~ s#= artest#= sys\$\$disk:\[.artest\]#; + $mk_string =~ s#lib\(foo\)#lib.tlb\(foo\)#; + $mk_string =~ s#; \@cd#; pipe SET DEFAULT#; + $mk_string =~ + s#touch \$\(\*F\)#touch \$\(\*F\) && library/create/text sys\$\$disk:\$\@#; + $mk_string =~ + s#library#if f\$\$search(\"\$\@\") \.eqs\. \"\" then library#; + # VMS needs special handling for null extension + $mk_string =~ s#\@ \$\(\*F\)#\@ \$\(\*F\)\.#; + $mk_string =~ s#>/dev/null 2>&1 ##; +} +run_make_test($mk_string, $arvar, ""); + +run_make_test(undef, $arvar, "#MAKE#: Nothing to be done for 'default'.\n"); + +unlink('foo.vhd'); +if ($osname eq 'VMS') { + 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; diff --git a/third_party/make/tests/scripts/features/comments b/third_party/make/tests/scripts/features/comments new file mode 100644 index 00000000000..9257955f7b1 --- /dev/null +++ b/third_party/make/tests/scripts/features/comments @@ -0,0 +1,35 @@ +$description = "The following test creates a makefile to test comments\n" + ."and comment continuation to the next line using a \n" + ."backslash within makefiles."; + +$details = "To test comments within a makefile, a semi-colon was placed \n" + ."after a comment was started. This should not be reported as\n" + ."an error since it is within a comment. We then continue the \n" + ."comment to the next line using a backslash. To test whether\n" + ."the comment really continued, we place an echo command with some\n" + ."text on the line which should never execute since it should be \n" + ."within a comment\n"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<\EOF; +# Test comment vs semicolon parsing and line continuation +target: # this ; is just a comment \ + @echo This is within a comment. + @echo There should be no errors for this makefile. +EOF + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "There should be no errors for this makefile.\n"; + +# COMPARE RESULTS + +&compare_output($answer,&get_logfile(1)) diff --git a/third_party/make/tests/scripts/features/conditionals b/third_party/make/tests/scripts/features/conditionals new file mode 100644 index 00000000000..78344b93896 --- /dev/null +++ b/third_party/make/tests/scripts/features/conditionals @@ -0,0 +1,162 @@ +# -*-perl-*- +$description = "Check GNU make conditionals."; + +$details = "Attempt various different flavors of GNU make conditionals."; + +run_make_test(' +arg1 = first +arg2 = second +arg3 = third +arg4 = cc +arg5 = second + +all: +ifeq ($(arg1),$(arg2)) + @echo arg1 equals arg2 +else + @echo arg1 NOT equal arg2 +endif + +ifeq \'$(arg2)\' "$(arg5)" + @echo arg2 equals arg5 +else + @echo arg2 NOT equal arg5 +endif + +ifneq \'$(arg3)\' \'$(arg4)\' + @echo arg3 NOT equal arg4 +else + @echo arg3 equal arg4 +endif + +ifndef undefined + @echo variable is undefined +else + @echo variable undefined is defined +endif +ifdef arg4 + @echo arg4 is defined +else + @echo arg4 is NOT defined +endif', + '', + 'arg1 NOT equal arg2 +arg2 equals arg5 +arg3 NOT equal arg4 +variable is undefined +arg4 is defined'); + + +# Test expansion of variables inside ifdef. + +run_make_test(' +foo = 1 + +FOO = foo +F = f + +DEF = no +DEF2 = no + +ifdef $(FOO) +DEF = yes +endif + +ifdef $(F)oo +DEF2 = yes +endif + + +DEF3 = no +FUNC = $1 +ifdef $(call FUNC,DEF)3 + DEF3 = yes +endif + +all:; @echo DEF=$(DEF) DEF2=$(DEF2) DEF3=$(DEF3)', + '', + 'DEF=yes DEF2=yes DEF3=yes'); + + +# Test all the different "else if..." constructs + +run_make_test(' +arg1 = first +arg2 = second +arg3 = third +arg4 = cc +arg5 = fifth + +result = + +ifeq ($(arg1),$(arg2)) + result += arg1 equals arg2 +else ifeq \'$(arg2)\' "$(arg5)" + result += arg2 equals arg5 +else ifneq \'$(arg3)\' \'$(arg3)\' + result += arg3 NOT equal arg4 +else ifndef arg5 + result += variable is undefined +else ifdef undefined + result += arg4 is defined +else + result += success +endif + + +all: ; @echo $(result)', + '', + 'success'); + + +# Test some random "else if..." construct nesting + +run_make_test(' +arg1 = first +arg2 = second +arg3 = third +arg4 = cc +arg5 = second + +ifeq ($(arg1),$(arg2)) + $(info failed 1) +else ifeq \'$(arg2)\' "$(arg2)" + ifdef undefined + $(info failed 2) + else + $(info success) + endif +else ifneq \'$(arg3)\' \'$(arg3)\' + $(info failed 3) +else ifdef arg5 + $(info failed 4) +else ifdef undefined + $(info failed 5) +else + $(info failed 6) +endif + +.PHONY: all +all: ; @:', + '', + 'success'); + +# SV 47960 : ensure variable assignments in non-taken legs don't cause problems +run_make_test(' +ifneq ($(FOO),yes) +target: +else +BAR = bar +target: +endif + @echo one +', + '', "one\n"); + + +# 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: diff --git a/third_party/make/tests/scripts/features/default_names b/third_party/make/tests/scripts/features/default_names new file mode 100644 index 00000000000..2e838806e8e --- /dev/null +++ b/third_party/make/tests/scripts/features/default_names @@ -0,0 +1,44 @@ +# -*-perl-*- + +$description = "This script tests to make sure that Make looks for +default makefiles in the correct order (GNUmakefile,makefile,Makefile)"; + +# Create a makefile called "GNUmakefile" +$makefile = "GNUmakefile"; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE "FIRST: ; \@echo It chose GNUmakefile\n"; +close(MAKEFILE); + +# Create another makefile called "makefile" +open(MAKEFILE,"> makefile"); +print MAKEFILE "SECOND: ; \@echo It chose makefile\n"; +close(MAKEFILE); + +# DOS/WIN32/MacOSX platforms are case-insensitive / case-preserving, so +# Makefile is the same file as makefile. Just test what we can here. + +my $case_sensitive = 0; +if (! -f 'Makefile') { + # Create another makefile called "Makefile" + $case_sensitive = 1; + open(MAKEFILE,"> Makefile"); + print MAKEFILE "THIRD: ; \@echo It chose Makefile\n"; + close(MAKEFILE); +} + +run_make_with_options("","",&get_logfile); +compare_output("It chose GNUmakefile\n",&get_logfile(1)); +unlink($makefile); + +run_make_with_options("","",&get_logfile); +compare_output("It chose makefile\n",&get_logfile(1)); +unlink("makefile"); + +if ($case_sensitive) { + run_make_with_options("","",&get_logfile); + compare_output("It chose Makefile\n",&get_logfile(1)); + unlink("Makefile"); +} + +1; diff --git a/third_party/make/tests/scripts/features/double_colon b/third_party/make/tests/scripts/features/double_colon new file mode 100644 index 00000000000..58f126f6f63 --- /dev/null +++ b/third_party/make/tests/scripts/features/double_colon @@ -0,0 +1,220 @@ +# -*-perl-*- +$description = "Test handling of double-colon rules."; + +$details = "\ +We test these features: + + - Multiple commands for the same (double-colon) target + - Different prerequisites for targets: only out-of-date + ones are rebuilt. + - Double-colon targets that aren't the goal target. + +Then we do the same thing for parallel builds: double-colon +targets should always be built serially."; + +# The Contents of the MAKEFILE ... + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; + +all: baz + +foo:: f1.h ; @echo foo FIRST +foo:: f2.h ; @echo foo SECOND + +bar:: ; @echo aaa; sleep 1; echo aaa done +bar:: ; @echo bbb + +baz:: ; @echo aaa +baz:: ; @echo bbb + +biz:: ; @echo aaa +biz:: two ; @echo bbb + +two: ; @echo two + +f1.h f2.h: ; @echo $@ + +d :: ; @echo ok +d :: d ; @echo oops + +EOF + +close(MAKEFILE); + +# TEST 0: A simple double-colon rule that isn't the goal target. + +&run_make_with_options($makefile, "all", &get_logfile, 0); +$answer = "aaa\nbbb\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 1: As above, in parallel + +if ($parallel_jobs) { + &run_make_with_options($makefile, "-j10 all", &get_logfile, 0); + $answer = "aaa\nbbb\n"; + &compare_output($answer, &get_logfile(1)); +} + +# TEST 2: A simple double-colon rule that is the goal target + +&run_make_with_options($makefile, "bar", &get_logfile, 0); +$answer = "aaa\naaa done\nbbb\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 3: As above, in parallel + +if ($parallel_jobs) { + &run_make_with_options($makefile, "-j10 bar", &get_logfile, 0); + $answer = "aaa\naaa done\nbbb\n"; + &compare_output($answer, &get_logfile(1)); +} + +# TEST 4: Each double-colon rule is supposed to be run individually + +&utouch(-5, 'f2.h'); +&touch('foo'); + +&run_make_with_options($makefile, "foo", &get_logfile, 0); +$answer = "f1.h\nfoo FIRST\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 5: Again, in parallel. + +if ($parallel_jobs) { + &run_make_with_options($makefile, "-j10 foo", &get_logfile, 0); + $answer = "f1.h\nfoo FIRST\n"; + &compare_output($answer, &get_logfile(1)); +} + +# TEST 6: Each double-colon rule is supposed to be run individually + +&utouch(-5, 'f1.h'); +unlink('f2.h'); +&touch('foo'); + +&run_make_with_options($makefile, "foo", &get_logfile, 0); +$answer = "f2.h\nfoo SECOND\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 7: Again, in parallel. + +if ($parallel_jobs) { + &run_make_with_options($makefile, "-j10 foo", &get_logfile, 0); + $answer = "f2.h\nfoo SECOND\n"; + &compare_output($answer, &get_logfile(1)); +} + +# TEST 8: Test circular dependency check; PR/1671 + +&run_make_with_options($makefile, "d", &get_logfile, 0); +$answer = "ok\n$make_name: Circular d <- d dependency dropped.\noops\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 8: I don't grok why this is different than the above, but it is... +# +# Hmm... further testing indicates this might be timing-dependent? +# +#if ($parallel_jobs) { +# &run_make_with_options($makefile, "-j10 biz", &get_logfile, 0); +# $answer = "aaa\ntwo\nbbb\n"; +# &compare_output($answer, &get_logfile(1)); +#} + +unlink('foo','f1.h','f2.h'); + + +# TEST 9: make sure all rules in s double colon family get executed +# (Savannah bug #14334). +# + +&touch('one'); +&touch('two'); + +run_make_test(' +.PHONY: all +all: result + +result:: one + @echo $^ >>$@ + @echo $^ + +result:: two + @echo $^ >>$@ + @echo $^ + +', +'', +'one +two'); + +unlink('result','one','two'); + +# TEST 10: SV 33399 : check for proper backslash handling + +run_make_test(' +a\ xb :: ; @echo one +a\ xb :: ; @echo two +', + '', "one\ntwo\n"); + +# Test 11: SV 44742 : All double-colon rules should be run in parallel build. + +run_make_test('result :: 01 + @echo update + @touch $@ +result :: 02 + @echo update + @touch $@ +result :: 03 + @echo update + @touch $@ +result :: 04 + @echo update + @touch $@ +result :: 05 + @echo update + @touch $@ +01 02 03 04 05: + @touch 01 02 03 04 05 +', + '-j10 result', "update\nupdate\nupdate\nupdate\nupdate\n"); + +unlink('result', '01', '02', '03', '04', '05'); + +# Test 12: SV 44742 : Double-colon rules with parallelism + +run_make_test(' +root: all + echo root +all:: + echo all_one +all:: 3 + echo all_two +%: + sleep $* +', + '-rs -j2 1 2 root', "all_one\nall_two\nroot\n"); + +# SV 47995 : Parallel double-colon rules with FORCE + +run_make_test(' +all:: ; @echo one + +all:: joe ; @echo four + +joe: FORCE ; touch joe-is-forced + +FORCE: +', + '-j5', "one\ntouch joe-is-forced\nfour\n"); + +unlink('joe-is-forced'); + +# 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: diff --git a/third_party/make/tests/scripts/features/echoing b/third_party/make/tests/scripts/features/echoing new file mode 100644 index 00000000000..a666a263073 --- /dev/null +++ b/third_party/make/tests/scripts/features/echoing @@ -0,0 +1,64 @@ +# -*-perl-*- +$description = "The following test creates a makefile to test command +echoing. It tests that when a command line starts with +a '\@', the echoing of that line is suppressed. It also +tests the -n option which tells make to ONLY echo the +commands and no execution happens. In this case, even +the commands with '\@' are printed. Lastly, it tests the +-s flag which tells make to prevent all echoing, as if +all commands started with a '\@'."; + +$details = "This test is similar to the 'clean' test except that a '\@' has +been placed in front of the delete command line. Four tests +are run here. First, make is run normally and the first echo +command should be executed. In this case there is no '\@' so +we should expect make to display the command AND display the +echoed message. Secondly, make is run with the clean target, +but since there is a '\@' at the beginning of the command, we +expect no output; just the deletion of a file which we check +for. Third, we give the clean target again except this time +we give make the -n option. We now expect the command to be +displayed but not to be executed. In this case we need only +to check the output since an error message would be displayed +if it actually tried to run the delete command again and the +file didn't exist. Lastly, we run the first test again with +the -s option and check that make did not echo the echo +command before printing the message.\n"; + +$example = "EXAMPLE_FILE"; + +touch($example); + +# TEST #1 +# ------- + +run_make_test(" +all: +\techo This makefile did not clean the dir... good +clean: +\t\@$CMD_rmfile $example\n", + '', 'echo This makefile did not clean the dir... good +This makefile did not clean the dir... good'); + +# TEST #2 +# ------- + +run_make_test(undef, 'clean', ''); +if (-f $example) { + $test_passed = 0; + unlink($example); +} + +# TEST #3 +# ------- + +run_make_test(undef, '-n clean', "$CMD_rmfile $example\n"); + + +# TEST #4 +# ------- + +run_make_test(undef, '-s', "This makefile did not clean the dir... good\n"); + + +1; diff --git a/third_party/make/tests/scripts/features/errors b/third_party/make/tests/scripts/features/errors new file mode 100644 index 00000000000..f236d517249 --- /dev/null +++ b/third_party/make/tests/scripts/features/errors @@ -0,0 +1,105 @@ +# -*-perl-*- + +$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"); + +# TEST #1 +# ------- + +run_make_test(undef, " -i two", + "exit 1\n#MAKE#: [#MAKEFILE#:6: two] Error 1 (ignored)\nexit 0\n"); + +# TEST #2 +# ------- + +# Test that error line offset works + +run_make_test(qq! +all: +\t\@echo hi +\t\@echo there +\t\@exit 1 +!, + '', "hi\nthere\n#MAKE#: *** [#MAKEFILE#:5: all] Error 1", 512); + +# TEST #3 +# ------- + +# Try failing due to unknown command +my $unk = './foobarbazbozblat'; +unlink($unk); + +my $err = $ERR_no_such_file; + +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"); + +# TEST #4 +# ------- + +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"); + +# TEST #5 +# ------- + +run_make_test(undef, 'two', + "$unk aa bb\n#MAKE#: $unk: $err\n#MAKE#: *** [#MAKEFILE#:2: two] Error 127\n", 512); + +# SV #56918 : Test the unknown command as the second recipe line + +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); + +# Try failing due to non-executable file + +if ($ERR_nonexe_file) { + my $noexe = './barfooblatboz'; + touch($noexe); + + 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"); + + unlink($noexe); +} + +# Try failing by "running" a directory + +if ($ERR_exe_dir) { + mkdir('sd', 0775); + + run_make_test(q! +PATH := . +all: ; sd +!, + '', "sd\n#MAKE#: sd: $ERR_exe_dir\n#MAKE#: *** [#MAKEFILE#:3: all] Error 127", 512); + + run_make_test(q! +all: ; ./sd +!, + '', "./sd\n#MAKE#: ./sd: $ERR_exe_dir\n#MAKE#: *** [#MAKEFILE#:2: all] Error 127", 512); + + rmdir('sd'); +} + +1; diff --git a/third_party/make/tests/scripts/features/escape b/third_party/make/tests/scripts/features/escape new file mode 100644 index 00000000000..5157a977ecc --- /dev/null +++ b/third_party/make/tests/scripts/features/escape @@ -0,0 +1,103 @@ +# -*-perl-*- +$description = "Test various types of escaping in makefiles."; + +$details = "\ +Make sure that escaping of ':' works in target names. +Make sure escaping of whitespace works in target names. +Make sure that escaping of '#' works. +Make sure that backslash before non-special characters are kept."; + + +# TEST 1 + +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)'); + +# TEST 2: This one should fail, since the ":" is unquoted. + +run_make_test(undef, + 'NOESC=1', + "#MAKEFILE#:12: *** target pattern contains no '%'. Stop.", + 512); + +# TEST 3: This one should work, since we escape the ":". + +run_make_test(undef, + 'ONEESC=1', + 'touch (pre:foo)'); + +# TEST 4: This one should fail, since the escape char is escaped. + +run_make_test(undef, + '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)'); + +# TEST 6: Test escaped comments + +run_make_test(undef, + 'sharp', + 'foo#bar.ext = (foo#bar.ext)'); + +# Test escaped colons in prerequisites +# Quoting of backslashes in q!! is kind of messy. +# Solaris sh does not properly handle backslashes even in '' so just +# check the output make prints, not what the shell interprets. +run_make_test(q! +foo: foo\\:bar foo\\\\\\:bar foo\\\\\\\\\\:bar +foo foo\\:bar foo\\\\\\:bar foo\\\\\\\\\\:bar: ; : '$@' +!, + '', ": 'foo:bar'\n: 'foo\\:bar'\n: 'foo\\\\:bar'\n: 'foo'\n"); + +# Test backslash before non-special chars: should be kept as-is + +run_make_test(q! +all: ..\foo +.DEFAULT: ; : '$@' +!, + '', ": '..\\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/third_party/make/tests/scripts/features/exec b/third_party/make/tests/scripts/features/exec new file mode 100644 index 00000000000..91181f4eb3c --- /dev/null +++ b/third_party/make/tests/scripts/features/exec @@ -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/third_party/make/tests/scripts/features/export b/third_party/make/tests/scripts/features/export new file mode 100644 index 00000000000..81bff0c31e5 --- /dev/null +++ b/third_party/make/tests/scripts/features/export @@ -0,0 +1,186 @@ +# -*-perl-*- +$description = "Check GNU make export/unexport commands."; + +$details = ""; + +# The test driver cleans out our environment for us so we don't have to worry +# about that here. + +&run_make_test(' +FOO = foo +BAR = bar +BOZ = boz + +export BAZ = baz +export BOZ + +BITZ = bitz +BOTZ = botz + +export BITZ BOTZ +unexport BOTZ + +ifdef EXPORT_ALL +export +endif + +ifdef UNEXPORT_ALL +unexport +endif + +ifdef EXPORT_ALL_PSEUDO +.EXPORT_ALL_VARIABLES: +endif + +all: + @echo "FOO=$(FOO) BAR=$(BAR) BAZ=$(BAZ) BOZ=$(BOZ) BITZ=$(BITZ) BOTZ=$(BOTZ)" + @echo "FOO=$$FOO BAR=$$BAR BAZ=$$BAZ BOZ=$$BOZ BITZ=$$BITZ BOTZ=$$BOTZ" +', + '', "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO= BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 1: make sure vars inherited from the parent are exported + +$extraENV{FOO} = 1; + +&run_make_test(undef, '', "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO=foo BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 2: global export. Explicit unexport takes precedence. + +run_make_test(undef, "EXPORT_ALL=1" , + "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 3: global unexport. Explicit export takes precedence. + +&run_make_test(undef, "UNEXPORT_ALL=1", + "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO= BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 4: both: in the above makefile the unexport comes last so that rules. + +&run_make_test(undef, "EXPORT_ALL=1 UNEXPORT_ALL=1", + "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO= BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 5: test the pseudo target. + +&run_make_test(undef, "EXPORT_ALL_PSEUDO=1", + "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 6: Test the expansion of variables inside export + +&run_make_test(' +foo = f-ok +bar = b-ok + +FOO = foo +F = f + +BAR = bar +B = b + +export $(FOO) +export $(B)ar + +all: + @echo foo=$(foo) bar=$(bar) + @echo foo=$$foo bar=$$bar +', + "", "foo=f-ok bar=b-ok\nfoo=f-ok bar=b-ok\n"); + +# TEST 7: Test the expansion of variables inside unexport + +&run_make_test(' +foo = f-ok +bar = b-ok + +FOO = foo +F = f + +BAR = bar +B = b + +export foo bar + +unexport $(FOO) +unexport $(B)ar + +all: + @echo foo=$(foo) bar=$(bar) + @echo foo=$$foo bar=$$bar +', + '', "foo=f-ok bar=b-ok\nfoo= bar=\n"); + +# TEST 7: Test exporting multiple variables on the same line + +&run_make_test(' +A = a +B = b +C = c +D = d +E = e +F = f +G = g +H = h +I = i +J = j + +SOME = A B C + +export F G H I J + +export D E $(SOME) + +all: ; @echo A=$$A B=$$B C=$$C D=$$D E=$$E F=$$F G=$$G H=$$H I=$$I J=$$J +', + '', "A=a B=b C=c D=d E=e F=f G=g H=h I=i J=j\n"); + +# TEST 8: Test unexporting multiple variables on the same line + +@extraENV{qw(A B C D E F G H I J)} = qw(1 2 3 4 5 6 7 8 9 10); + +&run_make_test(' +A = a +B = b +C = c +D = d +E = e +F = f +G = g +H = h +I = i +J = j + +SOME = A B C + +unexport F G H I J + +unexport D E $(SOME) + +all: ; @echo A=$$A B=$$B C=$$C D=$$D E=$$E F=$$F G=$$G H=$$H I=$$I J=$$J +', + '', "A= B= C= D= E= F= G= H= I= J=\n"); + +# TEST 9: Check setting a variable named "export" + +&run_make_test(' +export = 123 +export export +export export = 456 +a: ; @echo "\$$(export)=$(export) / \$$export=$$export" +', + '', "\$(export)=456 / \$export=456\n"); + +# TEST 9: Check "export" as a target + +&run_make_test(' +a: export +export: ; @echo "$@" +', + '', "export\n"); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/features/grouped_targets b/third_party/make/tests/scripts/features/grouped_targets new file mode 100644 index 00000000000..615e9627b2b --- /dev/null +++ b/third_party/make/tests/scripts/features/grouped_targets @@ -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; diff --git a/third_party/make/tests/scripts/features/include b/third_party/make/tests/scripts/features/include new file mode 100644 index 00000000000..0c63c067bc6 --- /dev/null +++ b/third_party/make/tests/scripts/features/include @@ -0,0 +1,263 @@ +# -*-mode: perl; rm-trailing-spaces: nil-*- + +$description = "Test various forms of the GNU make 'include' command."; + +$details = "\ +Test include, -include, sinclude and various regressions involving them. +Test extra whitespace at the end of the include, multiple -includes and +sincludes (should not give an error) and make sure that errors are reported +for targets that were also -included."; + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); + +# The contents of the Makefile ... + +print MAKEFILE < $makefile2"); + +print MAKEFILE "ANOTHER: ; \@echo This is another included makefile\n"; + +close(MAKEFILE); + +# Create the answer to what should be produced by this Makefile +&run_make_with_options($makefile, "all", &get_logfile); +$answer = "There should be no errors for this makefile.\n"; +&compare_output($answer, &get_logfile(1)); + +&run_make_with_options($makefile, "ANOTHER", &get_logfile); +$answer = "This is another included makefile\n"; +&compare_output($answer, &get_logfile(1)); + +$makefile = undef; + +# Try to build the "error" target; this will fail since we don't know +# how to create makeit.mk, but we should also get a message (even though +# the -include suppressed it during the makefile read phase, we should +# see one during the makefile run phase). + +run_make_test + (' +-include foo.mk +error: foo.mk ; @echo $@ +', + '', + "#MAKE#: *** No rule to make target 'foo.mk', needed by 'error'. Stop.\n", + 512 + ); + +# Make sure that target-specific variables don't impact things. This could +# happen because a file record is created when a target-specific variable is +# set. + +run_make_test + (' +bar.mk: foo := baz +-include bar.mk +hello: ; @echo hello +', + '', + "hello\n" + ); + + +# Test inheritance of dontcare flag when rebuilding makefiles. +# +run_make_test(' +.PHONY: all +all: ; @: + +-include foo + +foo: bar; @: +', '', ''); + + +# Make sure that we don't die when the command fails but we dontcare. +# (Savannah bug #13216). +# +run_make_test(' +.PHONY: all +all:; @: + +-include foo + +foo: bar; @: + +bar:; @exit 1 +', '', ''); + +# Check include, sinclude, -include with no filenames. +# (Savannah bug #1761). + +run_make_test(' +.PHONY: all +all:; @: +include +-include +sinclude', '', ''); + + +# Test that the diagnostics is issued even if the target has been +# tried before with the dontcare flag (direct dependency case). +# +run_make_test(' +-include foo + +all: bar + +foo: baz +bar: baz +', +'', +"#MAKE#: *** No rule to make target 'baz', needed by 'bar'. Stop.\n", +512); + +# Test that the diagnostics is issued even if the target has been +# tried before with the dontcare flag (indirect dependency case). +# +run_make_test(' +-include foo + +all: bar + +foo: baz +bar: baz +baz: end +', +'', +"#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 +default:; @echo DONE + +inc1:; echo > $@ +include inc1 +include inc2 +inc2:; echo > $@ +!, + '', "echo > inc2\necho > inc1\nDONE\n"); + +rmfiles('inc1', 'inc2'); + +# No target gets correct error +run_make_test('', '', '#MAKE#: *** No targets. Stop.', 512); + +# 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 + +run_make_test(q! +default:; @echo DEFAULT +include inc1 +inc1:; echo > $@ +include inc1 +!, + '', "echo > inc1\nDEFAULT\n"); + +rmfiles('inc1'); + +if (defined $ERR_no_such_file) { + + # 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: $ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:5: foo] Error 1\n", 512); + + rmfiles('inc1'); + + # Included file has a prerequisite we don't know how to build + + run_make_test(q! +default:; @echo DEFAULT +include inc1 +inc1: foo; echo > $@ +!, + '', "#MAKEFILE#:3: inc1: $ERR_no_such_file\n#MAKE#: *** No rule to make target 'foo', needed by 'inc1'. Stop.\n", 512); + + rmfiles('inc1'); +} + +# Including files that can't be read should show an error +if (defined $ERR_unreadable_file) { + create_file('inc1', 'FOO := foo'); + chmod 0000, 'inc1'; + + run_make_test(q! +include inc1 +all:;@echo $(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; diff --git a/third_party/make/tests/scripts/features/jobserver b/third_party/make/tests/scripts/features/jobserver new file mode 100644 index 00000000000..73d10d9f109 --- /dev/null +++ b/third_party/make/tests/scripts/features/jobserver @@ -0,0 +1,109 @@ +# -*-perl-*- + +$description = "Test jobserver."; + +$details = "These tests are ones that specifically are different when the +jobserver feature is available. Most -j tests are the same whether or not +jobserver is available, and those appear in the 'parallelism' test suite."; + +exists $FEATURES{'jobserver'} or return -1; + +if (!$parallel_jobs) { + return -1; +} + +# Shorthand +my $np = '--no-print-directory'; + +# Simple test of MAKEFLAGS settings +run_make_test(q! +SHOW = $(patsubst --jobserver-auth=%,--jobserver-auth=,$(MAKEFLAGS)) +recurse: ; @echo $@: "/$(SHOW)/"; $(MAKE) -f #MAKEFILE# all +all:;@echo $@: "/$(SHOW)/" +!, + "-j2 $np", "recurse: /-j2 --jobserver-auth= $np/\nall: /-j2 --jobserver-auth= $np/\n"); + +# Setting parallelism with the environment +# Command line should take precedence over the environment +$extraENV{MAKEFLAGS} = "-j2 $np"; +run_make_test(q! +SHOW = $(patsubst --jobserver-auth=%,--jobserver-auth=,$(MAKEFLAGS)) +recurse: ; @echo $@: "/$(SHOW)/"; $(MAKE) -f #MAKEFILE# all +all:;@echo $@: "/$(SHOW)/" +!, + '', "recurse: /-j2 --jobserver-auth= $np/\nall: /-j2 --jobserver-auth= $np/\n"); +delete $extraENV{MAKEFLAGS}; + +# Test override of -jN +$extraENV{MAKEFLAGS} = "-j9 $np"; +run_make_test(q! +SHOW = $(patsubst --jobserver-auth=%,--jobserver-auth=,$(MAKEFLAGS)) +recurse: ; @echo $@: "/$(SHOW)/"; $(MAKE) -j3 -f #MAKEFILE# recurse2 +recurse2: ; @echo $@: "/$(SHOW)/"; $(MAKE) -f #MAKEFILE# all +all:;@echo $@: "/$(SHOW)/" +!, + "-j2 $np", "recurse: /-j2 --jobserver-auth= $np/\n#MAKE#[1]: warning: -j3 forced in submake: resetting jobserver mode.\nrecurse2: /-j3 --jobserver-auth= $np/\nall: /-j3 --jobserver-auth= $np/\n"); +delete $extraENV{MAKEFLAGS}; + +# Test override of -jN with -j +run_make_test(q! +SHOW = $(patsubst --jobserver-auth=%,--jobserver-auth=,$(MAKEFLAGS)) +recurse: ; @echo $@: "/$(SHOW)/"; $(MAKE) -j -f #MAKEFILE# recurse2 +recurse2: ; @echo $@: "/$(SHOW)/"; $(MAKE) -f #MAKEFILE# all +all:;@echo $@: "/$(SHOW)/" +!, + "-j2 $np", "recurse: /-j2 --jobserver-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 +# show the value of MAKEFLAGS we were re-exec'd with. We can intuit it +# by looking for "disabling jobserver mode" warnings; we should only +# get one from the original invocation and none from the re-exec. +# See Savannah bug #18124 + +unlink('inc.mk'); + +run_make_test(q! +-include inc.mk +recur: +# @echo 'MAKEFLAGS = $(MAKEFLAGS)' + @rm -f inc.mk + @$(MAKE) -j2 -f #MAKEFILE# all +all: +# @echo 'MAKEFLAGS = $(MAKEFLAGS)' + @echo $@ +inc.mk: +# @echo 'MAKEFLAGS = $(MAKEFLAGS)' + @echo 'FOO = bar' > $@ +!, + "$np -j2", "#MAKE#[1]: warning: -j2 forced in submake: resetting jobserver mode.\nall\n"); + +unlink('inc.mk'); + +# Test recursion which is hidden from make. +# See Savannah bug #39934 +# Or Red Hat bug https://bugzilla.redhat.com/show_bug.cgi?id=885474 +# 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'); +} + +1; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/features/load b/third_party/make/tests/scripts/features/load new file mode 100644 index 00000000000..fa4b86f6cb1 --- /dev/null +++ b/third_party/make/tests/scripts/features/load @@ -0,0 +1,118 @@ +# -*-perl-*- +$description = "Test the load operator."; + +$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 + +unlink(qw(testload.c testload.so)); + +open(my $F, '> testload.c') or die "open: testload.c: $!\n"; +print $F <<'EOF' ; +#include +#include + +#include "gnumake.h" + +int plugin_is_GPL_compatible; + +int +testload_gmk_setup (gmk_floc *pos) +{ + (void)pos; + gmk_eval ("TESTLOAD = implicit", 0); + return 1; +} + +int +explicit_setup (gmk_floc *pos) +{ + (void)pos; + gmk_eval ("TESTLOAD = explicit", 0); + return 1; +} +EOF +close($F) or die "close: testload.c: $!\n"; + +# 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 testload.so testload.c"; + +my $clog = `$sobuild 2>&1`; +if ($? != 0) { + $verbose and print "Failed to build testload.so:\n$sobuild\n$_"; + return -1; +} + +# TEST 1 +run_make_test(q! +PRE := $(.LOADED) +load testload.so +POST := $(.LOADED) +all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD) +!, + '--warn-undefined-variables', "pre= post=testload.so implicit\n"); + +# TEST 2 +# Load using an explicit function +run_make_test(q! +PRE := $(.LOADED) +load ./testload.so(explicit_setup) +POST := $(.LOADED) +all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD) +!, + '', "pre= post=testload.so explicit\n"); + +# TEST 4 +# Check multiple loads +run_make_test(q! +PRE := $(.LOADED) +load ./testload.so +load testload.so(explicit_setup) +POST := $(.LOADED) +all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD) +!, + '', "pre= post=testload.so implicit\n"); + +# TEST 5 +# Check auto-rebuild of loaded file that's out of date +utouch(-10, 'testload.so'); +touch('testload.c'); + +run_make_test(q! +PRE := $(.LOADED) +load ./testload.so +POST := $(.LOADED) +all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD) +testload.so: testload.c ; @echo "rebuilding $@"; !.$sobuild, + '', "rebuilding testload.so\npre= post=testload.so implicit\n"); + +# TEST 5 +# Check auto-rebuild of loaded file when it doesn't exist +unlink('testload.so'); + +run_make_test(q! +PRE := $(.LOADED) +-load ./testload.so(explicit_setup) +POST := $(.LOADED) +all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD) +%.so: %.c ; @echo "rebuilding $@"; !.$sobuild, + '', "rebuilding testload.so\npre= post=testload.so explicit\n"); + +unlink(qw(testload.c testload.so)) unless $keep; + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/features/loadapi b/third_party/make/tests/scripts/features/loadapi new file mode 100644 index 00000000000..ba149281985 --- /dev/null +++ b/third_party/make/tests/scripts/features/loadapi @@ -0,0 +1,127 @@ +# -*-perl-*- +$description = "Test the shared object load API."; + +$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 + +unlink(qw(testapi.c testapi.so)); + +open(my $F, '> testapi.c') or die "open: testapi.c: $!\n"; +print $F <<'EOF' ; +#include +#include + +#include "gnumake.h" + +int plugin_is_GPL_compatible; + +static char * +test_eval (const char *buf) +{ + gmk_eval (buf, 0); + return NULL; +} + +static char * +test_expand (const char *val) +{ + return gmk_expand (val); +} + +static char * +test_noexpand (const char *val) +{ + char *str = gmk_alloc (strlen (val) + 1); + strcpy (str, val); + return str; +} + +static char * +func_test (const char *funcname, unsigned int argc, char **argv) +{ + char *mem; + + if (strcmp (funcname, "test-expand") == 0) + return test_expand (argv[0]); + + if (strcmp (funcname, "test-eval") == 0) + return test_eval (argv[0]); + + if (strcmp (funcname, "test-noexpand") == 0) + return test_noexpand (argv[0]); + + mem = gmk_alloc (sizeof ("unknown")); + strcpy (mem, "unknown"); + return mem; +} + +int +testapi_gmk_setup () +{ + gmk_add_function ("test-expand", func_test, 1, 1, GMK_FUNC_DEFAULT); + gmk_add_function ("test-noexpand", func_test, 1, 1, GMK_FUNC_NOEXPAND); + gmk_add_function ("test-eval", func_test, 1, 1, GMK_FUNC_DEFAULT); + gmk_add_function ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.", func_test, 0, 0, 0); + return 1; +} +EOF +close($F) or die "close: testapi.c: $!\n"; + +# 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) { + $verbose and print "Failed to build testapi.so:\n$sobuild\n$_"; + return -1; +} + +# TEST 1 +# Check the gmk_expand() function +run_make_test(q! +EXPAND = expansion +all: ; @echo $(test-expand $$(EXPAND)) +load testapi.so +!, + '', "expansion\n"); + +# TEST 2 +# Check the eval operation. Prove that the argument is expanded only once +run_make_test(q! +load testapi.so +TEST = bye +ASSIGN = VAR = $(TEST) $(shell echo there) +$(test-eval $(value ASSIGN)) +TEST = hi +all:;@echo '$(VAR)' +!, + '', "hi there\n"); + +# TEST 2 +# Check the no-expand capability +run_make_test(q! +load testapi.so +TEST = hi +all:;@echo '$(test-noexpand $(TEST))' +!, + '', "\$(TEST)\n"); + +unlink(qw(testapi.c testapi.so)) unless $keep; + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/features/mult_rules b/third_party/make/tests/scripts/features/mult_rules new file mode 100644 index 00000000000..e706e17d102 --- /dev/null +++ b/third_party/make/tests/scripts/features/mult_rules @@ -0,0 +1,78 @@ +$description = "\ +The following test creates a makefile to test the presence +of multiple rules for one target. One file can be the +target of several rules if at most one rule has commands; +the other rules can only have dependencies."; + +$details = "\ +The makefile created in this test contains two hardcoded rules +for foo.o and bar.o. It then gives another multiple target rule +with the same names as above but adding more dependencies. +Additionally, another variable extradeps is listed as a +dependency but is defined to be null. It can however be defined +on the make command line as extradeps=extra.h which adds yet +another dependency to the targets."; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE < $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "bigoutput littleoutput: test.h\n"; +print MAKEFILE "\t\@echo I am \$(subst output,,\$@)\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&touch("test.h"); + +&run_make_with_options($makefile,"bigoutput",&get_logfile); + + +# Create the answer to what should be produced by this Makefile +$answer = "I am big\n"; + +&compare_output($answer,&get_logfile(1)); + +&run_make_with_options($makefile,"littleoutput",&get_logfile); +$answer = "I am little\n"; +&compare_output($answer,&get_logfile(1)); + +unlink "test.h"; + +1; + + + + + + diff --git a/third_party/make/tests/scripts/features/order_only b/third_party/make/tests/scripts/features/order_only new file mode 100644 index 00000000000..4ebdc2b8da8 --- /dev/null +++ b/third_party/make/tests/scripts/features/order_only @@ -0,0 +1,118 @@ +# -*-perl-*- +$description = "Test order-only prerequisites."; + +$details = "\ +Create makefiles with various combinations of normal and order-only +prerequisites and ensure they behave properly. Test the \$| variable."; + +# TEST #0 -- Basics + +run_make_test(' +%r: | baz ; @echo $< $^ $| +bar: foo +foo:;@: +baz:;@:', + '', "foo foo baz\n"); + +# TEST #1 -- First try: the order-only prereqs need to be built. + +run_make_test(q! +foo: bar | baz + @echo '$$^ = $^' + @echo '$$| = $|' + touch $@ + +.PHONY: baz + +bar baz: + touch $@!, + '', "touch bar\ntouch baz\n\$^ = bar\n\$| = baz\ntouch foo\n"); + + +# TEST #2 -- now we do it again: baz is PHONY but foo should _NOT_ be updated + +run_make_test(undef, '', "touch baz\n"); + +unlink(qw(foo bar baz)); + +# TEST #3 -- Make sure the order-only prereq was promoted to normal. + +run_make_test(q! +foo: bar | baz + @echo '$$^ = $^' + @echo '$$| = $|' + touch $@ + +foo: baz + +.PHONY: baz + +bar baz: + touch $@!, + '', "touch bar\ntouch baz\n\$^ = bar baz\n\$| = \ntouch foo\n"); + + +# TEST #4 -- now we do it again + +run_make_test(undef, '', "touch baz\n\$^ = bar baz\n\$| = \ntouch foo\n"); + +unlink(qw(foo bar baz)); + +# Test empty normal prereqs + +# TEST #5 -- make sure the parser was correct. + +run_make_test(q! +foo:| baz + @echo '$$^ = $^' + @echo '$$| = $|' + touch $@ + +.PHONY: baz + +baz: + touch $@!, + '', "touch baz\n\$^ = \n\$| = baz\ntouch foo\n"); + +# TEST #6 -- now we do it again: this time foo won't be built + +run_make_test(undef, '', "touch baz\n"); + +unlink(qw(foo baz)); + +# Test order-only in pattern rules + +# TEST #7 -- make sure the parser was correct. + +run_make_test(q! +%.w : %.x | baz + @echo '$$^ = $^' + @echo '$$| = $|' + touch $@ + +all: foo.w + +.PHONY: baz +foo.x baz: + touch $@!, + '', + "touch foo.x\ntouch baz\n\$^ = foo.x\n\$| = baz\ntouch foo.w\n"); + +# TEST #8 -- now we do it again: this time foo.w won't be built + +run_make_test(undef, '', "touch baz\n"); + +unlink(qw(foo.w foo.x baz)); + +# TEST #9 -- make sure that $< is set correctly in the face of order-only +# prerequisites in pattern rules. + +run_make_test(' +%r: | baz ; @echo $< $^ $| +bar: foo +foo:;@: +baz:;@:', + '', "foo foo baz\n"); + + +1; diff --git a/third_party/make/tests/scripts/features/output-sync b/third_party/make/tests/scripts/features/output-sync new file mode 100644 index 00000000000..1d09174f294 --- /dev/null +++ b/third_party/make/tests/scripts/features/output-sync @@ -0,0 +1,342 @@ +# -*-perl-*- + +$description = "Test --output-sync (-O) option."; + +$details = "Test the synchronization of output from parallel jobs."; + +# If we don't have output sync support, never mind. +exists $FEATURES{'output-sync'} or return -1; + +# Output sync can't be tested without parallelization +$parallel_jobs or return -1; + + +# 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 +# bar/Makefile - has a "bar" target that runs immediately +# - has a "baz" target that waits for the foo target +# +# So, you start the two sub-makes in parallel and first the "bar" target is +# built, followed by "foo", followed by "baz". The trick is that first each +# target prints a "start" statement, then waits (if appropriate), then prints +# an end statement. Thus we can tell if the -O flag is working, since +# otherwise these statements would be mixed together. + +@syncfiles = (); + +sub output_sync_clean { + rmfiles('foo/Makefile', 'bar/Makefile', @syncfiles); + rmdir('foo'); + rmdir('bar'); +} + +# We synchronize the different jobs by having them wait for a sentinel file to +# be created, instead of relying on a certain amount of time passing. +# Unfortunately in this test we have to sleep after we see the sync file, +# since we also want to make the obtaining of the write synchronization lock +# 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 subst_make_string("#HELPER# -q wait ../mksync.$_[0] sleep 1"); +} +sub output_sync_set { + return subst_make_string("#HELPER# -q file ../mksync.$_[0]"); +} + +@syncfiles = qw(mksync.foo mksync.foo_start mksync.bar mksync.bar_start); + +$tmout = 30; + +output_sync_clean(); +mkdir('foo', 0777); +mkdir('bar', 0777); + +$set_foo = output_sync_set('foo'); +$set_bar = output_sync_set('bar'); +$set_foo_start = output_sync_set('foo_start'); +$set_bar_start = output_sync_set('bar_start'); + +$wait_foo = output_sync_wait('foo'); +$wait_bar = output_sync_wait('bar'); +$wait_foo_start = output_sync_set('foo_start'); +$wait_bar_start = output_sync_set('bar_start'); + +open(MAKEFILE,"> foo/Makefile"); +print MAKEFILE < bar/Makefile"); +print MAKEFILE <&2) +!, + '-w -Oline', "#MAKE#: Entering directory '#PWD#'\nfoo\n#MAKE#: Leaving directory '#PWD#'\n"); + +# Ensure that output generated while parsing makefiles is synced +# when appropriate. +run_make_test(q! +$(shell echo foo 1>&2) +all: ; echo bar +!, + '-s -w -Otarget', "#MAKE#: Entering directory '#PWD#'\nfoo\n#MAKE#: Leaving directory '#PWD#'\n#MAKE#: Entering directory '#PWD#'\nbar\n#MAKE#: Leaving directory '#PWD#'\n"); + +# Test recursion +$m1 = get_tmpfile(); +$m2 = get_tmpfile(); + +open(M1, "> $m1"); +print M1 <<'EOF'; +$(shell echo d1 stderr 1>&2) +$(info d1 stdout) +all:; @: +EOF +close(M1); + +open(M2, "> $m2"); +print M2 <<'EOF'; +$(shell echo d2 stderr 1>&2) +$(info d2 stdout) +all:; @: +# Force an ordering on the output +$(shell sleep 1) +EOF +close(M2); + +run_make_test(qq! +all: t1 t2 +t1: ; \@\$(MAKE) -f $m1 +t2: ; \@\$(MAKE) -f $m2 +!, + "-j -Oline", "#MAKE#[1]: Entering directory '#PWD#'\nd1 stderr\nd1 stdout\n#MAKE#[1]: Leaving directory '#PWD#'\n#MAKE#[1]: Entering directory '#PWD#'\nd2 stderr\nd2 stdout\n#MAKE#[1]: Leaving directory '#PWD#'\n"); + +rmfiles($m1, $m2); + +# Ensure that output generated while parsing makefiles is synced +# when appropriate. +$m1 = get_tmpfile(); + +open(M1, "> $m1"); +print M1 <<'EOF'; +$(shell echo d1 stderr 1>&2) +$(info d1 stdout) +$(error d1 failed) +all:; @: +EOF +close(M1); + +run_make_test(qq! +all: t1 +t1: ; -\@\$(MAKE) -f $m1 +!, + "-j -Oline", "#MAKE#[1]: Entering directory '#PWD#'\nd1 stderr\nd1 stdout\n$m1:3: *** d1 failed. Stop.\n#MAKE#[1]: Leaving directory '#PWD#'\n#MAKE#: [#MAKEFILE#:3: t1] Error 2 (ignored)\n"); + +rmfiles($m1); + +# Test $(error ...) functions in recipes + +run_make_test(q! +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 +# Needs to be ported to Windows +if ($port_type ne 'W32') { + run_make_test(q! +all:: ; @./foo bar baz +!, + '-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; diff --git a/third_party/make/tests/scripts/features/override b/third_party/make/tests/scripts/features/override new file mode 100644 index 00000000000..fff6c4e8273 --- /dev/null +++ b/third_party/make/tests/scripts/features/override @@ -0,0 +1,45 @@ +# -*-perl-*- + +$description = "Test the override directive on variable assignments."; + +$details = ""; + +# TEST 0: Basic override + +run_make_test(' +X = start +override recur = $(X) +override simple := $(X) +X = end +all: ; @echo "$(recur) $(simple)" +', + 'recur=I simple=J', "end start\n"); + +# TEST 1: Override with append + +run_make_test(' +X += X1 +override X += X2 +override Y += Y1 +Y += Y2 +all: ; @echo "$(X) $(Y)" +', + '', "X1 X2 Y1\n"); + +# TEST 2: Override with append to the command line + +run_make_test(undef, 'X=C Y=C', "C X2 C Y1\n"); + +# Test override of define/endef + +run_make_test(' +override define foo +@echo First comes the definition. +@echo Then comes the override. +endef +all: ; $(foo) +', + 'foo=Hello', "First comes the definition.\nThen comes the override.\n"); + + +1; diff --git a/third_party/make/tests/scripts/features/parallelism b/third_party/make/tests/scripts/features/parallelism new file mode 100644 index 00000000000..08f94a6b630 --- /dev/null +++ b/third_party/make/tests/scripts/features/parallelism @@ -0,0 +1,253 @@ +# -*-perl-*- + +$description = "Test parallelism (-j) option."; +$details = ""; + +if (!$parallel_jobs) { + return -1; +} + +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 : ; \@#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; \@#HELPER# out success +-include 1.inc 2.inc +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", + "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; \@#HELPER# out success + +INC = no +ifeq (\$(INC),yes) +-include 1.inc 2.inc +endif + +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", + "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 ...) +# function in an exported recursive variable. I added some code to check +# for this situation and print a message if it occurred. This test used +# to trigger this code when I added it but no longer does after the fix. +# We have to increase the timeout from the default (5s) on this test. + +run_make_test(" +export HI = \$(shell \$(\$\@.CMD)) +first.CMD = #HELPER# out hi +second.CMD = #HELPER# sleep 4 + +.PHONY: all first second +all: first second + +first second: ; \@#HELPER# out \$\@ sleep 1 out \$\@", + '-j2', "first\nsleep 1\nfirst\nsecond\nsleep 1\nsecond", 0, 7); + +# Michael Matz 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 +# other, then make will quit without waiting for the rest of the jobs to die. + +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: +> \@#HELPER# sleep \$(patsubst fail.%,%,\$\@) +> \@#HELPER# out Fail +> \@#HELPER# fail 1 + +ok: +> \@#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.... +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); + + +# Test for Savannah bug #15641. +# +run_make_test(' +.PHONY: all +all:; @: + +-include foo.d + +foo.d: comp ; @#HELPER# out $@ + +comp: mod_a.o mod_b.o; @: + +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 ; #HELPER# file $@ + +.INTERMEDIATE: intermed +intermed: | phony ; #HELPER# file $@ + +.PHONY: phony +phony: ; : phony', '-rR -j', ': phony'); +rmfiles('target'); + +# TEST #11: Make sure -jN from MAKEFLAGS is processed even when we re-exec +# See Savannah bug #33873 + +$extraENV{MAKEFLAGS} = '-j4'; + +run_make_test(q! +things = thing1 thing2 +all: $(things) +thing1:; @#HELPER# wait thing2start file $@start wait thing2end out $@end +thing2:; @#HELPER# file $@start wait thing1start file $@end +-include inc.mk +inc.mk: ; @touch $@ +!, + '', "file thing2start\nwait thing2start\nfile thing1start\nwait thing1start\nfile thing2end\nwait thing2end\nthing1end\n"); + +delete $extraENV{MAKEFLAGS}; +rmfiles(qw(inc.mk thing1start thing1end thing2start thing2end)); + +# Ensure intermediate/secondary files are not pruned incorrectly. +# See Savannah bug #30653 + +utouch(-15, 'file2'); +utouch(-10, 'file4'); +utouch(-5, 'file1'); + +run_make_test(q! +.INTERMEDIATE: file3 +file4: file3 ; @mv -f $< $@ +file3: file2 ; touch $@ +file2: file1 ; @touch $@ +!, + '--no-print-directory -j2', "touch file3"); + +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 + +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. +# +# First, find the "default" file descriptors we normally use +# Then make sure they're still used. +# +# Right now we don't have a way to run a makefile and capture the output +# without checking it, so we can't really write this test. + +# run_make_test(' +# submake: ; @$(MAKE) --no-print-directory -f #MAKEFILE# fdprint 5>output + +# dependfile: ; @echo FOO=bar > $@ + +# INCL := true + +# FOO=foo +# ifeq ($(INCL),true) +# -include dependfile +# endif + +# fdprint: ; @echo $(filter --jobserver%,$(MAKEFLAGS)) + +# recurse: ; @$(MAKE) --no-print-directory -f #MAKEFILE# submake INCL=true', +# '-j2 INCL=false fdprint', +# 'bar'); + +# rmfiles(qw(dependfile output)); + + +# # Do it again, this time where the include is done by the non-master make. +# run_make_test(undef, '-j2 recurse INCL=false', 'bar'); + +# rmfiles(qw(dependfile output)); + +1; diff --git a/third_party/make/tests/scripts/features/patspecific_vars b/third_party/make/tests/scripts/features/patspecific_vars new file mode 100644 index 00000000000..a530bba10ac --- /dev/null +++ b/third_party/make/tests/scripts/features/patspecific_vars @@ -0,0 +1,148 @@ +# -*-perl-*- +$description = "Test pattern-specific variable settings."; + +$details = "\ +Create a makefile containing various flavors of pattern-specific variable +settings, override and non-override, and using various variable expansion +rules, semicolon interference, etc."; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +all: one.x two.x three.x +FOO = foo +BAR = bar +BAZ = baz +one.x: override FOO = one +%.x: BAR = two +t%.x: BAR = four +thr% : override BAZ = three +one.x two.x three.x: ; @echo $@: $(FOO) $(BAR) $(BAZ) +four.x: baz ; @echo $@: $(FOO) $(BAR) $(BAZ) +baz: ; @echo $@: $(FOO) $(BAR) $(BAZ) + +# test matching multiple patterns +a%: AAA = aaa +%b: BBB = ccc +a%: BBB += ddd +%b: AAA ?= xxx +%b: AAA += bbb +.PHONY: ab +ab: ; @echo $(AAA); echo $(BBB) +EOF + +close(MAKEFILE); + + +# TEST #1 -- basics + +&run_make_with_options($makefile, "", &get_logfile); +$answer = "one.x: one two baz\ntwo.x: foo four baz\nthree.x: foo four three\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST #2 -- try the override feature + +&run_make_with_options($makefile, "BAZ=five", &get_logfile); +$answer = "one.x: one two five\ntwo.x: foo four five\nthree.x: foo four three\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST #3 -- make sure patterns are inherited properly + +&run_make_with_options($makefile, "four.x", &get_logfile); +$answer = "baz: foo two baz\nfour.x: foo two baz\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST #4 -- test multiple patterns matching the same target + +&run_make_with_options($makefile, "ab", &get_logfile); +$answer = "aaa bbb\nccc ddd\n"; +&compare_output($answer,&get_logfile(1)); + +# TEST #5 -- test pattern-specific exported variables +# +run_make_test(' +/%: export foo := foo + +/bar: + @echo $(foo) $$foo +', '', 'foo foo'); + + +# TEST #6 -- test expansion of pattern-specific simple variables +# +run_make_test(' +.PHONY: all + +all: inherit := good $$t +all: bar baz + +b%: pattern := good $$t + +global := original $$t + + +# normal target +# +ifdef rec +bar: a = global: $(global) pattern: $(pattern) inherit: $(inherit) +else +bar: a := global: $(global) pattern: $(pattern) inherit: $(inherit) +endif + +bar: ; @echo \'normal: $a;\' + + +# pattern target +# +ifdef rec +%z: a = global: $(global) pattern: $(pattern) inherit: $(inherit) +else +%z: a := global: $(global) pattern: $(pattern) inherit: $(inherit) +endif + +%z: ; @echo \'pattern: $a;\' + + +global := new $$t +', +'', +'normal: global: original $t pattern: inherit: ; +pattern: global: original $t pattern: inherit: ;'); + + +# TEST #7 -- test expansion of pattern-specific recursive variables +# +run_make_test(undef, # reuse previous makefile +'rec=1', +'normal: global: new $t pattern: good $t inherit: good $t; +pattern: global: new $t pattern: good $t inherit: good $t;'); + +# TEST #8: override in pattern-specific variables + +run_make_test(' +a%: override FOO += f1 +a%: FOO += f2 +ab: ; @echo "$(FOO)" +', + '', "f1\n"); + +run_make_test(undef, 'FOO=C', "C f1\n"); + +# TEST #9: Test shortest stem selection in pattern-specific variables. + +run_make_test(' +%-mt.x: x := two +%.x: x := one + +all: foo.x foo-mt.x + +foo.x: ;@echo $x +foo-mt.x: ;@echo $x +', +'', +"one\ntwo"); + +1; diff --git a/third_party/make/tests/scripts/features/patternrules b/third_party/make/tests/scripts/features/patternrules new file mode 100644 index 00000000000..6510c3873ab --- /dev/null +++ b/third_party/make/tests/scripts/features/patternrules @@ -0,0 +1,252 @@ +# -*-perl-*- + +$description = "Test pattern rules."; + +$details = ""; + +use Cwd; + +$dir = cwd; +$dir =~ s,.*/([^/]+)$,../$1,; + + +# TEST #0: Make sure that multiple patterns where the same target +# can be built are searched even if the first one fails +# to match properly. +# + +run_make_test(q! +.PHONY: all + +all: case.1 case.2 case.3 + +# We can't have this, due to "Implicit Rule Search Algorithm" step 5c +#xxx: void + +# 1 - existing file +%.1: void + @exit 1 +%.1: #MAKEFILE# + @exit 0 + +# 2 - phony +%.2: void + @exit 1 +%.2: 2.phony + @exit 0 +.PHONY: 2.phony + +# 3 - implicit-phony +%.3: void + @exit 1 +%.3: 3.implicit-phony + @exit 0 + +3.implicit-phony: +!, '', ''); + +# TEST #1: make sure files that are built via implicit rules are marked +# as targets (Savannah bug #12202). +# +run_make_test(' +TARGETS := foo foo.out + +.PHONY: all foo.in + +all: $(TARGETS) + +%: %.in + @echo $@ + +%.out: % + @echo $@ + +foo.in: ; @: + +', +'', +'foo +foo.out'); + + +# TEST #2: make sure intermediate files that also happened to be +# prerequisites are not removed (Savannah bug #12267). +# +run_make_test(' +$(dir)/foo.o: + +$(dir)/foo.y: + @echo $@ + +%.c: %.y + touch $@ + +%.o: %.c + @echo $@ + +.PHONY: install +install: $(dir)/foo.c + +', +"dir=$dir", +"$dir/foo.y +touch $dir/foo.c +$dir/foo.o"); + +unlink("$dir/foo.c"); + + +# TEST #3: make sure precious flag is set properly for targets +# that are built via implicit rules (Savannah bug #13218). +# +run_make_test(' +.DELETE_ON_ERROR: + +.PRECIOUS: %.bar + +%.bar:; @touch $@ && exit 1 + +$(dir)/foo.bar: + +', +"dir=$dir", +"#MAKE#: *** [#MAKEFILE#:6: $dir/foo.bar] Error 1", +512); + +unlink("$dir/foo.bar"); + + +# TEST #4: make sure targets of a matched implicit pattern rule are +# never considered intermediate (Savannah bug #13022). +# +run_make_test(' +.PHONY: all +all: foo.c foo.o + +%.h %.c: %.in + touch $*.h + touch $*.c + +%.o: %.c %.h + echo $+ >$@ + +%.o: %.c + @echo wrong rule + +foo.in: + touch $@ + +', +'', +'touch foo.in +touch foo.h +touch foo.c +echo foo.c foo.h >foo.o'); + +unlink('foo.in', 'foo.h', 'foo.c', 'foo.o'); + +# TEST #5: make sure both prefix and suffix patterns work with multiple +# target patterns (Savannah bug #26593). +# +run_make_test(' +all: foo.s1 foo.s2 p1.foo p2.foo + +p1.% p2.%: %.orig + @echo $@ +%.s1 %.s2: %.orig + @echo $@ + +.PHONY: foo.orig +', + '', "foo.s1\np1.foo\n"); + +# 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(sprintf(q! +BIN = xyz +COPY = $(BIN).cp +SRC = $(BIN).c +allbroken: $(COPY) $(BIN) ; @echo ok +$(SRC): ; @echo 'main(){}' > $@ +%%.cp: %% ; @cp $< $@ +%% : %%.c ; @cp $< $@ +clean: ; @%s $(SRC) $(COPY) $(BIN) +!, $CMD_rmfile), + '', "ok\n"); + +unlink(qw(xyz xyz.cp xyz.c)); + +# TEST 7: Make sure that all prereqs of all "also_make" targets get created +# before any of the things that depend on any of them. Savannah bug #19108. + +run_make_test(q! +final: x ; @echo $@ +x: x.t1 x.t2 ; @echo $@ +x.t2: dep +dep: ; @echo $@ +%.t1 %.t2: ; @echo $*.t1 ; echo $*.t2 +!, + '', "dep\nx.t1\nx.t2\nx\nfinal\n"); + + +# TEST 8: Verify we can remove pattern rules. Savannah bug #18622. + +my @f = (qw(foo.w foo.ch)); +touch(@f); + +run_make_test(q! +CWEAVE := : + +# Disable builtin rules +%.tex : %.w +%.tex : %.w %.ch +!, + 'foo.tex', + "#MAKE#: *** No rule to make target 'foo.tex'. Stop.", 512); + +unlink(@f); + +# TEST #9: Test shortest stem selection in pattern rules. + +run_make_test(' +%.x: ;@echo one +%-mt.x: ;@echo two + +all: foo.x foo-mt.x +', +'', +"one\ntwo"); + +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; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/features/quoting b/third_party/make/tests/scripts/features/quoting new file mode 100644 index 00000000000..b7d95268b3c --- /dev/null +++ b/third_party/make/tests/scripts/features/quoting @@ -0,0 +1,31 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to test using \n" . + "quotes within makefiles."; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<'EOM'; +TEXFONTS = NICEFONT +DEFINES = -DDEFAULT_TFM_PATH=\".:$(TEXFONTS)\" +test: ; @"echo" 'DEFINES = $(DEFINES)' +EOM + +# END of Contents of MAKEFILE + +close(MAKEFILE); + + +&run_make_with_options($makefile,"",&get_logfile); + + +# Create the answer to what should be produced by this Makefile +$answer = 'DEFINES = -DDEFAULT_TFM_PATH=\".:NICEFONT\"' . "\n"; + +# COMPARE RESULTS + +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/third_party/make/tests/scripts/features/recursion b/third_party/make/tests/scripts/features/recursion new file mode 100644 index 00000000000..d225c13750c --- /dev/null +++ b/third_party/make/tests/scripts/features/recursion @@ -0,0 +1,67 @@ +# -*-perl-*- +$description = "Test recursion."; + +$details = "DETAILS"; + +# Test some basic recursion. +run_make_test(' +.RECIPEPREFIX := | +all: +| $(MAKE) -f #MAKEFILE# foo +foo: +| @echo $(MAKE) +| @echo MAKELEVEL = $(MAKELEVEL) +| $(MAKE) -f #MAKEFILE# last +last: +| @echo $(MAKE) +| @echo MAKELEVEL = $(MAKELEVEL) +| @echo THE END +', + ('CFLAGS=-O -w' . ($parallel_jobs ? ' -j 2' : '')), + ($vos + ? "#MAKE#: Entering directory '#PWD#' +make 'CFLAGS=-O' -f #MAKEFILE# foo +make CFLAGS=-O +MAKELEVEL = 0 +make 'CFLAGS=-O' -f #MAKEFILE# last +make CFLAGS=-O +MAKELEVEL = 0 +THE END +#MAKE#: Leaving directory '#PWD#'" + : "#MAKE#: Entering directory '#PWD#' +#MAKEPATH# -f #MAKEFILE# foo +#MAKE#[1]: Entering directory '#PWD#' +#MAKEPATH# +MAKELEVEL = 1 +#MAKEPATH# -f #MAKEFILE# last +#MAKE#[2]: Entering directory '#PWD#' +#MAKEPATH# +MAKELEVEL = 2 +THE END +#MAKE#[2]: Leaving directory '#PWD#' +#MAKE#[1]: Leaving directory '#PWD#' +#MAKE#: Leaving directory '#PWD#'")); + + +# Test command line overrides. +run_make_test(' +recur: all ; @$(MAKE) --no-print-directory -f #MAKEFILE# a=AA all +all: ; @echo "MAKEOVERRIDES = $(MAKEOVERRIDES)" +', + 'a=ZZ', + 'MAKEOVERRIDES = a=ZZ +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; diff --git a/third_party/make/tests/scripts/features/reinvoke b/third_party/make/tests/scripts/features/reinvoke new file mode 100644 index 00000000000..d2a1f50ca78 --- /dev/null +++ b/third_party/make/tests/scripts/features/reinvoke @@ -0,0 +1,82 @@ +# -*-mode: perl-*- + +$description = "Test GNU make's auto-reinvocation feature."; + +$details = "\ +If the makefile or one it includes can be rebuilt then it is, and make +is reinvoked. We create a rule to rebuild the makefile from a temp +file, then touch the temp file to make it newer than the makefile."; + +$omkfile = $makefile; + +&utouch(-600, 'incl.mk'); +# For some reason if we don't do this then the test fails for systems +# with sub-second timestamps, maybe + NFS? Not sure. +&utouch(-1, 'incl-1.mk'); + +run_make_test(' +all: ; @echo running rules. + +#MAKEFILE# incl.mk: incl-1.mk + @echo rebuilding $@ + @echo >> $@ + +include incl.mk', + '', "rebuilding incl.mk\nrunning rules.\n"); + +# Make sure updating the makefile itself also works + +&utouch(-600, $omkfile); + +run_make_test(undef, '', "rebuilding #MAKEFILE#\nrunning rules.\n"); + +&rmfiles('incl.mk', 'incl-1.mk'); + + +# In this test we create an included file that's out-of-date, but then +# the rule doesn't update it. Make shouldn't re-exec. + +&utouch(-600, 'b','a'); +#&utouch(-10, 'a'); +&touch('c'); + +run_make_test(' +all: ; @echo hello + +a : b ; echo >> $@ + +b : c ; [ -f $@ ] || echo >> $@ + +c: ; echo >> $@ + +include $(F)', + 'F=a', "[ -f b ] || echo >> b\nhello\n"); + +# 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"); + +&rmfiles('a','b','c'); + +# Ensure command line variables are preserved properly across re-exec +# Tests for Savannah bug #30723 + +run_make_test(' +ifdef RECURSE +-include foo30723 +endif +recurse: ; @$(MAKE) -f $(MAKEFILE_LIST) RECURSE=1 test +test: ; @echo F.O=$(F.O) +foo30723: ; @touch $@ +', + '--no-print-directory F.O=bar', "F.O=bar\n"); + +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: diff --git a/third_party/make/tests/scripts/features/rule_glob b/third_party/make/tests/scripts/features/rule_glob new file mode 100644 index 00000000000..2d377e7eada --- /dev/null +++ b/third_party/make/tests/scripts/features/rule_glob @@ -0,0 +1,37 @@ +# -*-perl-*- + +$description = "Test globbing in targets and prerequisites."; + +$details = ""; + +touch(qw(a.one a.two a.three)); + +# Test wildcards in regular targets and prerequisites +run_make_test(q{ +.PHONY: all a.one a.two a.three +all: a.one* a.t[a-z0-9]o a.th[!q]ee +a.o[Nn][Ee] a.t*: ; @echo $@ +}, + '', "a.one\na.two\na.three"); + +# Test wildcards in pattern targets and prerequisites +run_make_test(q{ +.PHONY: all +all: a.four +%.four : %.t* ; @echo $@: $(sort $^) +}, + '', "a.four: a.three a.two"); + +# Test wildcards in second expansion targets and prerequisites +run_make_test(q{ +.PHONY: all +all: a.four +.SECONDEXPANSION: +%.four : $$(sort %.t*) ; @echo $@: $(sort $^) +}, + '', "a.four: a.three a.two"); + +unlink(qw(a.one a.two a.three)); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/features/se_explicit b/third_party/make/tests/scripts/features/se_explicit new file mode 100644 index 00000000000..c28641c1249 --- /dev/null +++ b/third_party/make/tests/scripts/features/se_explicit @@ -0,0 +1,203 @@ +# -*-perl-*- +$description = "Test second expansion in ordinary rules."; + +$details = ""; + +# TEST #0: Test handing of '$' in prerequisites with and without second +# expansion. + +# If we don't support archives then the prerequisite is different +my $prereq = exists $FEATURES{'archives'} ? '$' : '$(PRE)'; + +run_make_test(q! +ifdef SE + .SECONDEXPANSION: +endif +foo$$bar: bar$$baz bar$$biz ; @echo '$@ : $^' +PRE = one two +bar$$baz: $$(PRE) +baraz: $$(PRE) +PRE = three four +.DEFAULT: ; @echo '$@' +!, + '', + "$prereq\nbar\$biz\nfoo\$bar : bar\$baz bar\$biz"); + +run_make_test(undef, 'SE=1', "three\nfour\nbariz\nfoo\$bar : baraz bariz"); + +# TEST #1: automatic variables. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +foo: bar baz + +foo: biz | buz + +foo: $$@.1 \ + $$<.2 \ + $$(addsuffix .3,$$^) \ + $$(addsuffix .4,$$+) \ + $$|.5 \ + $$*.6 + +!, +'', +'bar +baz +biz +buz +foo.1 +bar.2 +bar.3 +baz.3 +biz.3 +bar.4 +baz.4 +biz.4 +buz.5 +.6 +'); + + +# Test #2: target/pattern -specific variables. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +foo.x: $$a $$b + +foo.x: a := bar + +%.x: b := baz +!, +'', +'bar +baz +'); + + +# Test #3: order of prerequisites. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +all: foo bar baz + +# Subtest #1 +foo: foo.1; @: +foo: foo.2 +foo: foo.3 + +# Subtest #2 +bar: bar.2 +bar: bar.1; @: +bar: bar.3 + +# Subtest #3 +baz: baz.1 +baz: baz.2 +baz: ; @: +!, +'', +'foo.1 +foo.2 +foo.3 +bar.1 +bar.2 +bar.3 +baz.1 +baz.2 +'); + +# TEST #4: eval in a context where there is no reading_file +run_make_test(q! +.SECONDEXPANSION: +all : $$(eval $$(info test)) +!, + '', "test\n#MAKE#: Nothing to be done for 'all'.\n"); + +# TEST #5: (NEGATIVE) catch eval in a prereq list trying to create new +# target/prereq relationships. + +run_make_test(q! +.SECONDEXPANSION: +proj1.exe : proj1.o $$(eval $$(test)) +define test +proj1.o : proj1.c +proj1.c: proj1.h +endef +!, + '', "#MAKE#: *** prerequisites cannot be defined in recipes. Stop.\n", 512); + + +# Automatic $$+ variable expansion issue. Savannah bug #25780 +run_make_test(q! +all : foo foo +.SECONDEXPANSION: +all : $$+ ; @echo '$+' +foo : ; +!, + '', "foo foo foo foo\n"); + + +# Automatic $$+ variable expansion issue. Savannah bug #25780 +run_make_test(q! +all : bar bar +bar : ; +q%x : ; +.SECONDEXPANSION: +a%l: q1x $$+ q2x ; @echo '$+' +!, + '', "q1x bar bar q2x bar bar\n"); + + +# Allow patsubst shorthand in second expansion context. +# Requires the colon to be quoted. Savannah bug #16545 +run_make_test(q! +.PHONY: foo.bar +.SECONDEXPANSION: +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; diff --git a/third_party/make/tests/scripts/features/se_implicit b/third_party/make/tests/scripts/features/se_implicit new file mode 100644 index 00000000000..866d1fb0142 --- /dev/null +++ b/third_party/make/tests/scripts/features/se_implicit @@ -0,0 +1,266 @@ +# -*-perl-*- +$description = "Test second expansion in implicit rules."; + +$details = ""; + +use Cwd; + +$dir = cwd; +$dir =~ s,.*/([^/]+)$,../$1,; + + +# Test #1: automatic variables. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +foo.a: bar baz + +foo.a: biz | buz + +foo.%: 1.$$@ \ + 2.$$< \ + $$(addprefix 3.,$$^) \ + $$(addprefix 4.,$$+) \ + 5.$$| \ + 6.$$* ; @: + +1.foo.a \ +2.bar \ +3.bar \ +3.baz \ +3.biz \ +4.bar \ +4.baz \ +4.biz \ +5.buz \ +6.a: ; @echo '$@' + +!, +'', +'1.foo.a +2.bar +3.bar +3.baz +3.biz +4.bar +4.baz +4.biz +5.buz +6.a +bar +baz +biz +buz +'); + + +# Test #2: target/pattern -specific variables. +# +run_make_test(q! +.SECONDEXPANSION: +foo.x: + +foo.%: $$(%_a) $$(%_b) bar ; @: + +foo.x: x_a := bar + +%.x: x_b := baz + +bar baz: ; @echo '$@' +!, + '', "bar\nbaz\n"); + + +# Test #3: order of prerequisites. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +all: foo bar baz + + +# Subtest #1 +# +%oo: %oo.1; @: + +foo: foo.2 + +foo: foo.3 + +foo.1: ; @echo '$@' + + +# Subtest #2 +# +bar: bar.2 + +%ar: %ar.1; @: + +bar: bar.3 + +bar.1: ; @echo '$@' + + +# Subtest #3 +# +baz: baz.1 + +baz: baz.2 + +%az: ; @: +!, + '', +'foo.1 +foo.2 +foo.3 +bar.1 +bar.2 +bar.3 +baz.1 +baz.2 +'); + + +# Test #4: stem splitting logic. +# +run_make_test(q! +.SECONDEXPANSION: +$(dir)/tmp/bar.o: + +$(dir)/tmp/foo/bar.c: ; @echo '$@' +$(dir)/tmp/bar/bar.c: ; @echo '$@' +foo.h: ; @echo '$@' + +%.o: $$(addsuffix /%.c,foo bar) foo.h ; @echo '$@: {$<} $^' +!, + "dir=$dir", "$dir/tmp/foo/bar.c +$dir/tmp/bar/bar.c +foo.h +$dir/tmp/bar.o: {$dir/tmp/foo/bar.c} $dir/tmp/foo/bar.c $dir/tmp/bar/bar.c foo.h +"); + + +# Test #5: stem splitting logic and order-only prerequisites. +# +run_make_test(q! +.SECONDEXPANSION: +$(dir)/tmp/foo.o: $(dir)/tmp/foo.c +$(dir)/tmp/foo.c: ; @echo '$@' +bar.h: ; @echo '$@' + +%.o: %.c|bar.h ; @echo '$@: {$<} {$|} $^' + +!, + "dir=$dir", "$dir/tmp/foo.c +bar.h +$dir/tmp/foo.o: {$dir/tmp/foo.c} {bar.h} $dir/tmp/foo.c +"); + + +# Test #6: lack of implicit prerequisites. +# +run_make_test(q! +.SECONDEXPANSION: +foo.o: foo.c +foo.c: ; @echo '$@' + +%.o: ; @echo '$@: {$<} $^' +!, + '', "foo.c\nfoo.o: {foo.c} foo.c\n"); + + +# Test #7: Test stem from the middle of the name. +# +run_make_test(q! +.SECONDEXPANSION: +foobarbaz: + +foo%baz: % $$*.1 ; @echo '$*' + +bar bar.1: ; @echo '$@' +!, + '', "bar\nbar.1\nbar\n"); + + +# Test #8: Make sure stem triple-expansion does not happen. +# +run_make_test(q! +.SECONDEXPANSION: +foo$$bar: + +f%r: % $$*.1 ; @echo '$*' + +oo$$ba oo$$ba.1: ; @echo '$@' +!, + '', 'oo$ba +oo$ba.1 +oo$ba +'); + +# Test #9: Check the value of $^ +run_make_test(q! +.SECONDEXPANSION: + +%.so: | $$(extra) ; @echo $^ + +foo.so: extra := foo.o +foo.so: +foo.o: +!, + '', "\n"); + +# Test #10: Test second expansion with second expansion prerequisites +# Ensures pattern_search() recurses with SE prereqs. +touch('a'); +run_make_test(q! +.SECONDEXPANSION: +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_%: \ + $$(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); + +unlink('a'); + +# Ensure that order-only tokens embedded in second expansions are parsed +run_make_test(q! +.SECONDEXPANSION: +PREREQS=p1|p2 +P2=p2 +all : foo bar +f%o: $$(PREREQS) ; @echo '$@' from '$^' and '$|' +b%r: p1|$$(P2) ; @echo '$@' from '$^' and '$|' +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/third_party/make/tests/scripts/features/se_statpat b/third_party/make/tests/scripts/features/se_statpat new file mode 100644 index 00000000000..b1e59e1ffc4 --- /dev/null +++ b/third_party/make/tests/scripts/features/se_statpat @@ -0,0 +1,107 @@ +# -*-perl-*- +$description = "Test second expansion in static pattern rules."; + +$details = ""; + +# Test #1: automatic variables. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +foo.a foo.b: foo.%: bar.% baz.% +foo.a foo.b: foo.%: biz.% | buz.% + +foo.a foo.b: foo.%: $$@.1 \ + $$<.2 \ + $$(addsuffix .3,$$^) \ + $$(addsuffix .4,$$+) \ + $$|.5 \ + $$*.6 +!, + '', 'bar.a +baz.a +biz.a +buz.a +foo.a.1 +bar.a.2 +bar.a.3 +baz.a.3 +biz.a.3 +bar.a.4 +baz.a.4 +biz.a.4 +buz.a.5 +a.6 +'); + + +# Test #2: target/pattern -specific variables. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +foo.x foo.y: foo.%: $$(%_a) $$($$*_b) + +foo.x: x_a := bar + +%.x: x_b := baz +!, + '', "bar\nbaz\n"); + + +# Test #3: order of prerequisites. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +all: foo.a bar.a baz.a + +# Subtest #1 +foo.a foo.b: foo.%: foo.%.1; @: +foo.a foo.b: foo.%: foo.%.2 +foo.a foo.b: foo.%: foo.%.3 + + +# Subtest #2 +bar.a bar.b: bar.%: bar.%.2 +bar.a bar.b: bar.%: bar.%.1; @: +bar.a bar.b: bar.%: bar.%.3 + + +# Subtest #3 +baz.a baz.b: baz.%: baz.%.1 +baz.a baz.b: baz.%: baz.%.2 +baz.a baz.b: ; @: +!, + '', 'foo.a.1 +foo.a.2 +foo.a.3 +bar.a.1 +bar.a.2 +bar.a.3 +baz.a.1 +baz.a.2 +'); + + +# Test #4: Make sure stem triple-expansion does not happen. +# +run_make_test(q! +.SECONDEXPANSION: +foo$$bar: f%r: % $$*.1 + @echo '$*' + +oo$$ba oo$$ba.1: + @echo '$@' +!, + '', 'oo$ba +oo$ba.1 +oo$ba +'); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/features/shell_assignment b/third_party/make/tests/scripts/features/shell_assignment new file mode 100644 index 00000000000..686e4bd27cf --- /dev/null +++ b/third_party/make/tests/scripts/features/shell_assignment @@ -0,0 +1,65 @@ +# -*-perl-*- + +$description = "Test BSD-style shell assignments (VAR != VAL) for variables."; + +$details = ""; + +# TEST 0: Basic shell assignment (!=). + +run_make_test(' +.POSIX: + +demo1!=printf \' 1 2 3\n4\n\n5 \n \n 6\n\n\n\n\' +demo2 != printf \'7 8\n \' +demo3 != printf \'$$(demo2)\' +demo4 != printf \' 2 3 \n\' +demo5 != printf \' 2 3 \n\n\' +all: ; @echo "<$(demo1)> <$(demo2)> <$(demo3)> <$(demo4)> <${demo5}>" +', + '', "< 1 2 3 4 5 6 > <7 8 > <7 8 > < 2 3 > < 2 3 >\n"); + +# TEST 1: Handle '#' the same way as BSD make + +run_make_test(' +foo1!=echo bar#baz +hash != printf \'\043\' +foo2!= echo "bar$(hash)baz" + +all: ; @echo "<$(foo1)> <$(hash)> <$(foo2)>" +', + '', " <#> \n"); + +# TEST 2: shell assignment variables (from !=) should be recursive. +# Note that variables are re-evaluated later, so the shell can output +# a value like $(XYZZY) as part of !=. The $(XYZZY) will be EVALUATED +# when the value containing it is evaluated. On the negative side, this +# means if you don't want this, you need to escape dollar signs as $$. +# On the positive side, it means that shell programs can output macros +# that are then evaluated as they are traditionally evaluated.. and that +# you can use traditional macro evaluation semantics to implement !=. + +run_make_test(' +XYZZY = fiddle-dee-dee +dollar = $$ +VAR3 != printf \'%s\' \'$(dollar)(XYZZY)\' + +all: ; @echo "<$(VAR3)>" +', + '', "\n"); + + +# TEST 3: Overrides invoke shell anyway; they just don't store the result +# in a way that is visible. + +run_make_test(' + +override != echo abc > ,abc ; cat ,abc + +all: ; @echo "<$(override)>" ; cat ,abc +', + 'override=xyz', "\nabc\n"); + +unlink(',abc'); + + +1; diff --git a/third_party/make/tests/scripts/features/statipattrules b/third_party/make/tests/scripts/features/statipattrules new file mode 100644 index 00000000000..3f363defb1f --- /dev/null +++ b/third_party/make/tests/scripts/features/statipattrules @@ -0,0 +1,111 @@ +# -*-perl-*- +$description = "Test handling of static pattern rules."; + +$details = "\ +The makefile created in this test has three targets. The +filter command is used to get those target names ending in +.o and statically creates a compile command with the target +name and the target name with .c. It also does the same thing +for another target filtered with .elc and creates a command +to emacs a .el file"; + +&touch('bar.c', 'lose.c'); + +# TEST #0 +# ------- + +run_make_test(' +files = foo.elc bar.o lose.o + +$(filter %.o,$(files)): %.o: %.c ; @echo CC -c $(CFLAGS) $< -o $@ + +$(filter %.elc,$(files)): %.elc: %.el ; @echo emacs $< +', + '', + 'CC -c bar.c -o bar.o'); + +# TEST #1 +# ------- + +run_make_test(undef, 'lose.o', 'CC -c lose.c -o lose.o'); + + +# TEST #2 +# ------- +&touch("foo.el"); + +run_make_test(undef, 'foo.elc', 'emacs foo.el'); + +# Clean up after the first tests. +unlink('foo.el', 'bar.c', 'lose.c'); + + +# TEST #3 -- PR/1670: don't core dump on invalid static pattern rules +# ------- + +run_make_test(' +.DEFAULT: ; @echo $@ +foo: foo%: % %.x % % % y.% % ; @echo $@ +', + '', ".x\ny.\nfoo"); + + +# TEST #4 -- bug #12180: core dump on a stat pattern rule with an empty +# prerequisite list. +run_make_test(' +foo.x bar.x: %.x : ; @echo $@ + +', + '', 'foo.x'); + + +# TEST #5 -- bug #13881: double colon static pattern rule does not +# substitute %. +run_make_test(' +foo.bar:: %.bar: %.baz +foo.baz: ;@: +', + '', ''); + + +# TEST #6: make sure the second stem does not overwrite the first +# perprerequisite's stem (Savannah bug #16053). +# +run_make_test(' +all.foo.bar: %.foo.bar: %.one + +all.foo.bar: %.bar: %.two + +all.foo.bar: + @echo $* + @echo $^ + +.DEFAULT:;@: +', +'', +'all.foo +all.one all.foo.two'); + + +# TEST #7: make sure the second stem does not overwrite the first +# perprerequisite's stem when second expansion is enabled +# (Savannah bug #16053). +# +run_make_test(' +.SECONDEXPANSION: + +all.foo.bar: %.foo.bar: %.one $$*-one + +all.foo.bar: %.bar: %.two $$*-two + +all.foo.bar: + @echo $* + @echo $^ + +.DEFAULT:;@: +', +'', +'all.foo +all.one all-one all.foo.two all.foo-two'); + +1; diff --git a/third_party/make/tests/scripts/features/suffixrules b/third_party/make/tests/scripts/features/suffixrules new file mode 100644 index 00000000000..b8f465267db --- /dev/null +++ b/third_party/make/tests/scripts/features/suffixrules @@ -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; diff --git a/third_party/make/tests/scripts/features/targetvars b/third_party/make/tests/scripts/features/targetvars new file mode 100644 index 00000000000..2929b2cc523 --- /dev/null +++ b/third_party/make/tests/scripts/features/targetvars @@ -0,0 +1,302 @@ +# -*-perl-*- +$description = "Test target-specific variable settings."; + +$details = "\ +Create a makefile containing various flavors of target-specific variable +values, override and non-override, and using various variable expansion +rules, semicolon interference, etc."; + +run_make_test(' +export FOO = foo +export BAR = bar +one: override FOO = one +one two: ; @echo $(FOO) $(BAR) +two: BAR = two +three: ; BAR=1000 + @echo $(FOO) $(BAR) +# Some things that shouldn not be target vars +funk : override +funk : override adelic +adelic override : ; echo $@ +# Test per-target recursive variables +four:FOO=x +four:VAR$(FOO)=ok +four: ; @echo "$(FOO) $(VAR$(FOO)) $(VAR) $(VARx)" +five:FOO=x +five six : VAR$(FOO)=good +five six: ;@echo "$(FOO) $(VAR$(FOO)) $(VAR) $(VARx) $(VARfoo)" +# Test per-target variable inheritance +seven: eight +seven eight: ; @echo $@: $(FOO) $(BAR) +seven: BAR = seven +seven: FOO = seven +eight: BAR = eight +# Test the export keyword with per-target variables +nine: ; @echo $(FOO) $(BAR) $$FOO $$BAR +nine: FOO = wallace +nine-a: export BAZ = baz +nine-a: ; @echo $$BAZ +# Test = escaping +EQ = = +ten: one$(EQ)two +ten: one $(EQ) two +ten one$(EQ)two $(EQ):;@echo $@ +.PHONY: one two three four five six seven eight nine ten $(EQ) one$(EQ)two +# Test target-specific vars with pattern/suffix rules +QVAR = qvar +RVAR = = +%.q : ; @echo $(QVAR) $(RVAR) +foo.q : RVAR += rvar +# Target-specific vars with multiple LHS pattern rules +%.r %.s %.t: ; @echo $(QVAR) $(RVAR) $(SVAR) $(TVAR) +foo.r : RVAR += rvar +foo.t : TVAR := $(QVAR) +', + "one two three", "one bar\nfoo two\nBAR=1000\nfoo bar\n"); + +# TEST #2 + +run_make_test(undef, "one two FOO=1 BAR=2", "one 2\n1 2\n"); + +# TEST #3 + +run_make_test(undef, "four", "x ok ok\n"); + +# TEST #4 + +run_make_test(undef, "seven", "eight: seven eight\nseven: seven seven\n"); + +# TEST #5 + +run_make_test(undef, "nine", "wallace bar wallace bar\n"); + +# TEST #5-a + +run_make_test(undef, "nine-a", "baz\n"); + +# TEST #6 + +run_make_test(undef, "ten", "one=two\none bar\n=\nfoo two\nten\n"); + +# TEST #6 + +run_make_test(undef, "foo.q bar.q", "qvar = rvar\nqvar =\n"); + +# TEST #7 + +run_make_test(undef, "foo.t bar.s", "qvar = qvar\nqvar =\n"); + + +# TEST #8 +# For PR/1378: Target-specific vars don't inherit correctly + +run_make_test(' +foo: FOO = foo +bar: BAR = bar +foo: bar +bar: baz +baz: ; @echo $(FOO) $(BAR) +', "", "foo bar\n"); + +# TEST #9 +# For PR/1380: Using += assignment in target-specific variables sometimes fails +# Also PR/1831 + +run_make_test(' +.PHONY: all one +all: FOO += baz +all: one; @echo $(FOO) + +FOO = bar + +one: FOO += biz +one: FOO += boz +one: ; @echo $(FOO) +', + '', "bar baz biz boz\nbar baz\n"); + +# Test #10 + +run_make_test(undef, 'one', "bar biz boz\n"); + +# Test #11 +# PR/1709: Test semicolons in target-specific variable values + +run_make_test(' +foo : FOO = ; ok +foo : ; @echo "$(FOO)" +', + '', "; ok\n"); + +# Test #12 +# PR/2020: More hassles with += target-specific vars. I _really_ think +# I nailed it this time :-/. + +run_make_test(' +.PHONY: a + +BLAH := foo +COMMAND = echo $(BLAH) + +a: ; @$(COMMAND) + +a: BLAH := bar +a: COMMAND += snafu $(BLAH) +', + '', "bar snafu bar\n"); + +# Test #13 +# Test double-colon rules with target-specific variable values + +run_make_test(' +W = bad +X = bad +foo: W = ok +foo:: ; @echo $(W) $(X) $(Y) $(Z) +foo:: ; @echo $(W) $(X) $(Y) $(Z) +foo: X = ok + +Y = foo +bar: foo +bar: Y = bar + +Z = nopat +ifdef PATTERN + fo% : Z = pat +endif +', + 'foo', "ok ok foo nopat\nok ok foo nopat\n"); + +# Test #14 +# Test double-colon rules with target-specific variable values and +# inheritance + +run_make_test(undef, 'bar', "ok ok bar nopat\nok ok bar nopat\n"); + +# Test #15 +# Test double-colon rules with pattern-specific variable values + +run_make_test(undef, 'foo PATTERN=yes', "ok ok foo pat\nok ok foo pat\n"); + +# Test #16 +# Test target-specific variables with very long command line +# (> make default buffer length) + +run_make_test(' +base_metals_fmd_reports.sun5 base_metals_fmd_reports CreateRealPositions CreateMarginFunds deals_changed_since : BUILD_OBJ=$(shell if [ -f "build_information.generate" ]; then echo "$(OBJ_DIR)/build_information.o"; else echo "no build information"; fi ) + +deals_changed_since: ; @echo $(BUILD_OBJ) +', + '', "no build information\n"); + +# TEST #17 + +# Test a merge of set_lists for files, where one list is much longer +# than the other. See Savannah bug #15757. + +mkdir('t1', 0777); +touch('t1/rules.mk'); + +run_make_test(' +VPATH = t1 +include rules.mk +.PHONY: all +all: foo.x +foo.x : rules.mk ; @echo MYVAR=$(MYVAR) FOOVAR=$(FOOVAR) ALLVAR=$(ALLVAR) +all: ALLVAR = xxx +foo.x: FOOVAR = bar +rules.mk : MYVAR = foo +.INTERMEDIATE: foo.x rules.mk +', + '-I t1', 'MYVAR= FOOVAR=bar ALLVAR=xxx'); + +rmfiles('t1/rules.mk'); +rmdir('t1'); + +# TEST #18 + +# Test appending to a simple variable containing a "$": avoid a +# double-expansion. See Savannah bug #15913. + +run_make_test(' +VAR := $$FOO +foo: VAR += BAR +foo: ; @echo '."'".'$(VAR)'."'".' +', + '', '$FOO BAR'); + +# TEST #19: Override with append variables + +run_make_test(' +a: override FOO += f1 +a: FOO += f2 +a: ; @echo "$(FOO)" +', + '', "f1\n"); + +run_make_test(undef, 'FOO=C', "C f1\n"); + +# TEST #19: Conditional variables with command-line settings + +run_make_test(' +a: FOO ?= f1 +a: ; @echo "$(FOO)" +', + '', "f1\n"); + +run_make_test(undef, 'FOO=C', "C\n"); + +# TEST #20: Check for continuation after semicolons + +run_make_test(q! +a: A = 'hello;\ +world' +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(' +# define b +# @echo global +# endef +# a: define b +# @echo local +# endef + +# a: ; $(b) +# ', +# '', "local\n"); + +1; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/features/utf8 b/third_party/make/tests/scripts/features/utf8 new file mode 100644 index 00000000000..54bc471049f --- /dev/null +++ b/third_party/make/tests/scripts/features/utf8 @@ -0,0 +1,11 @@ +# -*-perl-*- + +$description = "Test support for UTF-8."; + +$details = ""; + +# Verify that the UTF-8 BOM is ignored. +run_make_test("\xEF\xBB\xBFall: ; \@echo \$\@\n", '', "all"); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/features/varnesting b/third_party/make/tests/scripts/features/varnesting new file mode 100644 index 00000000000..d8f3ffbb12b --- /dev/null +++ b/third_party/make/tests/scripts/features/varnesting @@ -0,0 +1,35 @@ +# -*-perl-*- +$description = "Test recursive variables"; + +$details = ""; + +run_make_test(' +x = variable1 +variable2 := Hello +y = $(subst 1,2,$(x)) +z = y +a := $($($(z))) +all: + @echo $(a) +', + '', "Hello\n"); + +# This tests resetting the value of a variable while expanding it. +# You may only see problems with this if you're using valgrind or +# some other memory checker that poisons freed memory. +# See Savannah patch #7534 + +run_make_test(' +VARIABLE = $(eval VARIABLE := echo hi)$(VARIABLE) +wololo: + @$(VARIABLE) +', + '', "hi\n"); + +1; + + + + + + diff --git a/third_party/make/tests/scripts/features/vpath b/third_party/make/tests/scripts/features/vpath new file mode 100644 index 00000000000..ec24165fc6c --- /dev/null +++ b/third_party/make/tests/scripts/features/vpath @@ -0,0 +1,81 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to test the \n" + ."vpath directive which allows you to specify a search \n" + ."path for a particular class of filenames, those that\n" + ."match a particular pattern."; + +$details = "This tests the vpath directive by specifying search directories\n" + ."for one class of filenames with the form: vpath pattern directories" + ."\nIn this test, we specify the working directory for all files\n" + ."that end in c or h. We also test the variables $@ (which gives\n" + ."target name) and $^ (which is a list of all dependencies \n" + ."including the directories in which they were found). It also\n" + ."uses the function firstword used to extract just the first\n" + ."dependency from the entire list."; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "vpath %.c foo\n"; +print MAKEFILE "vpath %.c $workdir\n"; +print MAKEFILE "vpath %.h $workdir\n"; +print MAKEFILE "objects = main.o kbd.o commands.o display.o insert.o\n"; +print MAKEFILE "edit: \$(objects)\n"; +print MAKEFILE "\t\@echo cc -o \$@ \$^\n"; +print MAKEFILE "main.o : main.c defs.h\n"; +print MAKEFILE "\t\@echo cc -c \$(firstword \$^)\n"; +print MAKEFILE "kbd.o : kbd.c defs.h command.h\n"; +print MAKEFILE "\t\@echo cc -c kbd.c\n"; +print MAKEFILE "commands.o : command.c defs.h command.h\n"; +print MAKEFILE "\t\@echo cc -c commands.c\n"; +print MAKEFILE "display.o : display.c defs.h buffer.h\n"; +print MAKEFILE "\t\@echo cc -c display.c\n"; +print MAKEFILE "insert.o : insert.c defs.h buffer.h\n"; +print MAKEFILE "\t\@echo cc -c insert.c\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + + +@files_to_touch = ("$workdir${pathsep}main.c","$workdir${pathsep}defs.h", + "$workdir${pathsep}kbd.c","$workdir${pathsep}command.h", + "$workdir${pathsep}commands.c","$workdir${pathsep}display.c", + "$workdir${pathsep}buffer.h","$workdir${pathsep}insert.c", + "$workdir${pathsep}command.c"); + +&touch(@files_to_touch); + +&run_make_with_options($makefile,"",&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "cc -c $workdir${pathsep}main.c\ncc -c kbd.c\ncc -c commands.c\n" + ."cc -c display.c\n" + ."cc -c insert.c\ncc -o edit main.o kbd.o commands.o display.o " + ."insert.o\n"; + +if (&compare_output($answer,&get_logfile(1))) +{ + unlink @files_to_touch; +} + +# TEST 2: after vpath lookup ensure we don't get incorrect circular dependency +# warnings due to change of struct file ptr. Savannah bug #13529. + +mkdir('vpath-d', 0777); + +run_make_test(q! +vpath %.te vpath-d/ +.SECONDARY: +default: vpath-d/a vpath-d/b +vpath-d/a: fail.te +vpath-d/b : fail.te +vpath-d/fail.te: +!, + '', "#MAKE#: Nothing to be done for 'default'.\n"); + +rmdir('vpath-d'); + +1; diff --git a/third_party/make/tests/scripts/features/vpath2 b/third_party/make/tests/scripts/features/vpath2 new file mode 100644 index 00000000000..c8de29bc194 --- /dev/null +++ b/third_party/make/tests/scripts/features/vpath2 @@ -0,0 +1,45 @@ +$description = "This is part 2 in a series to test the vpath directive\n" + ."It tests the three forms of the directive:\n" + ." vpath pattern directive\n" + ." vpath pattern (clears path associated with pattern)\n" + ." vpath (clears all paths specified with vpath)\n"; + +$details = "This test simply adds many search paths using various vpath\n" + ."directive forms and clears them afterwards. It has a simple\n" + ."rule to print a message at the end to confirm that the makefile\n" + ."ran with no errors.\n"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "VPATH = $workdir:$scriptdir\n"; +print MAKEFILE "vpath %.c foo\n"; +print MAKEFILE "vpath %.c $workdir\n"; +print MAKEFILE "vpath %.c $scriptdir\n"; +print MAKEFILE "vpath %.h $workdir\n"; +print MAKEFILE "vpath %.c\n"; +print MAKEFILE "vpath\n"; +print MAKEFILE "all:\n"; +print MAKEFILE "\t\@echo ALL IS WELL\n"; +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "ALL IS WELL\n"; + +&compare_output($answer,&get_logfile(1)); + +1; + + + + + + + + + diff --git a/third_party/make/tests/scripts/features/vpath3 b/third_party/make/tests/scripts/features/vpath3 new file mode 100644 index 00000000000..839fb723bbe --- /dev/null +++ b/third_party/make/tests/scripts/features/vpath3 @@ -0,0 +1,41 @@ +# -*-perl-*- + +$description = "Test the interaction of the -lfoo feature and vpath"; +$details = ""; + +my @dirs_to_make = qw(a1 b1 a2 b2 b3); +for my $d (@dirs_to_make) { + mkdir($d, 0777); +} + +my @files_to_touch = ("a1${pathsep}lib1.a", + "a1${pathsep}libc.a", + "b1${pathsep}lib1.so", + "a2${pathsep}lib2.a", + "b2${pathsep}lib2.so", + "lib3.a", + "b3${pathsep}lib3.so"); +&touch(@files_to_touch); + +my $answer = "a1${pathsep}lib1.a a1${pathsep}libc.a " . + "a2${pathsep}lib2.a lib3.a\n"; +if ($port_type eq 'VMS-DCL') { + $answer =~ s/ /,/g; +} + +run_make_test(' +vpath %.h b3 +vpath %.a a1 +vpath %.so b1 +vpath % a2 b2 +vpath % b3 +all: -l1 -lc -l2 -l3; @echo $^ +', + '', $answer); + +unlink(@files_to_touch); +for my $d (@dirs_to_make) { + rmdir($d); +} + +1; diff --git a/third_party/make/tests/scripts/features/vpathgpath b/third_party/make/tests/scripts/features/vpathgpath new file mode 100644 index 00000000000..5e6217bfb6d --- /dev/null +++ b/third_party/make/tests/scripts/features/vpathgpath @@ -0,0 +1,66 @@ +# -*-perl-*- +$description = "Tests VPATH+/GPATH functionality."; + +$details = ""; + +$VP = "$workdir$pathsep"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "VPATH = $VP\n"; + +print MAKEFILE <<'EOMAKE'; + +GPATH = $(VPATH) + +.SUFFIXES: .a .b .c .d +.PHONY: general rename notarget intermediate + +%.a: +%.b: +%.c: +%.d: + +%.a : %.b ; cat $^ > $@ +%.b : %.c ; cat $^ > $@ +%.c :: %.d ; cat $^ > $@ + +# General testing info: + +general: foo.b +foo.b: foo.c bar.c + +EOMAKE + +close(MAKEFILE); + +@touchedfiles = (); + +$off = -500; + +sub touchfiles { + foreach (@_) { + ($f = $_) =~ s,VP/,$VP,g; + &utouch($off, $f); + $off += 10; + push(@touchedfiles, $f); + } +} + +# Run the general-case test + +&touchfiles("VP/foo.d", "VP/bar.d", "VP/foo.c", "VP/bar.c", "foo.b", "bar.d"); + +&run_make_with_options($makefile,"general",&get_logfile()); + +push(@touchedfiles, "bar.c"); + +$answer = "$make_name: Nothing to be done for 'general'.\n"; + +&compare_output($answer,&get_logfile(1)); + +unlink(@touchedfiles) unless $keep; + +1; diff --git a/third_party/make/tests/scripts/features/vpathplus b/third_party/make/tests/scripts/features/vpathplus new file mode 100644 index 00000000000..978aecb85a7 --- /dev/null +++ b/third_party/make/tests/scripts/features/vpathplus @@ -0,0 +1,131 @@ +# -*-perl-*- +$description = "Tests the new VPATH+ functionality added in 3.76."; + +$details = ""; + +$VP = "$workdir$pathsep"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "VPATH = $VP\n"; + +print MAKEFILE <<'EOMAKE'; +.SUFFIXES: .a .b .c .d +.PHONY: general rename notarget intermediate + +%.a: +%.b: +%.c: +%.d: + +%.a : %.b + cat $^ > $@ +%.b : %.c + cat $^ > $@ 2>/dev/null || exit 1 +%.c :: %.d + cat $^ > $@ + +# General testing info: + +general: foo.b +foo.b: foo.c bar.c + +# Rename testing info: + +rename: $(VPATH)/foo.c foo.d + +# Target not made testing info: + +notarget: notarget.b +notarget.c: notarget.d + -@echo "not creating $@ from $^" + +# Intermediate files: + +intermediate: inter.a + +EOMAKE + +close(MAKEFILE); + +@touchedfiles = (); + +$off = -500; + +sub touchfiles { + foreach (@_) { + &utouch($off, $_); + $off += 10; + push(@touchedfiles, $_); + } +} + +# Run the general-case test + +&touchfiles("$VP/foo.d", "$VP/bar.d", "$VP/foo.c", "$VP/bar.c", "foo.b", "bar.d"); + +&run_make_with_options($makefile,"general",&get_logfile); + +push(@touchedfiles, "bar.c"); + +$answer = "cat bar.d > bar.c +cat ${VP}foo.c bar.c > foo.b 2>/dev/null || exit 1 +"; +&compare_output($answer,&get_logfile(1)); + +# Test rules that don't make the target correctly + +&touchfiles("$VP/notarget.c", "notarget.b", "notarget.d"); + +&run_make_with_options($makefile,"notarget",&get_logfile,512); + +$answer = "not creating notarget.c from notarget.d +cat notarget.c > notarget.b 2>/dev/null || exit 1 +$make_name: *** [$makefile:13: notarget.b] Error 1 +"; + +&compare_output($answer,&get_logfile(1)); + +# Test intermediate file handling (part 1) + +&touchfiles("$VP/inter.d"); + +&run_make_with_options($makefile,"intermediate",&get_logfile); + +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 $intfiles +"; +&compare_output($answer,&get_logfile(1)); + +# Test intermediate file handling (part 2) + +&utouch(-20, "inter.a"); +&utouch(-10, "$VP/inter.b"); +&touch("$VP/inter.d"); + +push(@touchedfiles, "$VP/inter.b", "$VP/inter.d"); + +&run_make_with_options($makefile,"intermediate",&get_logfile); + +$answer = "cat ${VP}inter.d > inter.c +cat inter.c > inter.b 2>/dev/null || exit 1 +cat inter.b > inter.a +rm inter.c +"; +&compare_output($answer,&get_logfile(1)); + +unlink @touchedfiles unless $keep; + +1; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/functions/abspath b/third_party/make/tests/scripts/functions/abspath new file mode 100644 index 00000000000..59bd3841bc5 --- /dev/null +++ b/third_party/make/tests/scripts/functions/abspath @@ -0,0 +1,84 @@ +# -*-perl-*- +$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)") +endif + +ifneq ($(realpath $(abspath ./)),$(CURDIR)) + $(warning ./: abs="$(abspath ./)" real="$(realpath $(abspath ./))" curdir="$(CURDIR)") +endif + +ifneq ($(realpath $(abspath .///)),$(CURDIR)) + $(warning .///: abs="$(abspath .///)" real="$(realpath $(abspath .///))" curdir="$(CURDIR)") +endif + +ifneq ($(abspath /),/) + $(warning /: abspath="$(abspath /)") +endif + +ifneq ($(abspath ///),/) + $(warning ///: abspath="$(abspath ///)") +endif + +ifneq ($(abspath /.),/) + $(warning /.: abspath="$(abspath /.)") +endif + +ifneq ($(abspath ///.),/) + $(warning ///.: abspath="$(abspath ///.)") +endif + +ifneq ($(abspath /./),/) + $(warning /./: abspath="$(abspath /./)") +endif + +ifneq ($(abspath /.///),/) + $(warning /.///: abspath="$(abspath /.///)") +endif + +ifneq ($(abspath /..),/) + $(warning /..: abspath="$(abspath /..)") +endif + +ifneq ($(abspath ///..),/) + $(warning ///..: abspath="$(abspath ///..)") +endif + +ifneq ($(abspath /../),/) + $(warning /../: abspath="$(abspath /../)") +endif + +ifneq ($(abspath /..///),/) + $(warning /..///: abspath="$(abspath /..///)") +endif + + +ifneq ($(abspath /foo/bar/..),/foo) + $(warning /foo/bar/..: abspath="$(abspath /foo/bar/..)") +endif + +ifneq ($(abspath /foo/bar/../../../baz),/baz) + $(warning /foo/bar/../../../baz: abspath="$(abspath /foo/bar/../../../baz)") +endif + +ifneq ($(abspath /foo/bar/../ /..),/foo /) + $(warning /foo/bar/../ /..: abspath="$(abspath /foo/bar/../ /..)") +endif + + +.PHONY: all +all: ; @: +', +'', +''); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/functions/addprefix b/third_party/make/tests/scripts/functions/addprefix new file mode 100644 index 00000000000..1845552f1e6 --- /dev/null +++ b/third_party/make/tests/scripts/functions/addprefix @@ -0,0 +1,44 @@ +$description = "The following test creates a makefile to test the addprefix " + ."function."; + +$details = ""; + +# IF YOU NEED >1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(addprefix src${pathsep},a.b.z.foo hacks) \n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "src${pathsep}a.b.z.foo src${pathsep}hacks\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/third_party/make/tests/scripts/functions/addsuffix b/third_party/make/tests/scripts/functions/addsuffix new file mode 100644 index 00000000000..da4fbb71f5a --- /dev/null +++ b/third_party/make/tests/scripts/functions/addsuffix @@ -0,0 +1,36 @@ +# -*-perl-*- +$description = "Test the addsuffix function."; + +$details = ""; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(basename src${pathsep}a.b.z.foo.c src${pathsep}hacks src.bar${pathsep}a.b.z.foo.c src.bar${pathsep}hacks hacks) \n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "src${pathsep}a.b.z.foo src${pathsep}hacks src.bar${pathsep}a.b.z.foo src.bar${pathsep}hacks hacks\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/third_party/make/tests/scripts/functions/call b/third_party/make/tests/scripts/functions/call new file mode 100644 index 00000000000..dc1a6233d35 --- /dev/null +++ b/third_party/make/tests/scripts/functions/call @@ -0,0 +1,92 @@ +# -*-perl-*- +$description = "Test the call function.\n"; + +$details = "Try various uses of call and ensure they all give the correct +results.\n"; + +run_make_test(q! +# Simple, just reverse two things +# +reverse = $2 $1 + +# A complex 'map' function, using recursive 'call'. +# +map = $(foreach a,$2,$(call $1,$a)) + +# Test using a builtin; this is silly as it's simpler to do without call +# +my-notdir = $(call notdir,$(1)) + +# Test using non-expanded builtins +# +my-foreach = $(foreach $(1),$(2),$(3)) +my-if = $(if $(1),$(2),$(3)) + +# Test recursive invocations of call with different arguments +# +one = $(1) $(2) $(3) +two = $(call one,$(1),foo,$(2)) + +# Test recursion on the user-defined function. As a special case make +# won't error due to this. +# Implement transitive closure using $(call ...) +# +DEP_foo = bar baz quux +DEP_baz = quux blarp +rest = $(wordlist 2,$(words ${1}),${1}) +tclose = $(if $1,$(firstword $1)\ + $(call tclose,$(sort ${DEP_$(firstword $1)} $(call rest,$1)))) + +all: ; @echo '$(call reverse,bar,foo)'; \ + echo '$(call map,origin,MAKE reverse map)'; \ + echo '$(call my-notdir,a/b c/d e/f)'; \ + echo '$(call my-foreach)'; \ + echo '$(call my-foreach,a,,,)'; \ + echo '$(call my-if,a,b,c)'; \ + echo '$(call two,bar,baz)'; \ + echo '$(call tclose,foo)'; +!, + "", "foo bar\ndefault file file\nb d f\n\n\nb\nbar foo baz\nfoo bar baz blarp quux \n"); + +# These won't work because call expands all its arguments first, before +# passing them on, then marks them as resolved/simple, so they're not +# expanded again by the function. +# +# echo '$(call my-foreach,a,x y z,$$(a)$$(a))'; \ +# echo '$(call my-if,,$$(info don't print this),$$(info do print this))' +# +# $answer = "xx yy zz\ndo print this\n"; + +# TEST eclipsing of arguments when invoking sub-calls + +run_make_test(q! +all = $1 $2 $3 $4 $5 $6 $7 $8 $9 + +level1 = $(call all,$1,$2,$3,$4,$5) +level2 = $(call level1,$1,$2,$3) +level3 = $(call level2,$1,$2,$3,$4,$5) + +all: + @echo $(call all,1,2,3,4,5,6,7,8,9,10,11) + @echo $(call level1,1,2,3,4,5,6,7,8) + @echo $(call level2,1,2,3,4,5,6,7,8) + @echo $(call level3,1,2,3,4,5,6,7,8) +!, + "", "1 2 3 4 5 6 7 8 9\n1 2 3 4 5\n1 2 3\n1 2 3\n"); + +# Ensure that variables are defined in global scope even in a $(call ...) + +delete $ENV{X123}; + +run_make_test(' +tst = $(eval export X123) +$(call tst) +all: ; @echo "$${X123-not set}" +', + '', "\n"); + +1; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/functions/dir b/third_party/make/tests/scripts/functions/dir new file mode 100644 index 00000000000..f48fb8c0927 --- /dev/null +++ b/third_party/make/tests/scripts/functions/dir @@ -0,0 +1,44 @@ +$description = "The following test creates a makefile to test the dir " + ."function."; + +$details = ""; + +# IF YOU NEED >1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(dir src${pathsep}foo.c hacks) \n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "src${pathsep} .${pathsep}\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/third_party/make/tests/scripts/functions/error b/third_party/make/tests/scripts/functions/error new file mode 100644 index 00000000000..998afe48147 --- /dev/null +++ b/third_party/make/tests/scripts/functions/error @@ -0,0 +1,71 @@ +# -*-Perl-*- + +$description = "\ +The following test creates a makefile to test the error function."; + +$details = ""; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE 'err = $(error Error found!) + +ifdef ERROR1 +$(error error is $(ERROR1)) +endif + +ifdef ERROR2 +$(error error is $(ERROR2)) +endif + +ifdef ERROR3 +all: some; @echo $(error error is $(ERROR3)) +endif + +ifdef ERROR4 +all: some; @echo error is $(ERROR4) + @echo $(error error is $(ERROR4)) +endif + +some: ; @echo Some stuff + +testvar: ; @: $(err) +'; + +close(MAKEFILE); + +# Test #1 + +&run_make_with_options($makefile, "ERROR1=yes", &get_logfile, 512); +$answer = "$makefile:4: *** error is yes. Stop.\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #2 + +&run_make_with_options($makefile, "ERROR2=no", &get_logfile, 512); +$answer = "$makefile:8: *** error is no. Stop.\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #3 + +&run_make_with_options($makefile, "ERROR3=maybe", &get_logfile, 512); +$answer = "Some stuff\n$makefile:12: *** error is maybe. Stop.\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #4 + +&run_make_with_options($makefile, "ERROR4=definitely", &get_logfile, 512); +$answer = "Some stuff\n$makefile:17: *** error is definitely. Stop.\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #5 + +&run_make_with_options($makefile, "testvar", &get_logfile, 512); +$answer = "$makefile:22: *** Error found!. Stop.\n"; +&compare_output($answer,&get_logfile(1)); + +# 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: diff --git a/third_party/make/tests/scripts/functions/eval b/third_party/make/tests/scripts/functions/eval new file mode 100644 index 00000000000..90513bdd292 --- /dev/null +++ b/third_party/make/tests/scripts/functions/eval @@ -0,0 +1,169 @@ +# -*-perl-*- + +$description = "Test the eval function."; + +$details = "This is a test of the eval function in GNU make. +This function will evaluate inline makefile syntax and incorporate the +results into its internal database.\n"; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +define Y + all:: ; @echo $AA + A = B +endef + +X = $(eval $(value Y)) + +$(eval $(shell echo A = A)) +$(eval $(Y)) +$(eval A = C) +$(eval $(X)) +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile, "", &get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "AA\nBA\n"; + +&compare_output($answer,&get_logfile(1)); + +# Test to make sure defining variables when we have extra scope pushed works +# as expected. + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile2"); + +print MAKEFILE <<'EOF'; +VARS = A B + +VARSET = $(1) = $(2) + +$(foreach v,$(VARS),$(eval $(call VARSET,$v,$v))) + +all: ; @echo A = $(A) B = $(B) +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, "", &get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "A = A B = B\n"; + +&compare_output($answer,&get_logfile(1)); + +# Test to make sure eval'ing inside conditionals works properly + +$makefile3 = &get_tmpfile; + +open(MAKEFILE,"> $makefile3"); + +print MAKEFILE <<'EOF'; +FOO = foo + +all:: ; @echo it + +define Y + all:: ; @echo worked +endef + +ifdef BAR +$(eval $(Y)) +endif + +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile3, "", &get_logfile); +$answer = "it\n"; +&compare_output($answer,&get_logfile(1)); + +&run_make_with_options($makefile3, "BAR=1", &get_logfile); +$answer = "it\nworked\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST very recursive invocation of eval + +$makefile3 = &get_tmpfile; + +open(MAKEFILE,"> $makefile3"); + +print MAKEFILE <<'EOF'; +..9 := 0 1 2 3 4 5 6 7 8 9 +rev=$(eval res:=)$(foreach word,$1,$(eval res:=${word} ${res}))${res} +a:=$(call rev,${..9}) +all: ; @echo '[$(a)]' + +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile3, "", &get_logfile); +$answer = "[ 9 8 7 6 5 4 3 2 1 0 ]\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST eval with no filename context. +# The trick here is that because EVAR is taken from the environment, it must +# be evaluated before every command is invoked. Make sure that works, when +# we have no file context for reading_file (bug # 6195) + +$makefile4 = &get_tmpfile; + +open(MAKEFILE,"> $makefile4"); + +print MAKEFILE <<'EOF'; +EVAR = $(eval FOBAR = 1) +all: ; @echo "OK" + +EOF + +close(MAKEFILE); + +$extraENV{EVAR} = '1'; +&run_make_with_options($makefile4, "", &get_logfile); +$answer = "OK\n"; +&compare_output($answer,&get_logfile(1)); + + +# Clean out previous information to allow new run_make_test() interface. +# If we ever convert all the above to run_make_test() we can remove this line. +$makefile = undef; + +# Test handling of backslashes in strings to be evaled. + +run_make_test(' +define FOO +all: ; @echo hello \ +world +endef +$(eval $(FOO)) +', '', 'hello world'); + +run_make_test(' +define FOO +all: ; @echo '."'".'he\llo'."'".' + @echo world +endef +$(eval $(FOO)) +', '', 'he\llo +world'); + + +# We don't allow new target/prerequisite relationships to be defined within a +# command script, because these are evaluated after snap_deps() and that +# causes lots of problems (like core dumps!) +# See Savannah bug # 12124. + +run_make_test('deps: ; $(eval deps: foo)', '', + '#MAKEFILE#:1: *** prerequisites cannot be defined in recipes. Stop.', + 512); + +1; diff --git a/third_party/make/tests/scripts/functions/file b/third_party/make/tests/scripts/functions/file new file mode 100644 index 00000000000..eaabd3ac291 --- /dev/null +++ b/third_party/make/tests/scripts/functions/file @@ -0,0 +1,151 @@ +# -*-perl-*- + +$description = 'Test the $(file ...) function.'; + +# Test > and >> +run_make_test(q! +define A +a +b +endef +B = c d +$(file >file.out,$(A)) +$(foreach L,$(B),$(file >> file.out,$L)) +x:;@echo hi; cat file.out +!, + '', "hi\na\nb\nc\nd"); + +unlink('file.out'); + +# Test >> to a non-existent file +run_make_test(q! +define A +a +b +endef +$(file >> file.out,$(A)) +x:;@cat file.out +!, + '', "a\nb"); + +unlink('file.out'); + +# Test > with no content +run_make_test(q! +$(file >4touch) +.PHONY:x +x:;@cat 4touch +!, + '', ''); + +# Test >> with no content +run_make_test(q! +$(file >>4touch) +.PHONY:x +x:;@cat 4touch +!, + '', ''); +unlink('4touch'); + +# Test > to a read-only file +if (defined $ERR_read_only_file) { + touch('file.out'); + chmod(0444, 'file.out'); + + run_make_test(q! +define A +a +b +endef +$(file > file.out,$(A)) +x:;@cat file.out +!, + '', "#MAKEFILE#:6: *** open: file.out: $ERR_read_only_file. Stop.", + 512); + + unlink('file.out'); +} + +# Use variables for operator and filename +run_make_test(q! +define A +a +b +endef +OP = > +FN = file.out +$(file $(OP) $(FN),$(A)) +x:;@cat file.out +!, + '', "a\nb"); + +unlink('file.out'); + +# Don't add newlines if one already exists +run_make_test(q! +define A +a +b + +endef +$(file >file.out,$(A)) +x:;@cat file.out +!, + '', "a\nb"); + +unlink('file.out'); + +# Empty text +run_make_test(q! +$(file >file.out,) +$(file >>file.out,) +x:;@cat file.out +!, + '', "\n\n"); + +unlink('file.out'); + +# Reading files +run_make_test(q! +$(file >file.out,A = foo) +X1 := $(file >file.out,B = bar) +$(eval $(file )', '', + "#MAKEFILE#:1: *** file: missing filename. Stop.\n", 512); + +run_make_test('$(file >>)', '', + "#MAKEFILE#:1: *** file: missing filename. Stop.\n", 512); + +run_make_test('$(file <)', '', + "#MAKEFILE#:1: *** file: missing filename. Stop.\n", 512); + +# Bad call + +run_make_test('$(file foo)', '', + "#MAKEFILE#:1: *** file: invalid file operation: foo. Stop.\n", 512); + +1; diff --git a/third_party/make/tests/scripts/functions/filter-out b/third_party/make/tests/scripts/functions/filter-out new file mode 100644 index 00000000000..1fe4819d828 --- /dev/null +++ b/third_party/make/tests/scripts/functions/filter-out @@ -0,0 +1,42 @@ +# -*-perl-*- + +$description = "Test the filter and filter-out functions."; + +$details = "The makefile created in this test has two variables. The +filter-out function is first used to discard names ending in +.o with a single simple pattern. The second filter-out function +augments the simple pattern with three literal names, which are +also added to the text argument. This tests an internal hash table +which is only used if there are multiple literals present in both +the pattern and text arguments. The result of both filter-out +functions is the same single .elc name.\n"; + +# Basic test -- filter +run_make_test(q! +files1 := $(filter %.o, foo.elc bar.o lose.o) +files2 := $(filter %.o foo.i, foo.i bar.i lose.i foo.elc bar.o lose.o) +all: ; @echo '$(files1) $(files2)' +!, + '', "bar.o lose.o foo.i bar.o lose.o\n"); + +# Basic test -- filter-out +run_make_test(q! +files1 := $(filter-out %.o, foo.elc bar.o lose.o) +files2 := $(filter-out foo.i bar.i lose.i %.o, foo.i bar.i lose.i foo.elc bar.o lose.o) +all: ; @echo '$(files1) $(files2)' +!, + '', "foo.elc foo.elc\n"); + +# Escaped patterns +run_make_test(q!all:;@echo '$(filter foo\%bar,foo%bar fooXbar)'!, + '', "foo%bar\n"); + +run_make_test(q!all:;@echo '$(filter foo\%\%\\\\\%\%bar,foo%%\\%%bar fooX\\Ybar)'!, + '', "foo%%\\%%bar\n"); + +run_make_test(q! +X = $(filter foo\\\\\%bar,foo\%bar foo\Xbar) +all:;@echo '$(X)'!, + '', "foo\\%bar\n"); + +1; diff --git a/third_party/make/tests/scripts/functions/findstring b/third_party/make/tests/scripts/functions/findstring new file mode 100644 index 00000000000..48abede61cb --- /dev/null +++ b/third_party/make/tests/scripts/functions/findstring @@ -0,0 +1,47 @@ +$description = "The following test creates a makefile to test the findstring " + ."function."; + +$details = ""; + +# IF YOU NEED >1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(findstring port, reporter)\n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile, + "", + &get_logfile, + 0); + +# Create the answer to what should be produced by this Makefile +$answer = "port\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/third_party/make/tests/scripts/functions/flavor b/third_party/make/tests/scripts/functions/flavor new file mode 100644 index 00000000000..80d6be79f1e --- /dev/null +++ b/third_party/make/tests/scripts/functions/flavor @@ -0,0 +1,44 @@ +# -*-perl-*- +$description = "Test the flavor function."; + +$details = ""; + + +# Test #1: Test general logic. +# +run_make_test(' +s := s +r = r + +$(info u $(flavor u)) +$(info s $(flavor s)) +$(info r $(flavor r)) + +ra += ra +rc ?= rc + +$(info ra $(flavor ra)) +$(info rc $(flavor rc)) + +s += s +r += r + +$(info s $(flavor s)) +$(info r $(flavor r)) + + +.PHONY: all +all:;@: +', +'', +'u undefined +s simple +r recursive +ra recursive +rc recursive +s simple +r recursive'); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/functions/foreach b/third_party/make/tests/scripts/functions/foreach new file mode 100644 index 00000000000..9badc52e49c --- /dev/null +++ b/third_party/make/tests/scripts/functions/foreach @@ -0,0 +1,95 @@ +# -*-perl-*- +# $Id$ + +$description = "Test the foreach function."; + +$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 +types of foreach loops are tested\n"; + + +# TEST 0 + +# Set an environment variable that we can test in the makefile. +$extraENV{FOOFOO} = 'foo foo'; + +run_make_test("space = ' '".' +null := +auto_var = udef space CC null FOOFOO MAKE foo CFLAGS WHITE @ < +foo = bletch null @ garf +av = $(foreach var, $(auto_var), $(origin $(var)) ) +override WHITE := BLACK +for_var = $(addsuffix .c,foo $(null) $(foo) $(space) $(av) ) +fe = $(foreach var2, $(for_var),$(subst .c,.o, $(var2) ) ) +all: auto for2 +auto : ; @echo $(av) +for2: ; @echo $(fe)', + '-e WHITE=WHITE CFLAGS=', + "undefined file default file environment default file command line override automatic automatic +foo.o bletch.o null.o @.o garf.o .o .o undefined.o file.o default.o file.o environment.o default.o file.o command.o line.o override.o automatic.o automatic.o"); + +delete $extraENV{FOOFOO}; + +# TEST 1: Test that foreach variables take precedence over global +# variables in a global scope (like inside an eval). Tests bug #11913 + +run_make_test(' +.PHONY: all target +all: target + +x := BAD + +define mktarget +target: x := $(x) +target: ; @echo "$(x)" +endef + +x := GLOBAL + +$(foreach x,FOREACH,$(eval $(value mktarget)))', + '', + 'FOREACH'); + +# Allow variable names with trailing space +run_make_test(q! +$(foreach \ + a \ +, b c d \ +, $(info $a)) +all:;@: +!, + "", "b\nc\nd\n"); + +# Allow empty variable names. We still expand the body. + +run_make_test(' +x = $(foreach ,1 2 3,a) +y := $x + +all: ; @echo $y', + '', "a a a\n"); + +# Check some error conditions. + +run_make_test(' +x = $(foreach ) +y = $x + +all: ; @echo $y', + '', + "#MAKEFILE#:2: *** insufficient number of arguments (1) to function 'foreach'. Stop.", + 512); + +run_make_test(' +x = $(foreach x,y) +y := $x + +all: ; @echo $y', + '', + "#MAKEFILE#:2: *** insufficient number of arguments (2) to function 'foreach'. Stop.", + 512); + +1; diff --git a/third_party/make/tests/scripts/functions/guile b/third_party/make/tests/scripts/functions/guile new file mode 100644 index 00000000000..120aaf3bce1 --- /dev/null +++ b/third_party/make/tests/scripts/functions/guile @@ -0,0 +1,116 @@ +# -*-perl-*- + +$description = 'Test the $(guile ...) function.'; + +$details = 'This only works on systems that support it.'; + +# If this instance of make doesn't support GNU Guile, skip it +# This detects if guile is loaded using the "load" directive +# $makefile = get_tmpfile(); +# open(MAKEFILE, "> $makefile") || die "Failed to open $makefile: $!\n"; +# print MAKEFILE q! +# -load guile +# all: ; @echo $(filter guile,$(.LOADED)) +# !; +# close(MAKEFILE) || die "Failed to write $makefile: $!\n"; +# $cmd = subst_make_string("#MAKEPATH# -f $makefile"); +# $log = get_logfile(0); +# $code = run_command_with_output($log, $cmd); +# read_file_into_string ($log) eq "guile\n" and $FEATURES{guile} = 1; + +# 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))'; \ +run_make_test(q! +x:;@echo '$(guile #f)'; \ + echo '$(guile #t)'; \ + echo '$(guile #\c)'; \ + echo '$(guile 1234)'; \ + echo '$(guile 'foo)'; \ + echo '$(guile "bar")'; \ + echo '$(guile (cons 'a 'b))'; \ + echo '$(guile '(a b (c . d) 1 (2) 3))' +!, + '', "\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)")) +x:;@echo '$(VAR)' +!, + '', "hi"); + +# Verify the gmk-eval function +# Prove that the string is expanded only once (by eval) +run_make_test(q! +TEST = bye +EVAL = VAR = $(TEST) $(shell echo there) +$(guile (gmk-eval "$(value EVAL)")) +TEST = hi +x:;@echo '$(VAR)' +!, + '', "hi there"); + +# Verify the gmk-eval function with a list +run_make_test(q! +$(guile (gmk-eval '(VAR = 1 (2) () 3))) +x:;@echo '$(VAR)' +!, + '', "1 2 3"); + +# Verify the gmk-var function +run_make_test(q! +VALUE = hi $(shell echo there) +VAR = $(guile (gmk-var "VALUE")) +x:;@echo '$(VAR)' +!, + '', "hi there"); + +# Verify the gmk-var function with a symbol +run_make_test(q! +VALUE = hi $(shell echo there) +VAR = $(guile (gmk-var 'VALUE)) +x:;@echo '$(VAR)' +!, + '', "hi there"); + +# Write a Guile program using define and run it +run_make_test(q! +# Define the "fib" function in Guile +define fib +;; A procedure for counting the n:th Fibonacci number +;; See SICP, p. 37 +(define (fib n) + (cond ((= n 0) 0) + ((= n 1) 1) + (else (+ (fib (- n 1)) + (fib (- n 2)))))) +endef +$(guile $(fib)) + +# Now run it +x:;@echo $(guile (fib $(FIB))) +!, + 'FIB=10', "55"); + +1; diff --git a/third_party/make/tests/scripts/functions/if b/third_party/make/tests/scripts/functions/if new file mode 100644 index 00000000000..8604e4f2f85 --- /dev/null +++ b/third_party/make/tests/scripts/functions/if @@ -0,0 +1,33 @@ +# -*-perl-*- +$description = "Test the if function.\n"; + +$details = "Try various uses of if and ensure they all give the correct +results.\n"; + +open(MAKEFILE, "> $makefile"); + +print MAKEFILE <1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(join a b c,foo hacks .pl1) \n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "afoo bhacks c.pl1\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/third_party/make/tests/scripts/functions/notdir b/third_party/make/tests/scripts/functions/notdir new file mode 100644 index 00000000000..4ed8f9c7037 --- /dev/null +++ b/third_party/make/tests/scripts/functions/notdir @@ -0,0 +1,44 @@ +$description = "The following test creates a makefile to test the notdir " + ."function."; + +$details = ""; + +# IF YOU NEED >1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(notdir ${pathsep}src${pathsep}foo.c hacks) \n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "foo.c hacks\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/third_party/make/tests/scripts/functions/origin b/third_party/make/tests/scripts/functions/origin new file mode 100644 index 00000000000..f7b7eb84823 --- /dev/null +++ b/third_party/make/tests/scripts/functions/origin @@ -0,0 +1,51 @@ +# -*-perl-*- + +$description = "Test the origin function."; + +$details = "This is a test of the origin function in gnu make. +This function will report on where a variable was +defined per the following list: + +'undefined' never defined +'default' default definition +'environment' environment var without -e +'environment override' environment var with -e +'file' defined in makefile +'command line' defined on the command line +'override' defined by override in makefile +'automatic' Automatic variable\n"; + +# Set an environment variable +$extraENV{MAKETEST} = 1; + +run_make_test(' +foo := bletch garf +auto_var = undefined CC MAKETEST MAKE foo CFLAGS WHITE @ +av = $(foreach var, $(auto_var), $(origin $(var)) ) +override WHITE := BLACK +all: auto + @echo $(origin undefined) + @echo $(origin CC) + @echo $(origin MAKETEST) + @echo $(origin MAKE) + @echo $(origin foo) + @echo $(origin CFLAGS) + @echo $(origin WHITE) + @echo $(origin @) +auto : + @echo $(av)', + '-e WHITE=WHITE CFLAGS=', + 'undefined default environment default file command line override automatic +undefined +default +environment +default +file +command line +override +automatic'); + +# Reset an environment variable +delete $extraENV{MAKETEST}; + +1; diff --git a/third_party/make/tests/scripts/functions/realpath b/third_party/make/tests/scripts/functions/realpath new file mode 100644 index 00000000000..fcea515522b --- /dev/null +++ b/third_party/make/tests/scripts/functions/realpath @@ -0,0 +1,92 @@ +# -*-perl-*- +$description = "Test the realpath functions."; + +$details = ""; + +# Check the local directory's realpath +run_make_test(' +ifneq ($(realpath .),$(CURDIR)) + $(warning $(realpath .) != $(CURDIR)) +endif + +ifneq ($(realpath ./),$(CURDIR)) + $(warning $(realpath ./) != $(CURDIR)) +endif + +ifneq ($(realpath .///),$(CURDIR)) + $(warning $(realpath .///) != $(CURDIR)) +endif + +.PHONY: all +all: ; @: +', + '', ''); + +# 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 /./),#ROOT#) + $(warning $(realpath /./) != #ROOT#) +endif + +ifneq ($(realpath /.///),#ROOT#) + $(warning $(realpath /.///) != #ROOT#) +endif + +ifneq ($(realpath /..),#ROOT#) + $(warning $(realpath /..) != #ROOT#) +endif + +ifneq ($(realpath /../),#ROOT#) + $(warning $(realpath /../) != #ROOT#) +endif + +ifneq ($(realpath /..///),#ROOT#) + $(warning $(realpath /..///) != #ROOT#) +endif + +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. + +if ($port_type ne 'W32') { + $tst = ' +ifneq ($(realpath ///),#ROOT#) + $(warning $(realpath ///) != #ROOT#) +endif + +ifneq ($(realpath ///.),#ROOT#) + $(warning $(realpath ///.) != #ROOT#) +endif + +ifneq ($(realpath ///..),#ROOT#) + $(warning $(realpath ///..) != #ROOT#) +endif + +.PHONY: all +all: ; @:'; + $tst =~ s/#ROOT#/$root/g; + + run_make_test($tst, '', ''); +} + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/functions/shell b/third_party/make/tests/scripts/functions/shell new file mode 100644 index 00000000000..59865293e6f --- /dev/null +++ b/third_party/make/tests/scripts/functions/shell @@ -0,0 +1,90 @@ +# -*-perl-*- + +$description = 'Test the $(shell ...) function.'; + +$details = ''; + +# Test standard shell +run_make_test('.PHONY: all +OUT := $(shell echo hi) +all: ; @echo $(OUT) + ','','hi'); + +# Test shells inside rules. +run_make_test('.PHONY: all +all: ; @echo $(shell echo hi) + ','','hi'); + +# Verify .SHELLSTATUS +run_make_test('.PHONY: all +PRE := $(.SHELLSTATUS) +$(shell exit 0) +OK := $(.SHELLSTATUS) +$(shell exit 1) +BAD := $(.SHELLSTATUS) +all: ; @echo PRE=$(PRE) OK=$(OK) BAD=$(BAD) + ','','PRE= OK=0 BAD=1'); + +# Test unescaped comment characters in shells. Savannah bug #20513 +run_make_test(q! +FOO := $(shell echo '#') +foo: ; echo '$(FOO)' +!, + '', "echo '#'\n#\n"); + +# Test shells inside exported environment variables. +# This is the test that fails if we try to put make exported variables into +# the environment for a $(shell ...) call. +run_make_test(' +export HI = $(shell echo hi) +.PHONY: all +all: ; @echo $$HI + ','','hi'); + +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 $(.SHELLSTATUS) +', + '', "#MAKE#: ./basdfdfsed: $ERR_no_such_file\nhi\n127\n"); + + run_make_test(' +$(shell ./basdfdfsed where) +all: ; @echo $(.SHELLSTATUS) +', + '', "#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; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/functions/sort b/third_party/make/tests/scripts/functions/sort new file mode 100644 index 00000000000..e6e1343d7ce --- /dev/null +++ b/third_party/make/tests/scripts/functions/sort @@ -0,0 +1,51 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to verify +the ability of make to sort lists of object. Sort +will also remove any duplicate entries. This will also +be tested."; + +$details = "The make file is built with a list of object in a random order +and includes some duplicates. Make should sort all of the elements +remove all duplicates\n"; + +run_make_test(' +foo := moon_light days +foo1:= jazz +bar := captured +bar2 = boy end, has rise A midnight +bar3:= $(foo) +s1 := _by +s2 := _and_a +t1 := $(addsuffix $(s1), $(bar) ) +t2 := $(addsuffix $(s2), $(foo1) ) +t3 := $(t2) $(t2) $(t2) $(t2) $(t2) $(t2) $(t2) $(t2) $(t2) $(t2) +t4 := $(t3) $(t3) $(t3) $(t3) $(t3) $(t3) $(t3) $(t3) $(t3) $(t3) +t5 := $(t4) $(t4) $(t4) $(t4) $(t4) $(t4) $(t4) $(t4) $(t4) $(t4) +t6 := $(t5) $(t5) $(t5) $(t5) $(t5) $(t5) $(t5) $(t5) $(t5) $(t5) +t7 := $(t6) $(t6) $(t6) +p1 := $(addprefix $(foo1), $(s2) ) +blank:= +all: + @echo $(sort $(bar2) $(foo) $(addsuffix $(s1), $(bar) ) $(t2) $(bar2) $(bar3)) + @echo $(sort $(blank) $(foo) $(bar2) $(t1) $(p1) ) + @echo $(sort $(foo) $(bar2) $(t1) $(t4) $(t5) $(t7) $(t6) ) +', + '', 'A boy captured_by days end, has jazz_and_a midnight moon_light rise +A boy captured_by days end, has jazz_and_a midnight moon_light rise +A boy captured_by days end, has jazz_and_a midnight moon_light rise +'); + + +# Test with non-space/tab whitespace. Note that you can't see the +# original bug except using valgrind. + +run_make_test("FOO = a b\tc\rd\fe \f \f \f \f \ff +all: ; \@echo \$(words \$(sort \$(FOO)))\n", + '', "6\n"); + +1; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/functions/strip b/third_party/make/tests/scripts/functions/strip new file mode 100644 index 00000000000..8222433f315 --- /dev/null +++ b/third_party/make/tests/scripts/functions/strip @@ -0,0 +1,57 @@ +# -*-perl-*- +$description = "The following test creates a makefile to verify +the ability of make to strip white space from lists of object.\n"; + + +$details = "The make file is built with a list of objects that contain white space +These are then run through the strip command to remove it. This is then +verified by echoing the result.\n"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<'EOMAKE'; +TEST1 := "Is this TERMINAL fun? What makes you believe is this terminal fun? JAPAN is a WONDERFUL planet -- I wonder if we will ever reach their level of COMPARATIVE SHOPPING..." +E := +TEST2 := $E try this and this $E + +define TEST3 + +and these test out + + +some +blank lines + + + +endef + +.PHONY: all +all: + @echo '$(strip $(TEST1) )' + @echo '$(strip $(TEST2) )' + @echo '$(strip $(TEST3) )' + +space: ; @echo '$(strip ) $(strip )' + +EOMAKE + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile); +$answer = "\"Is this TERMINAL fun? What makes you believe is this terminal fun? JAPAN is a WONDERFUL planet -- I wonder if we will ever reach their level of COMPARATIVE SHOPPING...\" +try this and this +and these test out some blank lines +"; +&compare_output($answer,&get_logfile(1)); + + +&run_make_with_options($makefile,"space",&get_logfile); +$answer = " \n"; +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/third_party/make/tests/scripts/functions/substitution b/third_party/make/tests/scripts/functions/substitution new file mode 100644 index 00000000000..0d2f6a2590b --- /dev/null +++ b/third_party/make/tests/scripts/functions/substitution @@ -0,0 +1,38 @@ +# -*-perl-*- + +$description = "Test the subst and patsubst functions"; + +$details = ""; + +# Generic patsubst test: test both the function and variable form. + +run_make_test(' +foo := a.o b.o c.o +bar := $(foo:.o=.c) +bar2:= $(foo:%.o=%.c) +bar3:= $(patsubst %.c,%.o,x.c.c bar.c) +all:;@echo $(bar); echo $(bar2); echo $(bar3)', +'', +'a.c b.c c.c +a.c b.c c.c +x.c.o bar.o'); + +# Patsubst without '%'--shouldn't match because the whole word has to match +# in patsubst. Based on a bug report by Markus Mauhart + +run_make_test('all:;@echo $(patsubst Foo,Repl,FooFoo)', '', 'FooFoo'); + +# Variable subst where a pattern matches multiple times in a single word. +# Based on a bug report by Markus Mauhart + +run_make_test(' +A := fooBARfooBARfoo +all:;@echo $(A:fooBARfoo=REPL)', '', 'fooBARREPL'); + +1; + + + + + + diff --git a/third_party/make/tests/scripts/functions/suffix b/third_party/make/tests/scripts/functions/suffix new file mode 100644 index 00000000000..0c4f919ea10 --- /dev/null +++ b/third_party/make/tests/scripts/functions/suffix @@ -0,0 +1,57 @@ +$description = "The following test creates a makefile to test the suffix\n" + ."function. \n"; + +$details = "The suffix function will return the string following the last _._\n" + ."the list provided. It will provide all of the unique suffixes found\n" + ."in the list. The long strings are sorted to remove duplicates.\n"; + +# IF YOU NEED >1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := word.pl general_test2.pl1 FORCE.pl word.pl3 generic_test.perl /tmp.c/bar foo.baz/bar.c MAKEFILES_variable.c\n" + ."string2 := \$(string) \$(string) \$(string) \$(string) \$(string) \$(string) \$(string)\n" + ."string3 := \$(string2) \$(string2) \$(string2) \$(string2) \$(string2) \$(string2) \$(string2)\n" + ."string4 := \$(string3) \$(string3) \$(string3) \$(string3) \$(string3) \$(string3) \$(string3)\n" + ."all: \n" + ."\t\@echo \$(suffix \$(string)) \n" + ."\t\@echo \$(sort \$(suffix \$(string4))) \n" + ."\t\@echo \$(suffix \$(string) a.out) \n" + ."\t\@echo \$(sort \$(suffix \$(string3))) \n"; + + + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile + +# COMPARE RESULTS +$answer = ".pl .pl1 .pl .pl3 .perl .c .c\n" + .".c .perl .pl .pl1 .pl3\n" + .".pl .pl1 .pl .pl3 .perl .c .c .out\n" + .".c .perl .pl .pl1 .pl3\n"; + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/third_party/make/tests/scripts/functions/value b/third_party/make/tests/scripts/functions/value new file mode 100644 index 00000000000..8e1a6f04b76 --- /dev/null +++ b/third_party/make/tests/scripts/functions/value @@ -0,0 +1,30 @@ +# -*-perl-*- + +$description = "Test the value function."; + +$details = "This is a test of the value function in GNU make. +This function will evaluate to the value of the named variable with no +further expansion performed on it.\n"; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +export FOO = foo + +recurse = FOO = $FOO +static := FOO = $(value FOO) + +all: ; @echo $(recurse) $(value recurse) $(static) $(value static) +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile, "", &get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "FOO = OO FOO = foo FOO = foo FOO = foo\n"; + + +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/third_party/make/tests/scripts/functions/warning b/third_party/make/tests/scripts/functions/warning new file mode 100644 index 00000000000..16eb83bb457 --- /dev/null +++ b/third_party/make/tests/scripts/functions/warning @@ -0,0 +1,83 @@ +# -*-Perl-*- + +$description = "\ +The following test creates a makefile to test the warning function."; + +$details = ""; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +ifdef WARNING1 +$(warning warning is $(WARNING1)) +endif + +ifdef WARNING2 +$(warning warning is $(WARNING2)) +endif + +ifdef WARNING3 +all: some; @echo hi $(warning warning is $(WARNING3)) +endif + +ifdef WARNING4 +all: some; @echo hi + @echo there $(warning warning is $(WARNING4)) +endif + +some: ; @echo Some stuff + +EOF + +close(MAKEFILE); + +# Test #1 + +&run_make_with_options($makefile, "WARNING1=yes", &get_logfile, 0); +$answer = "$makefile:2: warning is yes\nSome stuff\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #2 + +&run_make_with_options($makefile, "WARNING2=no", &get_logfile, 0); +$answer = "$makefile:6: warning is no\nSome stuff\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #3 + +&run_make_with_options($makefile, "WARNING3=maybe", &get_logfile, 0); +$answer = "Some stuff\n$makefile:10: warning is maybe\nhi\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #4 + +&run_make_with_options($makefile, "WARNING4=definitely", &get_logfile, 0); +$answer = "Some stuff\n$makefile:15: warning is definitely\nhi\nthere\n"; +&compare_output($answer,&get_logfile(1)); + +# Test linenumber offset + +run_make_test(q! +all: one two + $(warning in $@ line 3) + @true + $(warning in $@ line 5) + +one two: + $(warning in $@ line 8) + @true + $(warning in $@ line 10) +!, + '', "#MAKEFILE#:8: in one line 8 +#MAKEFILE#:10: in one line 10 +#MAKEFILE#:8: in two line 8 +#MAKEFILE#:10: in two line 10 +#MAKEFILE#:3: in all line 3 +#MAKEFILE#:5: in all line 5\n"); + +# 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: diff --git a/third_party/make/tests/scripts/functions/wildcard b/third_party/make/tests/scripts/functions/wildcard new file mode 100644 index 00000000000..f01f574a97a --- /dev/null +++ b/third_party/make/tests/scripts/functions/wildcard @@ -0,0 +1,163 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to test wildcard +expansions and the ability to put a command on the same +line as the target name separated by a semi-colon."; + +$details = "\ +This test creates 4 files by the names of 1.example, +two.example and 3.example. We execute three tests. The first +executes the print1 target which tests the '*' wildcard by +echoing all filenames by the name of '*.example'. The second +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"; + +touch("example.1"); +touch("example.two"); +touch("example.3"); +touch("example.for"); +touch("example._"); + +# TEST #1 +# ------- + +run_make_test(qq/ +.PHONY: print1 print2 clean +print1: ;\@echo \$(wildcard example.*) +print2: +\t\@echo \$(wildcard example.?) +\t\@echo \$(wildcard example.[a-z0-9]) +\t\@echo \$(wildcard example.[!A-Za-z_\\!]) +clean: +\t$CMD_rmfile \$(wildcard example.*) +/, + 'print1', "example.1 example.3 example._ example.for example.two\n"); + +# TEST #2 +# ------- + +run_make_test(undef, 'print2', "example.1 example.3 example._\n" + ."example.1 example.3\n" + ."example.1 example.3\n"); + +# TEST #3 +# ------- + +$answer = "$CMD_rmfile example.1 example.3 example._ example.for example.two"; +if ($vos) +{ + $answer .= " \n"; +} +else +{ + $answer .= "\n"; +} + +run_make_test(undef, 'clean', $answer); + +# TEST #4: Verify that failed wildcards don't return the pattern + +run_make_test(q! +all: ; @echo $(wildcard xz--y*.7) +!, + '', "\n"); + +# TEST #5: wildcard used to verify file existence + +touch('xxx.yyy'); + +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"); + +# 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; diff --git a/third_party/make/tests/scripts/functions/word b/third_party/make/tests/scripts/functions/word new file mode 100644 index 00000000000..4dcc940652a --- /dev/null +++ b/third_party/make/tests/scripts/functions/word @@ -0,0 +1,167 @@ +# -*-perl-*- +$description = "\ +Test the word, words, wordlist, firstword, and lastword functions.\n"; + +$details = "\ +Produce a variable with a large number of words in it, +determine the number of words, and then read each one back.\n"; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE <<'EOF'; +string := word.pl general_test2.pl FORCE.pl word.pl generic_test.perl MAKEFILES_variable.pl +string2 := $(string) $(string) $(string) $(string) $(string) $(string) $(string) +string3 := $(string2) $(string2) $(string2) $(string2) $(string2) $(string2) $(string2) +string4 := $(string3) $(string3) $(string3) $(string3) $(string3) $(string3) $(string3) +all: + @echo $(words $(string)) + @echo $(words $(string4)) + @echo $(word 1, $(string)) + @echo $(word 100, $(string)) + @echo $(word 1, $(string)) + @echo $(word 1000, $(string3)) + @echo $(wordlist 3, 4, $(string)) + @echo $(wordlist 4, 3, $(string)) + @echo $(wordlist 1, 6, $(string)) + @echo $(wordlist 5, 7, $(string)) + @echo $(wordlist 100, 110, $(string)) + @echo $(wordlist 7, 10, $(string2)) +EOF +close(MAKEFILE); + +&run_make_with_options($makefile, "", &get_logfile); +$answer = "6\n" + ."2058\n" + ."word.pl\n" + ."\n" + ."word.pl\n" + ."\n" + ."FORCE.pl word.pl\n" + ."\n" + ."word.pl general_test2.pl FORCE.pl word.pl generic_test.perl MAKEFILES_variable.pl\n" + ."generic_test.perl MAKEFILES_variable.pl\n" + ."\n" + ."word.pl general_test2.pl FORCE.pl word.pl\n"; +&compare_output($answer, &get_logfile(1)); + + +# Test error conditions + +run_make_test('FOO = foo bar biz baz + +word-e1: ; @echo $(word ,$(FOO)) +word-e2: ; @echo $(word abc ,$(FOO)) +word-e3: ; @echo $(word 1a,$(FOO)) + +wordlist-e1: ; @echo $(wordlist ,,$(FOO)) +wordlist-e2: ; @echo $(wordlist abc ,,$(FOO)) +wordlist-e3: ; @echo $(wordlist 1, 12a ,$(FOO))', + 'word-e1', + "#MAKEFILE#:3: *** non-numeric first argument to 'word' function: ''. Stop.", + 512); + +run_make_test(undef, + 'word-e2', + "#MAKEFILE#:4: *** non-numeric first argument to 'word' function: 'abc '. Stop.", + 512); + +run_make_test(undef, + 'word-e3', + "#MAKEFILE#:5: *** non-numeric first argument to 'word' function: '1a'. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e1', + "#MAKEFILE#:7: *** non-numeric first argument to 'wordlist' function: ''. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e2', + "#MAKEFILE#:8: *** non-numeric first argument to 'wordlist' function: 'abc '. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e3', + "#MAKEFILE#:9: *** non-numeric second argument to 'wordlist' function: ' 12a '. Stop.", + 512); + +# Test error conditions again, but this time in a variable reference + +run_make_test('FOO = foo bar biz baz + +W = $(word $x,$(FOO)) +WL = $(wordlist $s,$e,$(FOO)) + +word-e: ; @echo $(W) +wordlist-e: ; @echo $(WL)', + 'word-e x=', + "#MAKEFILE#:3: *** non-numeric first argument to 'word' function: ''. Stop.", + 512); + +run_make_test(undef, + 'word-e x=abc', + "#MAKEFILE#:3: *** non-numeric first argument to 'word' function: 'abc'. Stop.", + 512); + +run_make_test(undef, + 'word-e x=0', + "#MAKEFILE#:3: *** first argument to 'word' function must be greater than 0. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e s= e=', + "#MAKEFILE#:4: *** non-numeric first argument to 'wordlist' function: ''. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e s=abc e=', + "#MAKEFILE#:4: *** non-numeric first argument to 'wordlist' function: 'abc'. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e s=4 e=12a', + "#MAKEFILE#:4: *** non-numeric second argument to 'wordlist' function: '12a'. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e s=0 e=12', + "#MAKEFILE#:4: *** invalid first argument to 'wordlist' function: '0'. Stop.", + 512); + + +# TEST #8 -- test $(firstword ) +# +run_make_test(' +void := +list := $(void) foo bar baz # + +a := $(word 1,$(list)) +b := $(firstword $(list)) + +.PHONY: all + +all: + @test "$a" = "$b" && echo $a +', +'', +'foo'); + + +# TEST #9 -- test $(lastword ) +# +run_make_test(' +void := +list := $(void) foo bar baz # + +a := $(word $(words $(list)),$(list)) +b := $(lastword $(list)) + +.PHONY: all + +all: + @test "$a" = "$b" && echo $a +', +'', +'baz'); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/misc/bs-nl b/third_party/make/tests/scripts/misc/bs-nl new file mode 100644 index 00000000000..fdf4aabcb76 --- /dev/null +++ b/third_party/make/tests/scripts/misc/bs-nl @@ -0,0 +1,232 @@ +# -*-perl-*- +$description = "Test backslash-newline handling."; + +$details = ""; + +# TEST #1 +# ------- + +# Backslash-newlines in recipes + +# These are basic backslash-newlines with no tricks +run_make_test("fast:;\@echo fa\\\nst\n", + '', 'fast'); + +run_make_test("slow:;\@: no-op; echo sl\\\now\n", + '', 'slow'); + +run_make_test("dquote:;\@echo \"dqu\\\note\"\n", + '', 'dquote'); + +# 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", + '', 'fast'); + +run_make_test("slow:;\@: no-op; echo sl\\\n\tow\n", + '', 'slow'); + +run_make_test("dquote:;\@echo \"dqu\\\n\tote\"\n", + '', 'dquote'); + +# 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", + '', 'fa st'); + +run_make_test("slow:;\@: no-op; echo sl\\\n\t\tow\n", + '', "sl ow"); + +run_make_test("dquote:;\@echo \"dqu\\\n\t ote\"\n", + '', 'dqu ote'); + +run_make_test("squote:;\@echo 'squ\\\n\t\t ote'\n", + '', "squ\\\n\t ote"); + +# Backslash-newlines in variable values + +# Simple +run_make_test(q! +var = he\ +llo +var:;@echo '|$(var)|'!, + '', "|he llo|"); + +# Condense trailing space +run_make_test(q! +var = he \ +llo +var:;@echo '|$(var)|'!, + '', "|he llo|"); + +# Remove leading space +run_make_test(q! +var = he\ + llo +var:;@echo '|$(var)|'!, + '', "|he llo|"); + +# Multiple bs/nl condensed +run_make_test(q! +var = he\ +\ +\ + llo +var:;@echo '|$(var)|'!, + '', "|he llo|"); + +# POSIX: Preserve trailing space +run_make_test(q! +.POSIX: +x = y +var = he \ +llo +var:;@echo '|$(var)|'!, + '', "|he llo|"); + +# POSIX: One space per bs-nl +run_make_test(q! +.POSIX: +x = y +var = he\ +\ +\ + llo +var:;@echo '|$(var)|'!, + '', "|he llo|"); + +# Savannah #39035: handle whitespace in call +run_make_test(q! +f = echo $(1) +t:; @$(call f,"a \ + b"); \ + $(call f,"a \ + b") +!, + '', "a b\na b\n"); + +# Savannah #38945: handle backslash CRLF +# We need our own makefile so we can set binmode +my $m1 = get_tmpfile(); +open(MAKEFILE, "> $m1"); +binmode(MAKEFILE); +print MAKEFILE "FOO = foo \\\r\n"; +close(MAKEFILE); + +my $m2 = get_tmpfile(); +open(MAKEFILE, "> $m2"); +print MAKEFILE "include $m1\ndefine BAR\nall: ; \@echo \$(FOO) bar\nendef\n\$(eval \$(BAR))\n"; +close(MAKEFILE); + +run_make_with_options($m2, '', get_logfile()); +compare_output("foo bar\n", get_logfile(1)); + +# Test different types of whitespace, and bsnl inside functions + +sub xlate +{ + $_ = $_[0]; + s/\\r/\r/g; + s/\\t/\t/g; + s/\\f/\f/g; + s/\\n/\n/g; + return $_; +} + +run_make_test(xlate(q! +$(foreach\r a \t , b\t c \r ,$(info $a \r ) ) +all:;@: +!), + '', "b \r \nc \r \n"); + +run_make_test(xlate(q! +all:;@:$(foreach\r a \t , b\t c \r ,$(info $a \r ) ) +!), + '', "b \r \nc \r \n"); + +run_make_test(xlate(q! +$(foreach \ +\r a \t\ + , b\t \ + c \r ,$(info \ + $a \r ) \ + ) +all:;@: +!), + '', "b \r \nc \r \n"); + +run_make_test(xlate(q! +all:;@:$(foreach \ +\r a \t\ + , b\t \ + c \r ,$(info \ + $a \r ) \ + ) +!), + '', "b \r \nc \r \n"); + +run_make_test(xlate(q! +define FOO +$(foreach +\r a \t + , b\t + c \r ,$(info + $a \r ) + ) +endef +$(FOO) +all:;@: +!), + '', "b \r \nc \r \n"); + +run_make_test(xlate(q! +define FOO +$(foreach +\r a \t + , b\t + c \r ,$(info + $a \r ) + ) +endef +all:;@:$(FOO) +!), + '', "b \r \nc \r \n"); + +# Test variables in recipes that expand to multiple lines + +run_make_test(q! +define var + +echo foo + + +echo bar +endef +all:;$(var) +!, + '', "echo foo\nfoo\necho bar\nbar\n"); + +run_make_test(q! +define var + +echo foo + +@ + +echo bar +endef +all:;$(var) +!, + '', "echo foo\nfoo\necho bar\nbar\n"); + +1; diff --git a/third_party/make/tests/scripts/misc/close_stdout b/third_party/make/tests/scripts/misc/close_stdout new file mode 100644 index 00000000000..b16ea8da548 --- /dev/null +++ b/third_party/make/tests/scripts/misc/close_stdout @@ -0,0 +1,9 @@ +# -*-perl-*- + +$description = "Make sure make exits with an error if stdout is full."; + +-e '/dev/full' or return -1; + +run_make_test('', '-v > /dev/full', '/^#MAKE#: write error/', 256); + +1; diff --git a/third_party/make/tests/scripts/misc/fopen-fail b/third_party/make/tests/scripts/misc/fopen-fail new file mode 100644 index 00000000000..2ec9810b8f4 --- /dev/null +++ b/third_party/make/tests/scripts/misc/fopen-fail @@ -0,0 +1,18 @@ +# -*-perl-*- + +$description = "Make sure make exits with an error if fopen fails."; + +# Recurse infinitely until we run out of open files, and ensure we +# fail with a non-zero exit code. Don't bother to test the output +# since it's hard to know what it will be, exactly. +# See Savannah bug #27374. + +# Use a longer-than-normal timeout: some systems have more FDs available? +# We also set ulimit -n 512 in check-regression in Makefile.am, which see. +# See Savannah bug #42390. +run_make_test(q! +include $(lastword $(MAKEFILE_LIST)) +!, + '', undef, 512, 300); + +1; diff --git a/third_party/make/tests/scripts/misc/general1 b/third_party/make/tests/scripts/misc/general1 new file mode 100644 index 00000000000..352fc6adac4 --- /dev/null +++ b/third_party/make/tests/scripts/misc/general1 @@ -0,0 +1,51 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to test the +simple functionality of make. It mimics the +rebuilding of a product with dependencies. +It also tests the simple definition of VPATH."; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE < $makefile"); + +# The contents of the Makefile ... + +print MAKEFILE < $makefile2"); +print MAKEFILE "all:;\@echo FOO = \$(FOO)\nFOO = foo"; +close(MAKEFILE); + +&run_make_with_options($makefile2,"",&get_logfile); +$answer = "FOO = foo\n"; +&compare_output($answer,&get_logfile(1)); + +# TEST 3 + +# Check semicolons in variable references + +run_make_test(' +$(if true,$(info true; true)) +all: ; @: +', + '', 'true; true'); + +# TEST 4 + +# Check that backslashes in command scripts are handled according to POSIX. +# Checks Savannah bug # 1332. + +# Test the fastpath / no quotes +run_make_test(' +all: + @echo foo\ +bar + @echo foo\ + bar + @echo foo\ + bar + @echo foo\ + bar + @echo foo \ +bar + @echo foo \ + bar + @echo foo \ + bar + @echo foo \ + bar +', + '', 'foobar +foobar +foo bar +foo bar +foo bar +foo bar +foo bar +foo bar'); + +# Test the fastpath / single quotes +# Single quotes don't behave the same in Windows +if ($port_type ne 'W32') { + run_make_test(q! +all: + @echo 'foo\ +bar' + @echo 'foo\ + bar' + @echo 'foo\ + bar' + @echo 'foo\ + bar' + @echo 'foo \ +bar' + @echo 'foo \ + bar' + @echo 'foo \ + bar' + @echo 'foo \ + bar' +!, + '', 'foo\ +bar +foo\ +bar +foo\ + bar +foo\ + bar +foo \ +bar +foo \ +bar +foo \ + bar +foo \ + bar'); +} + +# Test the fastpath / double quotes +run_make_test(' +all: + @echo "foo\ +bar" + @echo "foo\ + bar" + @echo "foo\ + bar" + @echo "foo\ + bar" + @echo "foo \ +bar" + @echo "foo \ + bar" + @echo "foo \ + bar" + @echo "foo \ + bar" +', + '', 'foobar +foobar +foo bar +foo bar +foo bar +foo bar +foo bar +foo bar'); + +# Test the slow path / no quotes +run_make_test(' +all: + @echo hi; echo foo\ +bar + @echo hi; echo foo\ + bar + @echo hi; echo foo\ + bar + @echo hi; echo foo\ + bar + @echo hi; echo foo \ +bar + @echo hi; echo foo \ + bar + @echo hi; echo foo \ + bar + @echo hi; echo foo \ + bar +', + '', 'hi +foobar +hi +foobar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar'); + +# Test the slow path / no quotes. This time we put the slow path +# determination _after_ the backslash-newline handling. +run_make_test(' +all: + @echo foo\ +bar; echo hi + @echo foo\ + bar; echo hi + @echo foo\ + bar; echo hi + @echo foo\ + bar; echo hi + @echo foo \ +bar; echo hi + @echo foo \ + bar; echo hi + @echo foo \ + bar; echo hi + @echo foo \ + bar; echo hi +', + '', 'foobar +hi +foobar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi'); + +# Test the slow path / single quotes +run_make_test(q! +all: + @echo hi; echo 'foo\ +bar' + @echo hi; echo 'foo\ + bar' + @echo hi; echo 'foo\ + bar' + @echo hi; echo 'foo\ + bar' + @echo hi; echo 'foo \ +bar' + @echo hi; echo 'foo \ + bar' + @echo hi; echo 'foo \ + bar' + @echo hi; echo 'foo \ + bar' +!, + '', 'hi +foo\ +bar +hi +foo\ +bar +hi +foo\ + bar +hi +foo\ + bar +hi +foo \ +bar +hi +foo \ +bar +hi +foo \ + bar +hi +foo \ + bar'); + +# Test the slow path / double quotes +run_make_test(' +all: + @echo hi; echo "foo\ +bar" + @echo hi; echo "foo\ + bar" + @echo hi; echo "foo\ + bar" + @echo hi; echo "foo\ + bar" + @echo hi; echo "foo \ +bar" + @echo hi; echo "foo \ + bar" + @echo hi; echo "foo \ + bar" + @echo hi; echo "foo \ + bar" +', + '', 'hi +foobar +hi +foobar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +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: diff --git a/third_party/make/tests/scripts/misc/general4 b/third_party/make/tests/scripts/misc/general4 new file mode 100644 index 00000000000..eeb8d106754 --- /dev/null +++ b/third_party/make/tests/scripts/misc/general4 @@ -0,0 +1,121 @@ +# -*-perl-*- + +$description = "\ +This tests random features of make's algorithms, often somewhat obscure, +which have either broken at some point in the past or seem likely to +break."; + +run_make_test(' +# Make sure that subdirectories built as prerequisites are actually handled +# properly. + +all: dir/subdir/file.a + +dir/subdir: ; @echo mkdir -p dir/subdir + +dir/subdir/file.b: dir/subdir ; @echo touch dir/subdir/file.b + +dir/subdir/%.a: dir/subdir/%.b ; @echo cp $< $@', + '', "mkdir -p dir/subdir\ntouch dir/subdir/file.b\ncp dir/subdir/file.b dir/subdir/file.a\n"); + +# Test implicit rules + +&touch('foo.c'); +run_make_test('foo: foo.o', + 'CC="@echo cc" OUTPUT_OPTION=', + 'cc -c foo.c +cc foo.o -o foo'); +unlink('foo.c'); + + +# Test implicit rules with '$' in the name (see se_implicit) + +run_make_test(q! +%.foo : baz$$bar ; @echo 'done $<' +%.foo : bar$$baz ; @echo 'done $<' +test.foo: +baz$$bar bar$$baz: ; @echo '$@' +!, + '', + "baz\$bar\ndone baz\$bar"); + + +# Test implicit rules with '$' in the name (see se_implicit) +# Use the '$' in the pattern. + +run_make_test(q! +%.foo : %$$bar ; @echo 'done $<' +test.foo: +test$$bar: ; @echo '$@' +!, + '', + "test\$bar\ndone test\$bar"); + +# Make sure that subdirectories built as prerequisites are actually handled +# properly... this time with '$' + +run_make_test(q! + +all: dir/subdir/file.$$a + +dir/subdir: ; @echo mkdir -p '$@' + +dir/subdir/file.$$b: dir/subdir ; @echo touch '$@' + +dir/subdir/%.$$a: dir/subdir/%.$$b ; @echo 'cp $< $@' +!, + '', "mkdir -p dir/subdir\ntouch dir/subdir/file.\$b\ncp dir/subdir/file.\$b dir/subdir/file.\$a\n"); + +# Test odd whitespace at the beginning of a line + +run_make_test(" +all: + \f + + \\ + \f \\ + \013 \\ +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; diff --git a/third_party/make/tests/scripts/misc/utf8 b/third_party/make/tests/scripts/misc/utf8 new file mode 100644 index 00000000000..2adcd071d6d --- /dev/null +++ b/third_party/make/tests/scripts/misc/utf8 @@ -0,0 +1,14 @@ +# -*-perl-*- +$description = "Test utf8 handling."; + +$details = ""; + +# Variable names containing UTF8 characters +run_make_test(" +\xe2\x96\xaa := hello +\$(info \$(\xe2\x96\xaa)) +all: +", + '', "hello\n#MAKE#: Nothing to be done for 'all'."); + +1; diff --git a/third_party/make/tests/scripts/options/dash-B b/third_party/make/tests/scripts/options/dash-B new file mode 100644 index 00000000000..4c4c4cfb6c7 --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-B @@ -0,0 +1,87 @@ +# -*-perl-*- + +$description = "Test make -B (always remake) option.\n"; + +$details = "\ +Construct a simple makefile that builds a target. +Invoke make once, so it builds everything. Invoke it again and verify +that nothing is built. Then invoke it with -B and verify that everything +is built again."; + +&touch('bar.x'); + +run_make_test(' +.SUFFIXES: + +.PHONY: all +all: foo + +foo: bar.x + @echo cp $< $@ + @echo "" > $@ +', + '', 'cp bar.x foo'); + +run_make_test(undef, '', "#MAKE#: Nothing to be done for 'all'."); +run_make_test(undef, '-B', 'cp bar.x foo'); + +# Put the timestamp for foo into the future; it should still be remade. + +utouch(1000, 'foo'); +run_make_test(undef, '', "#MAKE#: Nothing to be done for 'all'."); +run_make_test(undef, '-B', 'cp bar.x foo'); + +# Clean up + +rmfiles('bar.x', 'foo'); + +# Test -B with the re-exec feature: we don't want to re-exec forever +# Savannah bug # 7566 + +run_make_test(' +all: ; @: +$(info MAKE_RESTARTS=$(MAKE_RESTARTS)) +include foo.x +foo.x: ; @touch $@ +', + '-B', 'MAKE_RESTARTS= +MAKE_RESTARTS=1'); + +rmfiles('foo.x'); + +# Test -B with the re-exec feature: we DO want -B in the "normal" part of the +# makefile. + +&touch('blah.x'); + +run_make_test(' +all: blah.x ; @echo $@ +$(info MAKE_RESTARTS=$(MAKE_RESTARTS)) +include foo.x +foo.x: ; @touch $@ +blah.x: ; @echo $@ +', + '-B', 'MAKE_RESTARTS= +MAKE_RESTARTS=1 +blah.x +all'); + +rmfiles('foo.x', 'blah.x'); + +# Test that $? is set properly with -B; all prerequisites will be newer! + +utouch(-10, 'x.b'); +touch('x.a'); + +run_make_test(q! +x.a: x.b ; @echo $? +!, + '-B', "x.b\n"); + +unlink(qw(x.a x.b)); + +1; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/options/dash-C b/third_party/make/tests/scripts/options/dash-C new file mode 100644 index 00000000000..7daf69f24c1 --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-C @@ -0,0 +1,66 @@ +# -*-perl-*- + +$description = "Test the -C option to GNU make."; + +$details = "\ +This test is similar to the clean test except that this test creates the file +to delete in the work directory instead of the current directory. Make is +called from another directory using the -C workdir option so that it can both +find the makefile and the file to delete in the work directory."; + +$example = $workdir . $pathsep . "EXAMPLE"; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE qq! +all: ; \@echo This makefile did not clean the dir ... good +clean: ; $CMD_rmfile EXAMPLE\$(ext) +!; +close(MAKEFILE); + +# TEST #1 +# ------- +touch($example); + +run_make_with_options("${testname}.mk", "-C $workdir clean", &get_logfile); + +use Cwd; + +chdir $workdir; +$wpath = cwd(); +chdir $cwdpath; + +if (-f $example) { + $test_passed = 0; +} + +# Create the answer to what should be produced by this Makefile +$answer = "$make_name: Entering directory '$wpath'\n" + . "$CMD_rmfile EXAMPLE\n" + . "$make_name: Leaving directory '$wpath'\n"; + +compare_output($answer,&get_logfile(1)); + + +# TEST #2 +# ------- +# Do it again with trailing "/"; this should work the same + +$example .= "slash"; + +touch($example); + +run_make_with_options("${testname}.mk", "-C $workdir/ clean ext=slash", &get_logfile); + +if (-f $example) { + $test_passed = 0; +} + +# Create the answer to what should be produced by this Makefile +$answer = "$make_name: Entering directory '$wpath'\n" + . "$CMD_rmfile EXAMPLEslash\n" + . "$make_name: Leaving directory '$wpath'\n"; + +&compare_output($answer,&get_logfile(1)); + +unlink($example); +1; diff --git a/third_party/make/tests/scripts/options/dash-I b/third_party/make/tests/scripts/options/dash-I new file mode 100644 index 00000000000..5d2df389864 --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-I @@ -0,0 +1,61 @@ +# -*-perl-*- + +$description ="The following test creates a makefile to test the -I option."; + +$details = "\ +This test tests the -I option by including a filename in +another directory and giving make that directory name +under -I in the command line. Without this option, the make +would fail to find the included file. It also checks to make +sure that the -I option gets passed to recursive makes."; + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +$mf2 = substr ($makefile2, index ($makefile2, $pathsep) + 1); +print MAKEFILE < $makefile2"); + +print MAKEFILE <> $@ +', + '', "echo >> b.x\necho >> a.x"); + +# Run it again: nothing should happen + +run_make_test(undef, '', "#MAKE#: 'a.x' is up to date."); + +# Now run it with -W b.x: should rebuild a.x + +run_make_test(undef, '-W b.x', 'echo >> a.x'); + +# Put the timestamp for a.x into the future; it should still be remade. + +utouch(1000, 'a.x'); +run_make_test(undef, '', "#MAKE#: 'a.x' is up to date."); +run_make_test(undef, '-W b.x', 'echo >> a.x'); + +# Clean up + +rmfiles('a.x', 'b.x'); + +# Test -W with the re-exec feature: we don't want to re-exec forever +# Savannah bug # 7566 + +# First set it up with a normal build + +run_make_test(' +all: baz.x ; @: +include foo.x +foo.x: bar.x + @echo "\$$(info restarts=\$$(MAKE_RESTARTS))" > $@ + @echo "touch $@" +bar.x: ; echo >> $@ +baz.x: bar.x ; @echo "touch $@" +', + '', 'echo >> bar.x +touch foo.x +restarts=1 +touch baz.x'); + +# Now run with -W bar.x + +# Tweak foo.x's timestamp so the update will change it. +&utouch(1000, 'foo.x'); + +run_make_test(undef, '-W bar.x', "restarts=\ntouch foo.x\nrestarts=1\ntouch baz.x"); + +rmfiles('foo.x', 'bar.x'); + +# Test -W on vpath-found files: it should take effect. +# Savannah bug # 15341 + +mkdir('x-dir', 0777); +utouch(-20, 'x-dir/x'); +touch('y'); + +run_make_test(' +y: x ; @echo cp $< $@ +', + '-W x-dir/x VPATH=x-dir', + 'cp x-dir/x y'); + +# Make sure ./ stripping doesn't interfere with the match. + +run_make_test(' +y: x ; @echo cp $< $@ +', + '-W ./x-dir/x VPATH=x-dir', + 'cp x-dir/x y'); + +run_make_test(undef, + '-W x-dir/x VPATH=./x-dir', + 'cp ./x-dir/x y'); + +unlink(qw(y x-dir/x)); +rmdir('x-dir'); + +1; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/options/dash-e b/third_party/make/tests/scripts/options/dash-e new file mode 100644 index 00000000000..17c3fc86534 --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-e @@ -0,0 +1,24 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to ..."; + +$details = ""; + +$extraENV{GOOGLE} = 'boggle'; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +GOOGLE = bazzle +all:; @echo "$(GOOGLE)" +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile, '-e' ,&get_logfile); + +$answer = "boggle\n"; + +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/third_party/make/tests/scripts/options/dash-f b/third_party/make/tests/scripts/options/dash-f new file mode 100644 index 00000000000..3aa47460761 --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-f @@ -0,0 +1,85 @@ +$description = "The following test tests that if you specify greater \n" + ."than one '-f makefilename' on the command line, \n" + ."that make concatenates them. This test creates three \n" + ."makefiles and specifies all of them with the -f option \n" + ."on the command line. To make sure they were concatenated, \n" + ."we then call make with the rules from the concatenated \n" + ."makefiles one at a time. Finally, it calls all three \n" + ."rules in one call to make and checks that the output\n" + ."is in the correct order."; + +$makefile2 = &get_tmpfile; +$makefile3 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "all: \n"; +print MAKEFILE "\t\@echo This is the output from the original makefile\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +# Create a second makefile +open(MAKEFILE,"> $makefile2"); +print MAKEFILE "TWO: \n"; +print MAKEFILE "\t\@echo This is the output from makefile 2\n"; +close(MAKEFILE); + +# Create a third makefile +open(MAKEFILE,"> $makefile3"); +print MAKEFILE "THREE: \n"; +print MAKEFILE "\t\@echo This is the output from makefile 3\n"; +close(MAKEFILE); + + +# Create the answer to what should be produced by this Makefile +$answer = "This is the output from the original makefile\n"; + +# Run make to catch the default rule +&run_make_with_options($makefile,"-f $makefile2 -f $makefile3",&get_logfile,0); + +&compare_output($answer,&get_logfile(1)); + + +# Run Make again with the rule from the second makefile: TWO +$answer = "This is the output from makefile 2\n"; + +&run_make_with_options($makefile,"-f $makefile2 -f $makefile3 TWO",&get_logfile,0); + +&compare_output($answer,&get_logfile(1)); + + +# Run Make again with the rule from the third makefile: THREE + +$answer = "This is the output from makefile 3\n"; +&run_make_with_options($makefile, + "-f $makefile2 -f $makefile3 THREE", + &get_logfile, + 0); +&compare_output($answer,&get_logfile(1)); + + +# Run Make again with ALL three rules in the order 2 1 3 to make sure +# that all rules are executed in the proper order + +$answer = "This is the output from makefile 2\n"; +$answer .= "This is the output from the original makefile\n"; +$answer .= "This is the output from makefile 3\n"; +&run_make_with_options($makefile, + "-f $makefile2 -f $makefile3 TWO all THREE", + &get_logfile, + 0); +&compare_output($answer,&get_logfile(1)); + + + + + + + + + + diff --git a/third_party/make/tests/scripts/options/dash-k b/third_party/make/tests/scripts/options/dash-k new file mode 100644 index 00000000000..cd78e7f00ae --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-k @@ -0,0 +1,116 @@ +# -*-perl-*- + +$description = "Test the make -k (don't stop on error) option.\n"; + +$details = "\ +The makefile created in this test is a simulation of building +a small product. However, the trick to this one is that one +of the dependencies of the main target does not exist. +Without the -k option, make would fail immediately and not +build any part of the target. What we are looking for here, +is that make builds the rest of the dependencies even though +it knows that at the end it will fail to rebuild the main target."; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE < $makefile2"); +print MAKEFILE <<'EOF'; +.SUFFIXES: + +all: exe1 exe2; @echo making $@ + +exe1 exe2: lib; @echo cp $^ $@ + +lib: foo.o; @echo cp $^ $@ + +foo.o: ; exit 1 +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, "-k", &get_logfile, $error_code); + +$answer = "exit 1 +$make_name: *** [$makefile2:9: foo.o] Error 1 +$make_name: Target 'all' not remade because of errors.\n"; + +&compare_output($answer, &get_logfile(1)); + +# TEST -- make sure we keep the error code if we can't create an included +# makefile. + +if (defined $ERR_no_such_file) { + run_make_test('all: ; @echo hi +include ifile +ifile: no-such-file; @false +', + '-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); +} + +1; diff --git a/third_party/make/tests/scripts/options/dash-l b/third_party/make/tests/scripts/options/dash-l new file mode 100644 index 00000000000..637c8bd8f69 --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-l @@ -0,0 +1,50 @@ +# -*-perl-*- +# Date: Tue, 11 Aug 1992 09:34:26 -0400 +# From: pds@lemming.webo.dg.com (Paul D. Smith) + +$description = "Test load balancing (-l) option."; + +$details = "\ +This test creates a makefile where all depends on three rules +which contain the same body. Each rule checks for the existence +of a temporary file; if it exists an error is generated. If it +doesn't exist then it is created, the rule sleeps, then deletes +the temp file again. Thus if any of the rules are run in +parallel the test will fail. When make is called in this test, +it is given the -l option with a value of 0.0001. This ensures +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."; + +# 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; %s test-file; \ +else \ + echo $@ FAILED; \ +fi +endef + +all : ONE TWO THREE +ONE : ; @$(test) +TWO : ; @$(test) +THREE : ; @$(test) +,, $CMD_rmfile; +close(MAKEFILE); + +$mkoptions = "-l 0.0001"; +$mkoptions .= " -j 4" if ($parallel_jobs); + +# We have to wait longer than the default (5s). +&run_make_with_options($makefile, $mkoptions, &get_logfile, 0, 8); + +$slurp = &read_file_into_string (&get_logfile(1)); +if ($slurp !~ /cannot enforce load limit/) { + &compare_output("", &get_logfile(1)); +} + +1; diff --git a/third_party/make/tests/scripts/options/dash-n b/third_party/make/tests/scripts/options/dash-n new file mode 100644 index 00000000000..ca3b43d67c6 --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-n @@ -0,0 +1,100 @@ +# -*-perl-*- +$description = "Test the -n option.\n"; + +$details = "Try various uses of -n and ensure they all give the correct results.\n"; + +touch('orig'); + +run_make_test(q! +final: intermediate ; echo >> $@ +intermediate: orig ; echo >> $@ +!, + '', "echo >> intermediate\necho >> final\n"); + +# TEST 1 + +run_make_test(undef, '-Worig -n', "echo >> intermediate\necho >> final\n"); + +rmfiles(qw(orig intermediate final)); + +# We consider the actual updated timestamp of targets with all +# recursive commands, even with -n. Switching this to the new model +# is non-trivial because we use a trick below to change the log content +# before we compare it ... + +$makefile2 = &get_tmpfile; + +open(MAKEFILE, "> $makefile2"); + +print MAKEFILE <<'EOF'; +.SUFFIXES: +BAR = # nothing +FOO = +$(BAR) +a: b; echo > $@ +b: c; $(FOO) +EOF + +close(MAKEFILE); + +&utouch(-20, 'b'); +&utouch(-10, 'a'); +&touch('c'); + +# TEST 2 + +&run_make_with_options($makefile2, "", &get_logfile); +$answer = "$make_name: 'a' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 3 + +&run_make_with_options($makefile2, "-n", &get_logfile); +$answer = "$make_name: 'a' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 4 + +unlink(qw(a b)); + +&run_make_with_options($makefile2, "-t -n", &get_logfile); + +open(DASH_N_LOG, ">>" . &get_logfile(1)); +print DASH_N_LOG "a exists but should not!\n" if -e 'a'; +print DASH_N_LOG "b exists but should not!\n" if -e 'b'; +close(DASH_N_LOG); + +&compare_output("touch b\ntouch a\n", &get_logfile(1)); + +# CLEANUP + +unlink(qw(a b c)); + +# Ensure -n continues to be included with recursive/re-execed make +# See Savannah bug #38051 + +$topmake = &get_tmpfile; +$submake = &get_tmpfile; + +open(MAKEFILE, "> $topmake"); +print MAKEFILE <<"EOF"; +foo: ; \@\$(MAKE) -f "$submake" bar +EOF +close(MAKEFILE); + + +# The bar target should print what would happen, but not actually run +open(MAKEFILE, "> $submake"); +print MAKEFILE <<'EOF'; +inc: ; touch $@ +-include inc +bar: ; @echo $(strip $(MAKEFLAGS)) +EOF +close(MAKEFILE); + +&run_make_with_options($topmake, '-n --no-print-directory', &get_logfile); +$answer = subst_make_string("#MAKEPATH# -f \"$submake\" bar\ntouch inc\necho n --no-print-directory\n"); +&compare_output($answer, &get_logfile(1)); + +unlink('inc'); + +1; diff --git a/third_party/make/tests/scripts/options/dash-q b/third_party/make/tests/scripts/options/dash-q new file mode 100644 index 00000000000..e67b55d4449 --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-q @@ -0,0 +1,86 @@ +# -*-perl-*- +$description = "Test the -q option.\n"; + +$details = "Try various uses of -q and ensure they all give the correct results.\n"; + +# TEST 0 + +run_make_test(qq! +one: +two: ; +three: ; : +four: ; \$(.XY) +five: ; \\ + \$(.XY) +six: ; \\ + \$(.XY) +\t\$(.XY) +seven: ; \\ + \$(.XY) +\t: foo +\t\$(.XY) +!, + '-q one', ''); + +# TEST 1 + +run_make_test(undef, '-q two', ''); + +# TEST 2 + +run_make_test(undef, '-q three', '', 256); + +# TEST 3 + +run_make_test(undef, '-q four', ''); + +# TEST 4 + +run_make_test(undef, '-q five', ''); + +# TEST 5 + +run_make_test(undef, '-q six', ''); + +# TEST 6 + +run_make_test(undef, '-q seven', '', 256); + +# TEST 7 : Savannah bug # 7144 + +run_make_test(' +one:: ; @echo one +one:: ; @echo two +', + '-q', '', 256); + +# TEST 7 : Savannah bug # 42249 +# Make sure we exit with 1 even for prerequisite updates +run_make_test(' +build-stamp: ; echo $@ +build-arch: build-stamp +build-x: build-arch +build-y: build-x +', + '-q build-y', '', 256); + +# TEST 8 +# Make sure we exit with 2 on error even with -q +run_make_test(' +build-stamp: ; echo $@ +build-arch: build-stamp-2 +build-x: build-arch +build-y: build-x +', + '-q build-y', "#MAKE#: *** No rule to make target 'build-stamp-2', needed by 'build-arch'. Stop.\n", 512); + +# TEST 9 : Savannah bug # 47151 +# Make sure we exit with 1 when invoking a recursive make +run_make_test(' +foo: bar ; echo foo +bar: ; @$(MAKE) -f #MAKEFILE# baz +baz: ; echo baz +', + '-q foo', '', 256); + +1; diff --git a/third_party/make/tests/scripts/options/dash-s b/third_party/make/tests/scripts/options/dash-s new file mode 100644 index 00000000000..76bffe63fdd --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-s @@ -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; diff --git a/third_party/make/tests/scripts/options/dash-t b/third_party/make/tests/scripts/options/dash-t new file mode 100644 index 00000000000..ec27d7afbf6 --- /dev/null +++ b/third_party/make/tests/scripts/options/dash-t @@ -0,0 +1,58 @@ +# -*-perl-*- + +$description = "Test the -t option.\n"; + +$details = "Look out for regressions of prior bugs related to -t.\n"; +# That means, nobody has even tried to make the tests below comprehensive + +# TEST 0 +# bug reported by Henning Makholm on 2001-11-03: +# make 3.79.1 touches only interm-[ab] but reports final-[a] as +# 'up to date' without touching them. +# The 'obvious' fix didn't work for double-colon rules, so pay special +# attention to them. + +open(MAKEFILE, "> $makefile"); +print MAKEFILE <<'EOMAKE'; +final-a: interm-a ; echo >> $@ +final-b: interm-b ; echo >> $@ +interm-a:: orig1-a ; echo >> $@ +interm-a:: orig2-a ; echo >> $@ +interm-b:: orig1-b ; echo >> $@ +interm-b:: orig2-b ; echo >> $@ +EOMAKE +close(MAKEFILE); + +&utouch(-30, 'orig1-a','orig2-b'); +&utouch(-20, 'interm-a','interm-b'); +&utouch(-10, 'final-a','final-b'); +&touch('orig2-a','orig1-b'); + +&run_make_with_options($makefile, "-t final-a final-b", &get_logfile); +$answer = "touch interm-a\ntouch final-a\ntouch interm-b\ntouch final-b\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('orig1-a', 'orig2-a', 'interm-a', 'final-a'); +unlink('orig1-b', 'orig2-b', 'interm-b', 'final-b'); + +# TEST 1 +# -t should not touch files with no commands. + +$makefile2 = &get_tmpfile; + +open(MAKEFILE, "> $makefile2"); +print MAKEFILE <<'EOMAKE'; + +PHOOEY: xxx +xxx: ; @: + +EOMAKE +close(MAKEFILE); + +&run_make_with_options($makefile2, "-t", &get_logfile); +$answer = "touch xxx\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('xxx'); + +1; diff --git a/third_party/make/tests/scripts/options/eval b/third_party/make/tests/scripts/options/eval new file mode 100644 index 00000000000..54a3a4f0123 --- /dev/null +++ b/third_party/make/tests/scripts/options/eval @@ -0,0 +1,44 @@ +# -*-perl-*- + +$description = "Test the --eval option."; + +$details = "Verify that --eval options take effect, +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\ninfile\nall"); + +# Make sure that --eval is handled correctly during recursion +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! +all: ; @echo $@ +-include gen.mk +gen.mk: ; @echo > $@ +!, + ['--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; diff --git a/third_party/make/tests/scripts/options/general b/third_party/make/tests/scripts/options/general new file mode 100644 index 00000000000..702fb55bc94 --- /dev/null +++ b/third_party/make/tests/scripts/options/general @@ -0,0 +1,30 @@ +# -*-perl-*- +$description = "Test generic option processing.\n"; + +# TEST 0 + +if (!$parallel_jobs) { + $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... :( + +# On UNIX I can invoke it with 2>/dev/null, then just check the error code. + +if ($port_type ne 'W32') { + run_make_test(undef, "-j1foo 2>/dev/null", '', 512); +} + +1; diff --git a/third_party/make/tests/scripts/options/print-directory b/third_party/make/tests/scripts/options/print-directory new file mode 100644 index 00000000000..db762b2c76a --- /dev/null +++ b/third_party/make/tests/scripts/options/print-directory @@ -0,0 +1,33 @@ +# -*-perl-*- + +$description = "Test the -w option to GNU make."; + +# Simple test without -w +run_make_test(q! +all: ; @echo hi +!, + "", "hi\n"); + +# Simple test with -w +run_make_test(undef, "-w", + "#MAKE#: Entering directory '#PWD#'\nhi\n#MAKE#: Leaving directory '#PWD#'\n"); + +# Test makefile rebuild to ensure no enter/leave +run_make_test(q! +include foo +all: ;@: +foo: ; touch foo +!, + "", "touch foo\n"); +unlink('foo'); + +# Test makefile rebuild with -w +run_make_test(q! +include foo +all: ;@: +foo: ; touch foo +!, + "-w", "#MAKE#: Entering directory '#PWD#'\ntouch foo\n#MAKE#: Leaving directory '#PWD#'\n"); +unlink('foo'); + +1; diff --git a/third_party/make/tests/scripts/options/symlinks b/third_party/make/tests/scripts/options/symlinks new file mode 100644 index 00000000000..bf8a89279d1 --- /dev/null +++ b/third_party/make/tests/scripts/options/symlinks @@ -0,0 +1,69 @@ +# -*-perl-*- + +$description = "Test the -L option."; + +$details = "Verify that symlink handling with and without -L works properly."; + +# Only run these tests if the system sypports symlinks + +# Apparently the Windows port of Perl reports that it does support symlinks +# (in that the symlink() function doesn't fail) but it really doesn't, so +# check for it explicitly. + +if ($port_type eq 'W32' || !( eval { symlink("",""); 1 })) { + # This test is N/A + return -1; +} + +use File::Spec; + +# Set up a symlink sym -> dep +# We'll make both dep and targ older than sym +&utouch(-10, 'dep'); +&utouch(-5, 'targ'); + +$dirnm = (File::Spec->splitdir($cwddir))[-1]; +symlink(File::Spec->catfile(File::Spec->updir(), $dirnm, 'dep'), 'sym'); + +# 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"); + +# 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"); + +# 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."); + +# Add in a new link between sym and dep. Be sure it's newer than targ. +sleep(1); +rename('dep', 'dep1'); +symlink('dep1', 'dep'); + +# 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"); + +rmfiles('targ', 'dep', 'sym', 'dep1'); + +# 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); + +run_make_test('targ: sym ; @echo make $@ from $<', '-L', + 'make targ from sym'); + + +rmfiles('targ', 'sym'); + +1; diff --git a/third_party/make/tests/scripts/options/warn-undefined-variables b/third_party/make/tests/scripts/options/warn-undefined-variables new file mode 100644 index 00000000000..ce15507d1e0 --- /dev/null +++ b/third_party/make/tests/scripts/options/warn-undefined-variables @@ -0,0 +1,25 @@ +# -*-perl-*- + +$description = "Test the --warn-undefined-variables option."; + +$details = "Verify that warnings are printed for referencing undefined variables."; + +# Without --warn-undefined-variables, nothing should happen +run_make_test(' +EMPTY = +EREF = $(EMPTY) +UREF = $(UNDEFINED) + +SEREF := $(EREF) +SUREF := $(UREF) + +all: ; @echo ref $(EREF) $(UREF)', + '', 'ref'); + +# With --warn-undefined-variables, it should warn me +run_make_test(undef, '--warn-undefined-variables', + "#MAKEFILE#:7: warning: undefined variable 'UNDEFINED' +#MAKEFILE#:9: warning: undefined variable 'UNDEFINED' +ref"); + +1; diff --git a/third_party/make/tests/scripts/targets/DEFAULT b/third_party/make/tests/scripts/targets/DEFAULT new file mode 100644 index 00000000000..955c5608a15 --- /dev/null +++ b/third_party/make/tests/scripts/targets/DEFAULT @@ -0,0 +1,35 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to override part\n" + ."of one Makefile with Another Makefile with the .DEFAULT\n" + ."rule."; + +$details = "This tests the use of the .DEFAULT special target to say that \n" + ."to remake any target that cannot be made fram the information\n" + ."in the containing makefile, make should look in another makefile\n" + ."This test gives this makefile the target bar which is not \n" + ."defined here but passes the target bar on to another makefile\n" + ."which does have the target bar defined.\n"; + +create_file('defsub.mk', q! +bar: ; @echo Executing rule BAR +!); + +run_make_test(q! +foo:; @echo Executing rule FOO + +.DEFAULT: ; @$(MAKE) -f defsub.mk $@ +!, + 'bar',"#MAKE#[1]: Entering directory '#PWD#'\n" + . "Executing rule BAR\n" + . "#MAKE#[1]: Leaving directory '#PWD#'\n"); + +unlink('defsub.mk'); + +1; + + + + + + diff --git a/third_party/make/tests/scripts/targets/DELETE_ON_ERROR b/third_party/make/tests/scripts/targets/DELETE_ON_ERROR new file mode 100644 index 00000000000..f0d9f9b4d63 --- /dev/null +++ b/third_party/make/tests/scripts/targets/DELETE_ON_ERROR @@ -0,0 +1,22 @@ +#! -*-perl-*- + +$description = "Test the behaviour of the .DELETE_ON_ERROR target."; + +$details = ""; + +run_make_test(' +.DELETE_ON_ERROR: +all: ; exit 1 > $@ +', + '', "exit 1 > all\n#MAKE#: *** [#MAKEFILE#:3: all] Error 1\n#MAKE#: *** Deleting file 'all'", 512); + +run_make_test(' +.DELETE_ON_ERROR: +all: foo.x ; +%.x : %.q ; echo > $@ +%.q : ; exit 1 > $@ +', + '', "exit 1 > foo.q\n#MAKE#: *** [#MAKEFILE#:5: foo.q] Error 1\n#MAKE#: *** Deleting file 'foo.q'", 512); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/targets/FORCE b/third_party/make/tests/scripts/targets/FORCE new file mode 100644 index 00000000000..297bb38b401 --- /dev/null +++ b/third_party/make/tests/scripts/targets/FORCE @@ -0,0 +1,19 @@ +# -*-perl-*- + +$description = "The following tests rules without Commands or Dependencies."; + +# 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'); + +run_make_test(qq! +.IGNORE : +clean: FORCE ; $CMD_rmfile clean +FORCE: +!, + '', "$CMD_rmfile clean"); + +rmfiles('clean'); + +1; diff --git a/third_party/make/tests/scripts/targets/INTERMEDIATE b/third_party/make/tests/scripts/targets/INTERMEDIATE new file mode 100644 index 00000000000..512498c3093 --- /dev/null +++ b/third_party/make/tests/scripts/targets/INTERMEDIATE @@ -0,0 +1,108 @@ +# -*-perl-*- + +$description = "Test the behaviour of the .INTERMEDIATE target."; + +$details = "\ +Test the behavior of the .INTERMEDIATE special target. +Create a makefile where a file would not normally be considered +intermediate, then specify it as .INTERMEDIATE. Build and ensure it's +deleted properly. Rebuild to ensure that it's not created if it doesn't +exist but doesn't need to be built. Change the original and ensure +that the intermediate file and the ultimate target are both rebuilt, and +that the intermediate file is again deleted. + +Try this with implicit rules and explicit rules: both should work.\n"; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; + +.INTERMEDIATE: foo.e bar.e + +# Implicit rule test +%.d : %.e ; cp $< $@ +%.e : %.f ; cp $< $@ + +foo.d: foo.e + +# Explicit rule test +foo.c: foo.e bar.e; cat $^ > $@ +EOF + +close(MAKEFILE); + +# TEST #0 + +&utouch(-20, 'foo.f', 'bar.f'); + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "cp foo.f foo.e\ncp foo.e foo.d\nrm foo.e\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #1 + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "$make_name: 'foo.d' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #2 + +&utouch(-10, 'foo.d'); +&touch('foo.f'); + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "cp foo.f foo.e\ncp foo.e foo.d\nrm foo.e\n"; +&compare_output($answer, &get_logfile(1)); + +# 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 foo.e bar.e\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #4 + +&run_make_with_options($makefile,'foo.c',&get_logfile); +$answer = "$make_name: 'foo.c' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #5 + +&utouch(-10, 'foo.c'); +&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 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. + +&run_make_with_options($makefile,'foo.e',&get_logfile); +$answer = "cp foo.f foo.e\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('foo.f', 'foo.e', 'foo.d', 'foo.c', 'bar.f', 'bar.e', 'bar.d', 'bar.c'); + +# TEST #7 -- added for PR/1423 + +$makefile2 = &get_tmpfile; + +open(MAKEFILE, "> $makefile2"); + +print MAKEFILE <<'EOF'; +all: foo +foo.a: ; touch $@ +%: %.a ; touch $@ +.INTERMEDIATE: foo.a +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, '-R', &get_logfile); +$answer = "touch foo.a\ntouch foo\nrm foo.a\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('foo'); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/targets/ONESHELL b/third_party/make/tests/scripts/targets/ONESHELL new file mode 100644 index 00000000000..3876966aec5 --- /dev/null +++ b/third_party/make/tests/scripts/targets/ONESHELL @@ -0,0 +1,94 @@ +# -*-perl-*- + +$description = "Test the behaviour of the .ONESHELL target."; + +$details = ""; + +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 + +run_make_test(q! +.ONESHELL: +all: + a=$$$$ + [ 0"$$a" -eq "$$$$" ] || echo fail +!, + '', 'a=$$ +[ 0"$a" -eq "$$" ] || echo fail +'); + +# Simple but use multi-word SHELLFLAGS + +if ($multi_ok) { + run_make_test(q! +.ONESHELL: +.SHELLFLAGS = -e -c +all: + a=$$$$ + [ 0"$$a" -eq "$$$$" ] || echo fail +!, + '', 'a=$$ +[ 0"$a" -eq "$$" ] || echo fail +'); +} + +# Again, but this time with inner prefix chars + +run_make_test(q! +.ONESHELL: +all: + a=$$$$ + @-+ [ 0"$$a" -eq "$$$$" ] || echo fail +!, + '', 'a=$$ +[ 0"$a" -eq "$$" ] || echo fail +'); + +# This time with outer prefix chars + +run_make_test(q! +.ONESHELL: +all: + @a=$$$$ + [ 0"$$a" -eq "$$$$" ] || echo fail +!, + '', ''); + + +# This time with outer and inner prefix chars + +run_make_test(q! +.ONESHELL: +all: + @a=$$$$ + -@ +[ 0"$$a" -eq "$$$$" ] || echo fail +!, + '', ''); + + +# Now try using a different interpreter +# This doesn't work on Windows right now +if ($port_type ne 'W32') { + run_make_test(q! +.RECIPEPREFIX = > +.ONESHELL: +SHELL = #PERL# +.SHELLFLAGS = -e +all: +> @$$a=5 +> +7; +> @y=qw(a b c); +>print "a = $$a, y = (@y)\n"; +!, + '', "a = 12, y = (a b c)\n"); +} + +1; diff --git a/third_party/make/tests/scripts/targets/PHONY b/third_party/make/tests/scripts/targets/PHONY new file mode 100644 index 00000000000..d49e3f83890 --- /dev/null +++ b/third_party/make/tests/scripts/targets/PHONY @@ -0,0 +1,42 @@ +# -*-perl-*- + +$description = "The following tests the use of a PHONY target. It makes\n" + ."sure that the rules under a target get executed even if\n" + ."a filename of the same name of the target exists in the\n" + ."directory.\n"; + +$details = "This makefile in this test declares the target clean to be a \n" + ."PHONY target. We then create a file named \"clean\" in the \n" + ."directory. Although this file exists, the rule under the target\n" + ."clean should still execute because of it's phony status."; + +$example = "EXAMPLE_FILE"; + +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'); + +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 = "$CMD_rmfile $example clean\n"; +&run_make_with_options($makefile,"clean",&get_logfile); + +if (-f $example) { + $test_passed = 0; +} + +&compare_output($answer,&get_logfile(1)); + +# Just in case +unlink($example, 'clean'); + +1; diff --git a/third_party/make/tests/scripts/targets/POSIX b/third_party/make/tests/scripts/targets/POSIX new file mode 100644 index 00000000000..c44cc500111 --- /dev/null +++ b/third_party/make/tests/scripts/targets/POSIX @@ -0,0 +1,55 @@ +# -*-perl-*- + +$description = "Test the behaviour of the .POSIX target."; + +$details = ""; + + +# Ensure turning on .POSIX enables the -e flag for the shell +# We can't assume the exit value of "false" because on different systems it's +# different. + +my $script = 'false; true'; +my $flags = '-ec'; +my $out = `$sh_name $flags '$script' 2>&1`; +my $err = $? >> 8; +run_make_test(qq! +.POSIX: +all: ; \@$script +!, + '', "#MAKE#: *** [#MAKEFILE#:3: all] Error $err\n", 512); + +# User settings must override .POSIX +$flags = '-xc'; +$out = `$sh_name $flags '$script' 2>&1`; +run_make_test(qq! +.SHELLFLAGS = $flags +.POSIX: +all: ; \@$script +!, + '', $out); + +# Test the default value of various POSIX-specific variables +my %POSIX = (AR => 'ar', ARFLAGS => '-rv', + YACC => 'yacc', YFLAGS => '', + LEX => 'lex', LFLAGS => '', + LDFLAGS => '', + 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); +run_make_test(qq! +.POSIX: +all: +$make +!, + '', $r); + +# Make sure that local settings take precedence +%extraENV = map { $_ => "xx-$_" } keys %POSIX; +$r = join('', map { "$_=xx-$_\n"} sort keys %POSIX); +run_make_test(undef, '', $r); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/targets/SECONDARY b/third_party/make/tests/scripts/targets/SECONDARY new file mode 100644 index 00000000000..963c240597a --- /dev/null +++ b/third_party/make/tests/scripts/targets/SECONDARY @@ -0,0 +1,189 @@ +#! -*-perl-*- + +$description = "Test the behaviour of the .SECONDARY target."; + +$details = "\ +Test the behavior of the .SECONDARY special target. +Create a makefile where a file would not normally be considered +intermediate, then specify it as .SECONDARY. Build and note that it's +not automatically deleted. Delete the file. Rebuild to ensure that +it's not created if it doesn't exist but doesn't need to be built. +Change the original and ensure that the secondary file and the ultimate +target are both rebuilt, and that the secondary file is not deleted. + +Try this with implicit rules and explicit rules: both should work.\n"; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; + +.SECONDARY: foo.e + +# Implicit rule test +%.d : %.e ; cp $< $@ +%.e : %.f ; cp $< $@ + +foo.d: foo.e + +# Explicit rule test +foo.c: foo.e ; cp $< $@ +EOF + +close(MAKEFILE); + +# TEST #1 + +&utouch(-20, 'foo.f'); + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "cp foo.f foo.e\ncp foo.e foo.d\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #2 + +unlink('foo.e'); + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "$make_name: 'foo.d' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #3 + +&utouch(-10, 'foo.d'); +&touch('foo.f'); + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "cp foo.f foo.e\ncp foo.e foo.d\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #4 + +&run_make_with_options($makefile,'foo.c',&get_logfile); +$answer = "cp foo.e foo.c\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #5 + +unlink('foo.e'); + +&run_make_with_options($makefile,'foo.c',&get_logfile); +$answer = "$make_name: 'foo.c' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #6 + +&utouch(-10, 'foo.c'); +&touch('foo.f'); + +&run_make_with_options($makefile,'foo.c',&get_logfile); +$answer = "cp foo.f foo.e\ncp foo.e foo.c\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('foo.f', 'foo.e', 'foo.d', 'foo.c'); + +# TEST #7 -- test the "global" .SECONDARY, with no targets. + +$makefile2 = &get_tmpfile; + +open(MAKEFILE, "> $makefile2"); + +print MAKEFILE <<'EOF'; +.SECONDARY: + +final: intermediate +intermediate: source + +final intermediate source: ; echo $< > $@ +EOF + +close(MAKEFILE); + +&utouch(-10, 'source'); +touch('final'); + +&run_make_with_options($makefile2, '', &get_logfile); +$answer = "$make_name: 'final' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('source', 'final', 'intermediate'); + + +# TEST #8 -- test the "global" .SECONDARY, with .PHONY. + +touch('version2'); +run_make_test(' +.PHONY: version +.SECONDARY: +version2: version ; @echo GOOD +all: version2', + 'all', 'GOOD'); + +unlink('version2'); + +# TEST #9 -- Savannah bug #15919 +# The original fix for this bug caused a new bug, shown here. + +touch(qw(1.a 2.a)); + +run_make_test(' +%.c : %.b ; cp $< $@ +%.b : %.a ; cp $< $@ +all : 1.c 2.c +2.a: 1.c', '-rR -j', +'cp 1.a 1.b +cp 1.b 1.c +cp 2.a 2.b +cp 2.b 2.c +rm 2.b 1.b'); + +unlink(qw(1.a 2.a 1.c 2.c)); + +# TEST #10 -- Savannah bug #15919 +touch('test.0'); +run_make_test(' +.SECONDARY : test.1 test.2 test.3 + +test : test.4 + +%.4 : %.int %.3 ; touch $@ + +%.int : %.3 %.2 ; touch $@ + +%.3 : | %.2 ; touch $@ + +%.2 : %.1 ; touch $@ + +%.1 : %.0 ; touch $@', '-rR -j 2', +'touch test.1 +touch test.2 +touch test.3 +touch test.int +touch test.4 +rm test.int'); + +# After a touch of test.0 it should give the same output, except we don't need +# to rebuild test.3 (order-only) +sleep(1); +touch('test.0'); +run_make_test(undef, '-rR -j 2', +'touch test.1 +touch test.2 +touch test.int +touch test.4 +rm test.int'); + +# With both test.0 and test.3 updated it should still build everything except +# test.3 +sleep(1); +touch('test.0', 'test.3'); +run_make_test(undef, '-rR -j 2', +'touch test.1 +touch test.2 +touch test.int +touch test.4 +rm test.int'); + +unlink(qw(test.0 test.1 test.2 test.3 test.4)); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/targets/SILENT b/third_party/make/tests/scripts/targets/SILENT new file mode 100644 index 00000000000..df396a4c56e --- /dev/null +++ b/third_party/make/tests/scripts/targets/SILENT @@ -0,0 +1,33 @@ +# -*-perl-*- + +$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; diff --git a/third_party/make/tests/scripts/targets/clean b/third_party/make/tests/scripts/targets/clean new file mode 100644 index 00000000000..e67458e90f0 --- /dev/null +++ b/third_party/make/tests/scripts/targets/clean @@ -0,0 +1,31 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to delete a \n" + ."file in the directory. It tests to see if make will \n" + ."NOT execute the command unless the rule is given in \n" + ."the make command line."; + +$example = "EXAMPLE_FILE"; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE qq! +all: ; \@echo This makefile did not clean the dir... good +clean: ; $CMD_rmfile $example +!; +close(MAKEFILE); + +touch($example); +run_make_with_options($makefile,"",&get_logfile,0); + +$answer = "This makefile did not clean the dir... good\n"; +compare_output($answer,&get_logfile(1)) || error("abort"); + + +$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"); + +1; diff --git a/third_party/make/tests/scripts/test_template b/third_party/make/tests/scripts/test_template new file mode 100644 index 00000000000..3fd3f953767 --- /dev/null +++ b/third_party/make/tests/scripts/test_template @@ -0,0 +1,29 @@ +# -*-perl-*- + +$description = ""; +$details = ""; + +# Run a make test. See the documentation of run_make_test() in +# run_make_tests.pl, but briefly the first argument is a string with the +# contents of a makefile to be tested, the second is a string containing the +# arguments to be passed to the make invocation, the third is a string +# containing the expected output. The fourth is the expected exit code for +# make. If not specified, it's assumed that the make program should succeed +# (exit with 0). + +run_make_test('Your test makefile goes here', + 'Arguments to pass to make go here', + 'Expected output from the invocation goes here'); + +# There are various special tokens, options, etc. See the full documentation +# in run_make_tests.pl. + + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/third_party/make/tests/scripts/variables/CURDIR b/third_party/make/tests/scripts/variables/CURDIR new file mode 100644 index 00000000000..1be54f1a0a2 --- /dev/null +++ b/third_party/make/tests/scripts/variables/CURDIR @@ -0,0 +1,16 @@ +# -*-perl-*- + +$description = "This tests the CURDIR variable."; + +$details = "Echo CURDIR both with and without -C. Also ensure overrides work."; + + +# TEST #1 +# ------- + +run_make_test(q! +all: ; @echo $(CURDIR) +!, + '', "#PWD#\n"); + +1; diff --git a/third_party/make/tests/scripts/variables/DEFAULT_GOAL b/third_party/make/tests/scripts/variables/DEFAULT_GOAL new file mode 100644 index 00000000000..8188ce71cac --- /dev/null +++ b/third_party/make/tests/scripts/variables/DEFAULT_GOAL @@ -0,0 +1,87 @@ +# -*-perl-*- +$description = "Test the .DEFAULT_GOAL special variable."; + +$details = ""; + + +# Test #1: basic logic. +# +run_make_test(' +# Basics. +# +foo: ; @: + +ifneq ($(.DEFAULT_GOAL),foo) +$(error ) +endif + +# Reset to empty. +# +.DEFAULT_GOAL := + +bar: ; @: + +ifneq ($(.DEFAULT_GOAL),bar) +$(error ) +endif + +# Change to a different goal. +# + +.DEFAULT_GOAL := baz + +baz: ; @echo $@ +', +'', +'baz'); + + +# Test #2: unknown goal. +# +run_make_test(' +.DEFAULT_GOAL = foo +', +'', +"#MAKE#: *** No rule to make target 'foo'. Stop.", +512); + + +# Test #3: more than one goal. +# +run_make_test(' +.DEFAULT_GOAL := foo bar +', +'', +'#MAKE#: *** .DEFAULT_GOAL contains more than one target. Stop.', +512); + + +# Test #4: Savannah bug #12226. +# +run_make_test(' +define rule +foo: ; @echo $$@ +endef + +define make-rule +$(eval $(rule)) +endef + +$(call make-rule) + +', +'', +'foo'); + +# TEST #5: .DEFAULT_GOAL containing just whitespace (Savannah bug #25697) + +run_make_test(' +N = +.DEFAULT_GOAL = $N $N # Just whitespace + +foo: ; @echo "boo" +', + '', "#MAKE#: *** No targets. Stop.\n", 512); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/variables/EXTRA_PREREQS b/third_party/make/tests/scripts/variables/EXTRA_PREREQS new file mode 100644 index 00000000000..57ad597e0b0 --- /dev/null +++ b/third_party/make/tests/scripts/variables/EXTRA_PREREQS @@ -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}/$@/$ $@ +!, + "", "x.mk\nMAKEFLAGS = -Itst/bad\nGNUMAKEFLAGS =\nrecurse\nMAKEFLAGS = -Itst/bad\nGNUMAKEFLAGS =\n#MAKE#[1]: Entering directory '#PWD#'\nall\nMAKEFLAGS = w -Itst/bad\nGNUMAKEFLAGS =\n#MAKE#[1]: Leaving directory '#PWD#'\n"); + +unlink('x.mk'); + +1; diff --git a/third_party/make/tests/scripts/variables/INCLUDE_DIRS b/third_party/make/tests/scripts/variables/INCLUDE_DIRS new file mode 100644 index 00000000000..c9662e94bbf --- /dev/null +++ b/third_party/make/tests/scripts/variables/INCLUDE_DIRS @@ -0,0 +1,46 @@ +# -*-perl-*- +$description = "Test the .INCLUDE_DIRS special variable."; + +$details = ""; + +use Cwd; + +$dir = cwd; +$dir =~ s,.*/([^/]+)$,../$1,; + +# Test #1: The content of .INCLUDE_DIRS depends on the platform for which +# make was built. What we know for sure is that it shouldn't be +# empty. +# +run_make_test(' +ifeq ($(.INCLUDE_DIRS),) +$(warning .INCLUDE_DIRS is empty) +endif + +.PHONY: all +all:;@: +', +'', +''); + + +# Test #2: Make sure -I paths end up in .INCLUDE_DIRS. +# +run_make_test(' +ifeq ($(dir),) +$(warning dir is empty) +endif + +ifeq ($(filter $(dir),$(.INCLUDE_DIRS)),) +$(warning .INCLUDE_DIRS does not contain $(dir)) +endif + +.PHONY: all +all:;@: +', +"-I$dir dir=$dir", +''); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/scripts/variables/LIBPATTERNS b/third_party/make/tests/scripts/variables/LIBPATTERNS new file mode 100644 index 00000000000..918295443d3 --- /dev/null +++ b/third_party/make/tests/scripts/variables/LIBPATTERNS @@ -0,0 +1,38 @@ +# -*-perl-*- + +$description = "Test .LIBPATTERNS special variable."; + +$details = ""; + +# TEST 0: basics + +touch('mtest_foo.a'); + +run_make_test(' +.LIBPATTERNS = mtest_%.a +all: -lfoo ; @echo "build $@ from $<" +', + '', "build all from mtest_foo.a\n"); + +# TEST 1: Handle elements that are not patterns. + +run_make_test(' +.LIBPATTERNS = mtest_foo.a mtest_%.a +all: -lfoo ; @echo "build $@ from $<" +', + '', "#MAKE#: .LIBPATTERNS element 'mtest_foo.a' is not a pattern +build all from mtest_foo.a\n"); + +# TEST 2: target-specific override + +# Uncomment this when we add support, see Savannah bug #25703 +# run_make_test(' +# .LIBPATTERNS = mbad_%.a +# all: .LIBPATTERNS += mtest_%.a +# all: -lfoo ; @echo "build $@ from $<" +# ', +# '', "build all from mtest_foo.a\n"); + +unlink('mtest_foo.a'); + +1; diff --git a/third_party/make/tests/scripts/variables/MAKE b/third_party/make/tests/scripts/variables/MAKE new file mode 100644 index 00000000000..dc621606ed3 --- /dev/null +++ b/third_party/make/tests/scripts/variables/MAKE @@ -0,0 +1,24 @@ +# -*-perl-*- + +$description = "Test proper behavior of the MAKE variable"; + +$details = "DETAILS"; + +run_make_test(q! +TMP := $(MAKE) +MAKE := $(subst X=$(X),,$(MAKE)) +all: + @echo $(TMP) + $(MAKE) -f #MAKEFILE# foo + +foo: + @echo $(MAKE) +!, + '', + "#MAKEPATH#\n#MAKEPATH# -f #MAKEFILE# foo\n" + . "#MAKE#[1]: Entering directory '#PWD#'\n" + . "#MAKEPATH#\n#MAKE#[1]: Leaving directory '#PWD#'\n"); + +rmfiles("foo"); + +1; diff --git a/third_party/make/tests/scripts/variables/MAKECMDGOALS b/third_party/make/tests/scripts/variables/MAKECMDGOALS new file mode 100644 index 00000000000..879283b0567 --- /dev/null +++ b/third_party/make/tests/scripts/variables/MAKECMDGOALS @@ -0,0 +1,52 @@ +# -*-perl-*- + +$description = "Test the MAKECMDGOALS variable."; + +$details = "\ +We construct a makefile with various targets, all of which print out +\$(MAKECMDGOALS), then call it different ways."; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE "\ +.DEFAULT all: + \@echo \$(MAKECMDGOALS) +"; +close(MAKEFILE); + +# TEST #1 + +&run_make_with_options($makefile, + "", + &get_logfile, + 0); +$answer = "\n"; +&compare_output($answer,&get_logfile(1)); + +# TEST #2 + +&run_make_with_options($makefile, + "all", + &get_logfile, + 0); +$answer = "all\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST #3 + +&run_make_with_options($makefile, + "foo bar baz yaz", + &get_logfile, + 0); +$answer = "foo bar baz yaz\nfoo bar baz yaz\nfoo bar baz yaz\nfoo bar baz yaz\n"; +&compare_output($answer,&get_logfile(1)); + + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/third_party/make/tests/scripts/variables/MAKEFILES b/third_party/make/tests/scripts/variables/MAKEFILES new file mode 100644 index 00000000000..564d996025a --- /dev/null +++ b/third_party/make/tests/scripts/variables/MAKEFILES @@ -0,0 +1,47 @@ +# -*-perl-*- + +$description = "Test the MAKEFILES variable."; + +$makefile2 = &get_tmpfile; +$makefile3 = &get_tmpfile; + +open(MAKEFILE,"> $makefile2"); +print MAKEFILE < $makefile3"); +print MAKEFILE < $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE < $@ +bar.x: ; @touch $@ +', + '', 'MAKE_RESTARTS= +MAKE_RESTARTS=1 +MAKE_RESTARTS=2'); + +rmfiles('foo.x', 'bar.x'); + +# Test multiple restarts and make sure the variable is cleaned up + +run_make_test(' +recurse: + @echo recurse MAKE_RESTARTS=$$MAKE_RESTARTS + @$(MAKE) -f #MAKEFILE# all +all: + @echo all MAKE_RESTARTS=$$MAKE_RESTARTS +$(info MAKE_RESTARTS=$(MAKE_RESTARTS)) +include foo.x +foo.x: ; @echo "include bar.x" > $@ +bar.x: ; @touch $@ +', + '', "MAKE_RESTARTS= +MAKE_RESTARTS=1 +MAKE_RESTARTS=2 +recurse MAKE_RESTARTS= +#MAKE#[1]: Entering directory '#PWD#' +MAKE_RESTARTS= +all MAKE_RESTARTS= +#MAKE#[1]: Leaving directory '#PWD#'"); + +rmfiles('foo.x', 'bar.x'); + +1; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/variables/MFILE_LIST b/third_party/make/tests/scripts/variables/MFILE_LIST new file mode 100644 index 00000000000..b75eea7e8fd --- /dev/null +++ b/third_party/make/tests/scripts/variables/MFILE_LIST @@ -0,0 +1,40 @@ +# -*-perl-*- + +$description = "Test the MAKEFILE_LIST variable."; + +create_file('incl2', "m2 := \$(MAKEFILE_LIST)\n"); + +run_make_test(qq! +m1 := \$(MAKEFILE_LIST) +include incl2 +m3 := \$(MAKEFILE_LIST) + +all: +\t\@echo \$(m1) +\t\@echo \$(m2) +\t\@echo \$(m3) +!, + '', "#MAKEFILE#\n#MAKEFILE# incl2\n#MAKEFILE# incl2\n"); + +unlink('incl2'); + +# SV 50823 -- makefiles containing '$' chars + +create_file('foo$bar', "m2 := \$(MAKEFILE_LIST)\n"); + +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; diff --git a/third_party/make/tests/scripts/variables/SHELL b/third_party/make/tests/scripts/variables/SHELL new file mode 100644 index 00000000000..4ff1ac256f4 --- /dev/null +++ b/third_party/make/tests/scripts/variables/SHELL @@ -0,0 +1,112 @@ +# -*-perl-*- + +$description = "Test proper handling of SHELL."; + +# 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. +# Note %extraENV takes precedence over the default value for the shell. + +$extraENV{SHELL} = '/dev/null'; +run_make_test('all:;@echo "$(SHELL)"', '', $mshell); + +# According to POSIX, any value of SHELL set in the makefile should _NOT_ be +# exported to the subshell! I wanted to set SHELL to be $^X (perl) in the +# makefile, but make runs $(SHELL) -c 'commandline' and that doesn't work at +# all when $(SHELL) is perl :-/. So, we just add an extra initial /./ which +# works well on UNIX and seems to work OK on at least some non-UNIX systems. + +$extraENV{SHELL} = $mshell; + +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" +', '', "$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 := $altshell\n".' +all:;@echo "$(SHELL) $$SHELL" +', '', "$altshell $altshell"); + + +# Test out setting of SHELL, both exported and not, as a target-specific +# variable. + +$extraENV{SHELL} = $mshell; + +run_make_test("all: SHELL := $altshell\n".' +all:;@echo "$(SHELL) $$SHELL" +', '', "$altshell $mshell"); + +$extraENV{SHELL} = $mshell; + +run_make_test(" +SHELL := $altshell2 +one: two +two: export SHELL := $altshell\n".' +one two:;@echo "$@: $(SHELL) $$SHELL" +', '', "two: $altshell $altshell\none: $altshell2 $mshell\n"); + +# Test .SHELLFLAGS + +# We don't know the output here: on Solaris for example, every line printed +# by the shell in -x mode has a trailing space (!!) +my $script = 'true; true'; +my $flags = '-xc'; +my $out = `$sh_name $flags '$script' 2>&1`; + +run_make_test(qq! +.SHELLFLAGS = $flags +all: ; \@$script +!, + '', $out); + +# Do it again but add spaces to SHELLFLAGS + +# 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; + +if ($multi_ok) { + $flags = '-x -c'; + run_make_test(qq! +.SHELLFLAGS = $flags +all: ; \@$script +!, + '', $out); +} + +# We can't just use "false" because on different systems it provides a +# different exit code--once again Solaris: false exits with 255 not 1 +$script = 'true; false; true'; +$flags = '-xec'; +$out = `$sh_name $flags '$script' 2>&1`; +my $err = $? >> 8; + +run_make_test(qq! +.SHELLFLAGS = $flags +all: ; \@$script +!, + '', "$out#MAKE#: *** [#MAKEFILE#:3: all] Error $err\n", 512); + +1; diff --git a/third_party/make/tests/scripts/variables/automatic b/third_party/make/tests/scripts/variables/automatic new file mode 100644 index 00000000000..0b2e4513fec --- /dev/null +++ b/third_party/make/tests/scripts/variables/automatic @@ -0,0 +1,122 @@ +# -*-perl-*- + +$description = "Test automatic variable setting."; + +$details = ""; + +use Cwd; + +$dir = cwd; +$dir =~ s,.*/([^/]+)$,../$1,; + +open(MAKEFILE, "> $makefile"); +print MAKEFILE "dir = $dir\n"; +print MAKEFILE <<'EOF'; +.SUFFIXES: +.SUFFIXES: .x .y .z +$(dir)/foo.x : baz.z $(dir)/bar.y baz.z + @echo '$$@ = $@, $$(@D) = $(@D), $$(@F) = $(@F)' + @echo '$$* = $*, $$(*D) = $(*D), $$(*F) = $(*F)' + @echo '$$< = $<, $$( $makefile2"); +print MAKEFILE "dir = $dir\n"; +print MAKEFILE <<'EOF'; +.SECONDEXPANSION: +.SUFFIXES: +.DEFAULT: ; @echo '$@' + +$(dir)/foo $(dir)/bar: $@.x $$@.x $$$@.x $$$$@.x $$(@D).x $$(@F).x + +$(dir)/x.z $(dir)/y.z: $(dir)/%.z : $@.% $$@.% $$$@.% $$$$@.% $$(@D).% $$(@F).% + +$(dir)/biz: $$(@).x $${@}.x $${@D}.x $${@F}.x +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, "$dir/foo $dir/bar", &get_logfile); +$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\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); +$answer = "$dir/biz.x\n$dir.x\nbiz.x\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #2 -- test for Savannah bug #12320. +# +run_make_test(' +.SUFFIXES: .b .src + +mbr.b: mbr.src + @echo $* + +mbr.src: ; @:', + '', + 'mbr'); + +# TEST #3 -- test for Savannah bug #8154 +# Make sure that nonexistent prerequisites are listed in $?, since they are +# considered reasons for the target to be rebuilt. +# +# See also Savannah bugs #16002 and #16051. + +touch('foo'); + +run_make_test(' +foo: bar ; @echo "\$$? = $?" +bar: ;', + '', + '$? = bar'); + +unlink('foo'); + +# TEST #4: ensure prereq ordering is correct when the commmand target has none +# See Savannah bug #21198 + +run_make_test(' +all : A B +all : ; @echo $@ -- $^ -- $< +all : C D +all : E F +A B C D E F G H : ; @: +', + '', "all -- A B C D E F -- A\n"); + +1; diff --git a/third_party/make/tests/scripts/variables/define b/third_party/make/tests/scripts/variables/define new file mode 100644 index 00000000000..7324cbc7825 --- /dev/null +++ b/third_party/make/tests/scripts/variables/define @@ -0,0 +1,282 @@ +# -*-perl-*- + +$description = "Test define/endef variable assignments."; + +$details = ""; + +# TEST 0: old-style basic define/endef + +run_make_test(' +define multi +@echo hi +echo there +endef + +all: ; $(multi) +', + '', "hi\necho there\nthere\n"); + +# TEST 1: Various new-style define/endef + +run_make_test(' +FOO = foo + +define multi = +echo hi +@echo $(FOO) +endef # this is the end + +define simple := +@echo $(FOO) +endef + +define posix ::= +@echo $(FOO) +endef + +append = @echo a + +define append += + +@echo b +endef + +define cond ?= # this is a conditional +@echo first +endef + +define cond ?= +@echo second +endef + +FOO = there + +all: ; $(multi) + $(simple) + $(posix) + $(append) + $(cond) +', + '', "echo hi\nhi\nthere\nfoo\nfoo\na\nb\nfirst\n"); + +# TEST 1a: Various new-style define/endef, with no spaces + +run_make_test(' +FOO = foo + +define multi= +echo hi +@echo $(FOO) +endef # this is the end + +define simple:= +@echo $(FOO) +endef + +define posix::= +@echo $(FOO) +endef + +append = @echo a + +define append+= + +@echo b +endef + +define cond?= # this is a conditional +@echo first +endef + +define cond?= +@echo second +endef + +FOO = there + +all: ; $(multi) + $(simple) + $(posix) + $(append) + $(cond) +', + '', "echo hi\nhi\nthere\nfoo\nfoo\na\nb\nfirst\n"); + +# TEST 2: define in true section of conditional (containing conditional) + +run_make_test(' +FOO = foo +NAME = def +def = +ifdef BOGUS + define $(subst e,e,$(NAME)) = + ifeq (1,1) + FOO = bar + endif + endef +endif + +$(eval $(def)) +all: ; @echo $(FOO) +', + 'BOGUS=1', "bar\n"); + +# TEST 3: define in false section of conditional (containing conditional) + +run_make_test(undef, '', "foo\n"); + +# TEST 4: nested define (supported?) + +run_make_test(' +define outer + define inner + A = B + endef +endef + +$(eval $(outer)) + +outer: ; @echo $(inner) +', + '', "A = B\n"); + +# TEST 5: NEGATIVE: Missing variable name + +run_make_test(' +NAME = +define $(NAME) = +ouch +endef +all: ; @echo ouch +', + '', "#MAKEFILE#:3: *** empty variable name. Stop.\n", 512); + +# TEST 6: NEGATIVE: extra text after define + +run_make_test(' +NAME = +define NAME = $(NAME) +ouch +endef +all: ; @echo ok +', + '', "#MAKEFILE#:3: extraneous text after 'define' directive\nok\n"); + +# TEST 7: NEGATIVE: extra text after endef + +run_make_test(' +NAME = +define NAME = +ouch +endef $(NAME) +all: ; @echo ok +', + '', "#MAKEFILE#:5: extraneous text after 'endef' directive\nok\n"); + +# TEST 8: NEGATIVE: missing endef + +run_make_test(' +NAME = +all: ; @echo ok +define NAME = +ouch +endef$(NAME) +', + '', "#MAKEFILE#:4: *** missing 'endef', unterminated 'define'. Stop.\n", 512); + +# ------------------------- +# Make sure that prefix characters apply properly to define/endef values. +# +# There's a bit of oddness here if you try to use a variable to hold the +# prefix character for a define. Even though something like this: +# +# define foo +# echo bar +# endef +# +# all: ; $(V)$(foo) +# +# (where V=@) can be seen by the user to be obviously different than this: +# +# define foo +# $(V)echo bar +# endef +# +# all: ; $(foo) +# +# and the user thinks it should behave the same as when the "@" is literal +# instead of in a variable, that can't happen because by the time make +# expands the variables for the command line and sees it begins with a "@" it +# can't know anymore whether the prefix character came before the variable +# reference or was included in the first line of the variable reference. + +# TEST #5 +# ------- + +run_make_test(' +define FOO +$(V1)echo hello +$(V2)echo world +endef +all: ; @$(FOO) +', '', 'hello +world'); + +# TEST #6 +# ------- + +run_make_test(undef, 'V1=@ V2=@', 'hello +world'); + +# TEST #7 +# ------- + +run_make_test(' +define FOO +$(V1)echo hello +$(V2)echo world +endef +all: ; $(FOO) +', 'V1=@', 'hello +echo world +world'); + +# TEST #8 +# ------- + +run_make_test(undef, 'V2=@', 'echo hello +hello +world'); + +# TEST #9 +# ------- + +run_make_test(undef, 'V1=@ V2=@', 'hello +world'); + +# TEST #10 +# ------- +# Test the basics; a "@" internally to the variable applies to only one line. +# A "@" before the variable applies to the entire variable. + +run_make_test(' +define FOO +@echo hello +echo world +endef +define BAR +echo hello +echo world +endef + +all: foo bar +foo: ; $(FOO) +bar: ; @$(BAR) +', '', 'hello +echo world +world +hello +world +'); + +1; diff --git a/third_party/make/tests/scripts/variables/flavors b/third_party/make/tests/scripts/variables/flavors new file mode 100644 index 00000000000..831e5d81004 --- /dev/null +++ b/third_party/make/tests/scripts/variables/flavors @@ -0,0 +1,156 @@ +# -*-perl-*- + +$description = "Test various flavors of make variable setting."; + +$details = ""; + +# TEST 0: Recursive + +run_make_test(' +ugh = Goodbye +foo = $(bar) +bar = ${ugh} +ugh = Hello +all: ; @echo $(foo) +', + '', "Hello\n"); + +# TEST 1: Simple + +run_make_test(' +bar = Goodbye +foo := $(bar) +bar = ${ugh} +ugh = Hello +all: ; @echo $(foo) +', + '', "Goodbye\n"); + +# TEST 2: Append to recursive + +run_make_test(' +foo = Hello +ugh = Goodbye +foo += $(bar) +bar = ${ugh} +ugh = Hello +all: ; @echo $(foo) +', + '', "Hello Hello\n"); + +# TEST 3: Append to simple + +run_make_test(' +foo := Hello +ugh = Goodbye +bar = ${ugh} +foo += $(bar) +ugh = Hello +all: ; @echo $(foo) +', + '', "Hello Goodbye\n"); + +# TEST 4: Conditional pre-set + +run_make_test(' +foo = Hello +ugh = Goodbye +bar = ${ugh} +foo ?= $(bar) +ugh = Hello +all: ; @echo $(foo) +', + '', "Hello\n"); + +# TEST 5: Conditional unset + +run_make_test(' +ugh = Goodbye +bar = ${ugh} +foo ?= $(bar) +ugh = Hello +all: ; @echo $(foo) +', + '', "Hello\n"); + +# TEST 6: Simple using POSIX syntax +run_make_test(' +bar = Goodbye +foo ::= $(bar) +bar = ${ugh} +ugh = Hello +all: ; @echo $(foo) +', + '', "Goodbye\n"); + +# TEST 7: POSIX syntax no spaces +run_make_test(' +bar = Goodbye +foo::=$(bar) +bar = ${ugh} +ugh = Hello +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; diff --git a/third_party/make/tests/scripts/variables/negative b/third_party/make/tests/scripts/variables/negative new file mode 100644 index 00000000000..0f9abc82225 --- /dev/null +++ b/third_party/make/tests/scripts/variables/negative @@ -0,0 +1,46 @@ +# -*-perl-*- + +$description = "Run some negative tests (things that should fail)."; + +# TEST #0 +# Check that non-terminated variable references are detected (and +# reported using the best filename/lineno info +run_make_test(' +foo = bar +x = $(foo +y = $x + +all: ; @echo $y +', + '', '#MAKEFILE#:3: *** unterminated variable reference. Stop.', + 512); + +# TEST #1 +# Bogus variable value passed on the command line. +run_make_test(undef, + ['x=$(other'], + '#MAKEFILE#:4: *** unterminated variable reference. Stop.', + 512); + +# TEST #2 +# Again, but this time while reading the makefile. +run_make_test(' +foo = bar +x = $(foo +y = $x + +z := $y + +all: ; @echo $y +', + '', '#MAKEFILE#:3: *** unterminated variable reference. Stop.', + 512); + +# TEST #3 +# Bogus variable value passed on the command line. +run_make_test(undef, + ['x=$(other'], + '#MAKEFILE#:4: *** unterminated variable reference. Stop.', + 512); + +1; diff --git a/third_party/make/tests/scripts/variables/private b/third_party/make/tests/scripts/variables/private new file mode 100644 index 00000000000..8967ffb55f5 --- /dev/null +++ b/third_party/make/tests/scripts/variables/private @@ -0,0 +1,122 @@ +# -*-perl-*- + +$description = "Test 'private' variables."; + +$details = ""; + +# 1: Simple verification that private variables are not inherited +&run_make_test(' +a: +F = g +a: F = a +b: private F = b + +a b c: ; @echo $@: F=$(F) +a: b +b: c +', + '', "c: F=a\nb: F=b\na: F=a\n"); + +# 2: Again, but this time we start with "b" so "a"'s variable is not in scope +&run_make_test(undef, 'b', "c: F=g\nb: F=b\n"); + +# 3: Verification with pattern-specific variables +&run_make_test(' +t.a: + +F1 = g +F2 = g +%.a: private F1 = a +%.a: F2 = a + +t.a t.b: ; @echo $@: F1=$(F1) / F2=$(F2) +t.a: t.b +', + '', "t.b: F1=g / F2=a\nt.a: F1=a / F2=a\n"); + +# 4: Test private global variables +&run_make_test(' +a: +private F = g +G := $(F) +a: +b: F = b + +a b: ; @echo $@: F=$(F) / G=$(G) +a: b +', + '', "b: F=b / G=g\na: F= / G=g\n"); + +# 5: Multiple conditions on the same variable. Test export. +delete $ENV{'_X'}; +&run_make_test(' +_X = x +a: export override private _X = a +a: ; @echo _X=$(_X) / _X=$$_X +', + '', "_X=a / _X=a"); + +# 6: Test override. +&run_make_test(undef, '_X=c', "_X=a / _X=a\n"); + +# 7: Ensure keywords still work as targets +&run_make_test(' +a: export override private foo bar +foo bar export override private: ; @echo $@ +', + '', "export\noverride\nprivate\nfoo\nbar\n"); + +# 8: Ensure keywords still work as variables +&run_make_test(' +private = g +a: private = a +a: b +a b: ; @echo $@=$(private) +', + '', "b=a\na=a\n"); + +# 9: make sure private suppresses inheritance +run_make_test(q! +DEFS = FOO +all: bar1 +bar1: private DEFS += 1 +bar3: private DEFS += 3 +bar1: bar2 +bar2: bar3 +bar1 bar2 bar3: ; @echo '$@: $(DEFS)' +!, + '', "bar3: FOO 3\nbar2: FOO\nbar1: FOO 1\n"); + +# 10: Test append with pattern-specific variables and private + +run_make_test(q! +IA = global +PA = global +PS = global +S = global +PS = global +SV = global +b%: IA += b% +b%: private PA += b% +b%: private PS = b% +bar: all +bar: IA += bar +bar: private PA += bar +bar: private PS = bar +a%: IA += a% +a%: private PA += a% +a%: private PS = a% +all: IA += all +all: private PA += all +all: private PS = all + +bar all: ; @echo '$@: IA=$(IA)'; echo '$@: PA=$(PA)'; echo '$@: PS=$(PS)' +!, + '', "all: IA=global b% bar a% all +all: PA=global a% all +all: PS=all +bar: IA=global b% bar +bar: PA=global b% bar +bar: PS=bar\n"); + +1; diff --git a/third_party/make/tests/scripts/variables/special b/third_party/make/tests/scripts/variables/special new file mode 100644 index 00000000000..68f3128cf7b --- /dev/null +++ b/third_party/make/tests/scripts/variables/special @@ -0,0 +1,149 @@ +# -*-perl-*- + +$description = "Test special GNU make variables."; + +$details = ""; + +&run_make_test(' + +X1 := $(sort $(filter FOO BAR,$(.VARIABLES))) + +FOO := foo + +X2 := $(sort $(filter FOO BAR,$(.VARIABLES))) + +BAR := bar + +all: ; @echo X1 = $(X1); echo X2 = $(X2); echo LAST = $(sort $(filter FOO BAR,$(.VARIABLES))) +', + '', "X1 =\nX2 = FOO\nLAST = BAR FOO\n"); + +# SV 45728: Test that undefining a variable is reflected properly + +&run_make_test(' +FOO := foo +BAR := bar +$(info one: $(sort $(filter FOO BAR BAZ,$(.VARIABLES)))) +undefine BAR +BAZ := baz +$(info two: $(sort $(filter FOO BAR BAZ,$(.VARIABLES)))) +all:;@: +', + '', "one: BAR FOO\ntwo: BAZ FOO\n"); + +# $makefile2 = &get_tmpfile; +# open(MAKEFILE, "> $makefile2"); + +# print MAKEFILE <<'EOF'; + +# X1 := $(sort $(.TARGETS)) + +# all: foo +# @echo X1 = $(X1) +# @echo X2 = $(X2) +# @echo LAST = $(sort $(.TARGETS)) + +# X2 := $(sort $(.TARGETS)) + +# foo: + +# EOF + +# close(MAKEFILE); + +# # TEST #2 +# # ------- + +# &run_make_with_options($makefile2, "", &get_logfile); +# $answer = "X1 =\nX2 = all\nLAST = all foo\n"; +# &compare_output($answer, &get_logfile(1)); + +# Test the .RECIPEPREFIX variable +&run_make_test(' +define foo +: foo-one\ +foo-two +: foo-three + : foo-four +endef + +orig: ; : orig-one + : orig-two \ +orig-three \ + orig-four \ + orig-five \\\\ + : orig-six + $(foo) + +.RECIPEPREFIX = > +test: ; : test-one +>: test-two \ +test-three \ +>test-four \ +> test-five \\\\ +>: test-six +>$(foo) + +.RECIPEPREFIX = +reset: ; : reset-one + : reset-two \ +reset-three \ + reset-four \ + reset-five \\\\ + : reset-six + $(foo) +', + 'orig test reset', + ': orig-one +: orig-two \ +orig-three \ +orig-four \ + orig-five \\\\ +: orig-six +: foo-one foo-two +: foo-three +: foo-four +: test-one +: test-two \ +test-three \ +test-four \ + test-five \\\\ +: test-six +: foo-one foo-two +: foo-three +: foo-four +: reset-one +: reset-two \ +reset-three \ +reset-four \ + reset-five \\\\ +: reset-six +: foo-one foo-two +: foo-three +: foo-four'); + +# Test that the "did you mean TAB" message is printed properly + +run_make_test(q! +$x. +!, + '', '#MAKEFILE#:2: *** missing separator. Stop.', 512); + +run_make_test(q! +foo: + bar +!, + '', '#MAKEFILE#:3: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.', 512); + +run_make_test(q! +.RECIPEPREFIX = : +foo: + bar +!, + '', '#MAKEFILE#:4: *** missing separator. Stop.', 512); + +1; + +### Local Variables: +### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) +### End: diff --git a/third_party/make/tests/scripts/variables/undefine b/third_party/make/tests/scripts/variables/undefine new file mode 100644 index 00000000000..38707b837f2 --- /dev/null +++ b/third_party/make/tests/scripts/variables/undefine @@ -0,0 +1,73 @@ +# -*-perl-*- + +$description = "Test variable undefine."; + +$details = ""; + +# TEST 0: basic undefine functionality + +run_make_test(' +a = a +b := b +define c +c +endef + +$(info $(flavor a) $(flavor b) $(flavor c)) + +n := b + +undefine a +undefine $n +undefine c + +$(info $(flavor a) $(flavor b) $(flavor c)) + + +all: ;@: +', +'', "recursive simple recursive\nundefined undefined undefined"); + + +# TEST 1: override + +run_make_test(' +undefine a +override undefine b + +$(info $(flavor a) $(flavor b)) + + +all: ;@: +', +'a=a b=b', "recursive undefined"); + +1; + +# TEST 2: undefine in eval (make sure we undefine from the global var set) + +run_make_test(' +define undef +$(eval undefine $$1) +endef + +a := a +$(call undef,a) +$(info $(flavor a)) + + +all: ;@: +', +'', "undefined"); + + +# TEST 3: Missing variable name + +run_make_test(' +a = +undefine $a +all: ;@echo ouch +', +'', "#MAKEFILE#:3: *** empty variable name. Stop.\n", 512); + +1; diff --git a/third_party/make/tests/scripts/vms/library b/third_party/make/tests/scripts/vms/library new file mode 100644 index 00000000000..8375dfa6283 --- /dev/null +++ b/third_party/make/tests/scripts/vms/library @@ -0,0 +1,73 @@ +# -*-mode: perl-*- + +$description = "Test GNU make's VMS Library management features."; + +$details = "\ +This only works on VMS systems."; + +return -1 if $osname ne 'VMS'; + +# Help library +$mk_string = "help : help.hlb(file1.hlp)\n\n" . +"file1.hlp :\n" . +"\t\@pipe open/write xxx file1.hlp ; write xxx \"1 help\" ; close xxx\n"; + +my $answer = "library /replace help.hlb file1.hlp"; + +run_make_test($mk_string, + '', $answer); + +unlink('help.hlb'); +unlink('file1.hlp'); + +#Text library +$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"; + +$answer = "library /replace text.tlb file1.txt"; + +run_make_test($mk_string, + '', $answer); + +unlink('text.tlb'); +unlink('file1.txt'); + + +#Macro library +$mk_string = "macro : macro.mlb(file1.mar)\n\n" . +"file1.mar :\n" . +"\tpipe open/write xxx file1.mar ; " . +"write xxx \".macro a b\" ; write xxx \".endm\" ; close xxx\n"; + +$answer = "library /replace macro.mlb file1.mar"; + +run_make_test($mk_string, + '', $answer); + +unlink('macro.mlb'); +unlink('file1.mar'); + +$mk_string = +"all:imagelib.olb(file2.exe)\n" . +"file2.exe : file2.obj file2.opt\n" . +"\t\@link /share=\$\@ \$\*,\$\*/opt\n\n" . +"file2.opt :\n" . +"\t\@pipe open/write xxx file2.opt ; " . +"write xxx \"CASE_SENSITIVE=YES\" ; close xxx\n" . +"file2.c :\n" . +"\t\@pipe open/write xxx file2.c ; write xxx \"file2(){}\" ; close xxx\n"; + +$answer = "library /replace imagelib.olb file2.exe"; + +run_make_test($mk_string, + '', $answer); + +unlink('imagelib.olb'); +unlink('file2.c'); +unlink('file2.obj'); +unlink('file2.exe'); +unlink('file2.opt'); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/third_party/make/tests/test_driver.pl b/third_party/make/tests/test_driver.pl new file mode 100644 index 00000000000..f18e7854c40 --- /dev/null +++ b/third_party/make/tests/test_driver.pl @@ -0,0 +1,1459 @@ +#!/usr/bin/perl +# -*-perl-*- +# +# Modification history: +# 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-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 . + + +# Test driver routines used by a number of test suites, including +# those for SCS, make, roll_dir, and scan_deps (?). +# +# this routine controls the whole mess; each test suite sets up a few +# variables and then calls &toplevel, which does all the real work. + +# $Id$ + +use Config; +use Cwd; +use File::Spec; + +# The number of test categories we've run +$categories_run = 0; +# The number of test categroies that have passed +$categories_passed = 0; +# The total number of individual tests that have been run +$total_tests_run = 0; +# The total number of individual tests that have passed +$total_tests_passed = 0; +# The number of tests in this category that have been run +$tests_run = 0; +# The number of tests in this category that have passed +$tests_passed = 0; + + +# Yeesh. This whole test environment is such a hack! +$test_passed = 1; + +# Timeout in seconds. If the test takes longer than this we'll fail it. +$test_timeout = 5; +$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 = (); + +# %extraENV are any extra environment variables the tests might want to set. +# These are RESET AFTER EVERY TEST! +%extraENV = (); + +sub vms_get_process_logicals { + # Sorry for the long note here, but to keep this test running on + # VMS, it is needed to be understood. + # + # Perl on VMS by default maps the %ENV array to the system wide logical + # name table. + # + # This is a very large dynamically changing table. + # On Linux, this would be the equivalent of a table that contained + # every mount point, temporary pipe, and symbolic link on every + # file system. You normally do not have permission to clear or replace it, + # and if you did, the results would be catastrophic. + # + # On VMS, added/changed %ENV items show up in the process logical + # name table. So to track changes, a copy of it needs to be captured. + + my $raw_output = `show log/process/access_mode=supervisor`; + my @raw_output_lines = split('\n',$raw_output); + my %log_hash; + foreach my $line (@raw_output_lines) { + if ($line =~ /^\s+"([A-Za-z\$_]+)"\s+=\s+"(.+)"$/) { + $log_hash{$1} = $2; + } + } + return \%log_hash +} + +# %origENV is the caller's original environment +if ($^O ne 'VMS') { + %origENV = %ENV; +} else { + my $proc_env = vms_get_process_logicals; + %origENV = %{$proc_env}; +} + +sub resetENV +{ + # We used to say "%ENV = ();" but this doesn't work in Perl 5.000 + # through Perl 5.004. It was fixed in Perl 5.004_01, but we don't + # want to require that here, so just delete each one individually. + + if ($^O ne 'VMS') { + foreach $v (keys %ENV) { + delete $ENV{$v}; + } + + %ENV = %makeENV; + } else { + my $proc_env = vms_get_process_logicals(); + my %delta = %{$proc_env}; + foreach my $v (keys %delta) { + if (exists $origENV{$v}) { + if ($origENV{$v} ne $delta{$v}) { + $ENV{$v} = $origENV{$v}; + } + } else { + delete $ENV{$v}; + } + } + } + + foreach $v (keys %extraENV) { + $ENV{$v} = $extraENV{$v}; + delete $extraENV{$v}; + } +} + +sub toplevel +{ + # Pull in benign variables from the user's environment + + 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 + 'Path', 'SystemRoot', + # DJGPP-specific stuff + 'DJDIR', 'DJGPP', 'SHELL', 'COMSPEC', 'HOSTNAME', 'LFN', + 'FNCASE', '387', 'EMU387', 'GROUP' + ) { + $makeENV{$_} = $ENV{$_} if $ENV{$_}; + } + + # Make sure our compares are not foiled by locale differences + + $makeENV{LC_ALL} = 'C'; + + # Replace the environment with the new one + # + %origENV = %ENV unless $^O eq 'VMS'; + + resetENV(); + + $| = 1; # unbuffered output + + $debug = 0; # debug flag + $profile = 0; # profiling flag + $verbose = 0; # verbose mode flag + $detail = 0; # detailed verbosity + $keep = 0; # keep temp files around + $workdir = "work"; # The directory where the test will start running + $scriptdir = "scripts"; # The directory where we find the test scripts + $tmpfilesuffix = "t"; # the suffix used on tmpfiles + $default_output_stack_level = 0; # used by attach_default_output, etc. + $default_input_stack_level = 0; # used by attach_default_input, etc. + $cwd = "."; # don't we wish we knew + $cwdslash = ""; # $cwd . $pathsep, but "" rather than "./" + + &get_osname; # sets $osname, $vos, $pathsep, and $short_filenames + + &set_defaults; # suite-defined + + &parse_command_line (@ARGV); + + print "OS name = '$osname'\n" if $debug; + + $workpath = "$cwdslash$workdir"; + $scriptpath = "$cwdslash$scriptdir"; + + &set_more_defaults; # suite-defined + + &print_banner; + + 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('/', $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 (-d $workpath) { + print "Clearing $workpath...\n"; + &remove_directory_tree("$workpath/") + or &error ("Couldn't wipe out $workpath: $!\n"); + } else { + mkdir ($workpath, 0777) or &error ("Couldn't mkdir $workpath: $!\n"); + } + + if (!-d $scriptpath) { + &error ("Failed to find $scriptpath containing perl test scripts.\n"); + } + + if (@TESTS) { + print "Making work dirs...\n"; + foreach $test (@TESTS) { + if ($test =~ /^([^\/]+)\//) { + $dir = $1; + push (@rmdirs, $dir); + -d "$workpath/$dir" + or mkdir ("$workpath/$dir", 0777) + or &error ("Couldn't mkdir $workpath/$dir: $!\n"); + } + } + } else { + print "Finding tests...\n"; + opendir (SCRIPTDIR, $scriptpath) + or &error ("Couldn't opendir $scriptpath: $!\n"); + @dirs = grep (!/^(\..*|CVS|RCS)$/, readdir (SCRIPTDIR) ); + closedir (SCRIPTDIR); + 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) + or &error ("Couldn't mkdir $workpath/$dir: $!\n"); + opendir (SCRIPTDIR, "$scriptpath/$dir") + or &error ("Couldn't opendir $scriptpath/$dir: $!\n"); + @files = grep (!/^(\..*|CVS|RCS|.*~)$/, readdir (SCRIPTDIR) ); + closedir (SCRIPTDIR); + foreach my $test (@files) { + -d $test and next; + push (@TESTS, "$dir/$test"); + } + } + } + + if (@TESTS == 0) { + &error ("\nNo tests in $scriptpath, and none were specified.\n"); + } + + print "\n"; + + run_all_tests(); + + foreach my $dir (@rmdirs) { + rmdir ("$workpath/$dir"); + } + + $| = 1; + + $categories_failed = $categories_run - $categories_passed; + $total_tests_failed = $total_tests_run - $total_tests_passed; + + if ($total_tests_failed) { + print "\n$total_tests_failed Test"; + print "s" unless $total_tests_failed == 1; + print " in $categories_failed Categor"; + print ($categories_failed == 1 ? "y" : "ies"); + print " Failed (See .$diffext* files in $workdir dir for details) :-(\n\n"; + return 0; + } + + 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 +{ + # 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; + $pathsep = "/"; + return; + } + + # Find a path to Perl + + # See if the filesystem supports long file names with multiple + # dots. DOS doesn't. + $short_filenames = 0; + (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 + # better way of doing this. (We used to test for existence of a /mnt + # dir, but that apparently fails on an SGI Indigo (whatever that is).) + # 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) 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") { + $osname = "vos"; + $vos = 1; + $pathsep = ">"; + + } 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)"; + } + } + $vos = 0; + $pathsep = "/"; + } + + if (! $short_filenames) { + chdir ("..") or &error ("Couldn't chdir to ..: $!\n", 1); + unlink (".ostest>ick"); + rmdir (".ostest") or &error ("Couldn't rmdir .ostest: $!\n", 1); + } +} + +sub parse_command_line +{ + @argv = @_; + + # use @ARGV if no args were passed in + + 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) { + $option = shift @argv; + if ($option =~ /^-usage$/i) { + &print_usage; + exit 0; + } + if ($option =~ /^-(h|help)$/i) { + &print_help; + exit 0; + } + + if ($option =~ /^-debug$/i) { + print "\nDEBUG ON\n"; + $debug = 1; + + } elsif ($option =~ /^-profile$/i) { + $profile = 1; + + } elsif ($option =~ /^-verbose$/i) { + $verbose = 1; + + } elsif ($option =~ /^-detail$/i) { + $detail = 1; + $verbose = 1; + + } elsif ($option =~ /^-keep$/i) { + $keep = 1; + + } elsif (&valid_option($option)) { + # The suite-defined subroutine takes care of the option + + } elsif ($option =~ /^-/) { + print "Invalid option: $option\n"; + &print_usage; + exit 0; + + } else { # must be the name of a test + $option =~ s/\.pl$//; + push(@TESTS,$option); + } + } +} + +sub max +{ + my $num = shift @_; + my $newnum; + + while (@_) { + $newnum = shift @_; + if ($newnum > $num) { + $num = $newnum; + } + } + + return $num; +} + +sub print_centered +{ + my ($width, $string) = @_; + + if (length ($string)) { + my $pad = " " x ( ($width - length ($string) + 1) / 2); + print "$pad$string"; + } +} + +sub print_banner +{ + # $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); + &print_centered ($len, $line); + print "\n"; +} + +sub run_all_tests +{ + # 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"; + + -f $perl_testname or die "Invalid test: $testname\n\n"; + + setup_for_test(); + + $output = "........................................................ "; + + substr($output,0,length($testname)) = "$testname "; + + print $output; + + $tests_run = 0; + $tests_passed = 0; + + # Run the test! + $code = do $perl_testname; + + ++$categories_run; + $total_tests_run += $tests_run; + $total_tests_passed += $tests_passed; + + # 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 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 ($verbose) { + if ($detail) { + print "\nWHAT IS BEING TESTED\n"; + print "--------------------"; + } + print "\n\n$description\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. + + 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 +# are sent to it. + +sub rmfiles +{ + my (@files) = @_; + + if (!$keep) { + return (unlink @files); + } + + return 1; +} + +sub print_standard_usage +{ + my ($plname, @moreusage) = @_; + + print "usage:\t$plname [testname] [-verbose] [-detail] [-keep]\n"; + print "\t\t\t[-profile] [-usage] [-help] [-debug]\n"; + foreach (@moreusage) { + print "\t\t\t$_\n"; + } +} + +sub print_standard_help +{ + my (@morehelp) = @_; + my $t = " "; + + my $line = "Test Driver For $testee"; + print "$line\n"; + $line = "=" x length ($line); + print "$line\n"; + + print_usage(); + + print "\ntestname\n" + . "${t}You may, if you wish, run only ONE test if you know the name\n" + . "${t}of that test and specify this name anywhere on the command\n" + . "${t}line. Otherwise ALL existing tests in the scripts directory\n" + . "${t}will be run.\n" + . "-verbose\n" + . "${t}If this option is given, a description of every test is\n" + . "${t}displayed before the test is run. (Not all tests may have\n" + . "${t}descriptions at this time)\n" + . "-detail\n" + . "${t}If this option is given, a detailed description of every\n" + . "${t}test is displayed before the test is run. (Not all tests\n" + . "${t}have descriptions at this time)\n" + . "-profile\n" + . "${t}If this option is given, then the profile file\n" + . "${t}is added to other profiles every time $testee is run.\n" + . "${t}This option only works on VOS at this time.\n" + . "-keep\n" + . "${t}You may give this option if you DO NOT want ANY\n" + . "${t}of the files generated by the tests to be deleted. \n" + . "${t}Without this option, all files generated by the test will\n" + . "${t}be deleted IF THE TEST PASSES.\n" + . "-debug\n" + . "${t}Use this option if you would like to see all of the system\n" + . "${t}calls issued and their return status while running the tests\n" + . "${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) { + my $tline = $line; + if (substr ($tline, 0, 1) eq "\t") { + substr ($tline, 0, 1) = $t; + } + print "$tline\n"; + } +} + +####################################################################### +########### Generic Test Driver Subroutines ########### +####################################################################### + +sub get_caller +{ + my $depth = defined ($_[0]) ? $_[0] : 1; + my ($pkg, $filename, $linenum) = caller ($depth + 1); + return "$filename: $linenum"; +} + +sub error +{ + my $message = $_[0]; + my $caller = &get_caller (1); + + if (defined ($_[1])) { + $caller = &get_caller ($_[1] + 1) . " -> $caller"; + } + + die "$caller: $message"; +} + +sub compare_output +{ + my ($answer,$logfile) = @_; + my ($slurp, $answer_matched) = ('', 0); + + ++$tests_run; + + if (! defined $answer) { + print "Ignoring output ........ " if $debug; + $answer_matched = 1; + } else { + print "Comparing output ........ " if $debug; + + $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; + + 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; + + $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); + } + + # 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 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 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; + + } + 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); + } + + # 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); + } + } + } + + # 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) { + print "ok\n" if $debug; + ++$tests_passed; + return 1; + } + + if (! $answer_matched) { + print "DIFFERENT OUTPUT\n" if $debug; + + &create_file (&get_basefile, $answer); + &create_file (&get_runfile, $command_string); + + print "\nCreating Difference File ...\n" if $debug; + + # Create the difference file + + my $command = "diff -c " . &get_basefile . " " . $logfile; + &run_command_with_output(&get_difffile,$command); + } + + return 0; +} + +sub read_file_into_string +{ + my ($filename) = @_; + my $oldslash = $/; + undef $/; + + open (RFISFILE, '<', $filename) or return ""; + my $slurp = ; + close (RFISFILE); + + $/ = $oldslash; + + return $slurp; +} + +my @OUTSTACK = (); +my @ERRSTACK = (); + +sub attach_default_output +{ + my ($filename) = @_; + + if ($vos) + { + my $code = system "++attach_default_output_hack $filename"; + $code == -2 or &error ("adoh death\n", 1); + return 1; + } + + my $dup = undef; + open($dup, '>&', STDOUT) or error("ado: $! duping STDOUT\n", 1); + push @OUTSTACK, $dup; + + $dup = undef; + open($dup, '>&', STDERR) or error("ado: $! duping STDERR\n", 1); + push @ERRSTACK, $dup; + + open(STDOUT, '>', $filename) or error("ado: $filename: $!\n", 1); + open(STDERR, ">&STDOUT") or error("ado: $filename: $!\n", 1); +} + +# close the current stdout/stderr, and restore the previous ones from +# the "stack." + +sub detach_default_output +{ + if ($vos) + { + my $code = system "++detach_default_output_hack"; + $code == -2 or &error ("ddoh death\n", 1); + return 1; + } + + @OUTSTACK or error("default output stack has flown under!\n", 1); + + close(STDOUT); + close(STDERR) unless $^O eq 'VMS'; + + + open (STDOUT, '>&', pop @OUTSTACK) or error("ddo: $! duping STDOUT\n", 1); + open (STDERR, '>&', pop @ERRSTACK) or error("ddo: $! duping STDERR\n", 1); +} + +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(); + + my $orig = $SIG{ALRM}; + my $code = eval { _run_with_timeout(@_); }; + $SIG{ALRM} = $orig; + + if ($@) { + # The eval failed. If it wasn't SIGALRM then die. + $@ eq "timeout\n" or die "Command failed: $@"; + $code = 14; + } + + return $code; +} + +# run one command (passed as a list of arg 0 - n), returning 0 on success +# and nonzero on failure. + +sub run_command +{ + print "\nrun_command: @_\n" if $debug; + my $code = _run_command(@_); + print "run_command returned $code.\n" if $debug; + print "vms status = ${^CHILD_ERROR_NATIVE}\n" if $debug and $^O eq 'VMS'; + return $code; +} + +# run one command (passed as a list of arg 0 - n, with arg 0 being the +# second arg to this routine), returning 0 on success and non-zero on failure. +# The first arg to this routine is a filename to connect to the stdout +# & stderr of the child process. + +sub run_command_with_output +{ + my $filename = shift; + + print "\nrun_command_with_output($filename,$runname): @_\n" if $debug; + &attach_default_output ($filename); + my $code = eval { _run_command(@_) }; + my $err = $@; + &detach_default_output; + + $err and die $err; + + print "run_command_with_output returned $code.\n" if $debug; + print "vms status = ${^CHILD_ERROR_NATIVE}\n" if $debug and $^O eq 'VMS'; + return $code; +} + +# performs the equivalent of an "rm -rf" on the first argument. Like +# rm, if the path ends in /, leaves the (now empty) directory; otherwise +# deletes it, too. + +sub remove_directory_tree +{ + my ($targetdir) = @_; + my ($nuketop) = 1; + + my $ch = substr ($targetdir, length ($targetdir) - 1); + if ($ch eq "/" || $ch eq $pathsep) { + $targetdir = substr ($targetdir, 0, length ($targetdir) - 1); + $nuketop = 0; + } + + -e $targetdir or return 1; + + &remove_directory_tree_inner ("RDT00", $targetdir) or return 0; + if ($nuketop && !rmdir ($targetdir)) { + print "Cannot remove $targetdir: $!\n"; + return 0; + } + + return 1; +} + +sub remove_directory_tree_inner +{ + my ($dirhandle, $targetdir) = @_; + + opendir ($dirhandle, $targetdir) or return 0; + my $subdirhandle = $dirhandle; + $subdirhandle++; + while (my $object = readdir ($dirhandle)) { + $object =~ /^(\.\.?|CVS|RCS)$/ and next; + $object = "$targetdir$pathsep$object"; + + lstat ($object); + if (-d _ && &remove_directory_tree_inner ($subdirhandle, $object)) { + if (!rmdir($object)) { + print "Cannot remove $object: $!\n"; + return 0; + } + } 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; + } + } + } + closedir ($dirhandle); + return 1; +} + +# We used to use this behavior for this function: +# +#sub touch +#{ +# my (@filenames) = @_; +# my $now = time; +# +# foreach my $file (@filenames) { +# utime ($now, $now, $file) +# or (open (TOUCHFD, ">> $file") and close (TOUCHFD)) +# or &error ("Couldn't touch $file: $!\n", 1); +# } +# return 1; +#} +# +# But this behaves badly on networked filesystems where the time is +# skewed, because it sets the time of the file based on the _local_ +# host. Normally when you modify a file, it's the _remote_ host that +# determines the modtime, based on _its_ clock. So, instead, now we open +# the file and write something into it to force the remote host to set +# the modtime correctly according to its clock. +# + +sub touch +{ + 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 +# access/mod time for each file and apply the offset. + +sub utouch +{ + my $off = shift; + + &touch(@_); + + foreach my $f (@_) { + my @s = stat($f); + utime($s[8]+$off, $s[9]+$off, $f); + } + + return @_; +} + +# open a file, write some stuff to it, and close it. + +sub create_file +{ + my ($filename, @lines) = @_; + + open (CF, "> $filename") or &error ("Couldn't open $filename: $!\n", 1); + foreach $line (@lines) { + print CF $line; + } + close (CF); +} + +# create a directory tree described by an associative array, wherein each +# key is a relative pathname (using slashes) and its associated value is +# one of: +# DIR indicates a directory +# FILE:contents indicates a file, which should contain contents +\n +# LINK:target indicates a symlink, pointing to $basedir/target +# The first argument is the dir under which the structure will be created +# (the dir will be made and/or cleaned if necessary); the second argument +# is the associative array. + +sub create_dir_tree +{ + my ($basedir, %dirtree) = @_; + + &remove_directory_tree ("$basedir"); + mkdir ($basedir, 0777) or &error ("Couldn't mkdir $basedir: $!\n", 1); + + foreach my $path (sort keys (%dirtree)) { + if ($dirtree {$path} =~ /^DIR$/) { + mkdir ("$basedir/$path", 0777) + or &error ("Couldn't mkdir $basedir/$path: $!\n", 1); + + } elsif ($dirtree {$path} =~ /^FILE:(.*)$/) { + &create_file ("$basedir/$path", $1 . "\n"); + + } elsif ($dirtree {$path} =~ /^LINK:(.*)$/) { + symlink ("$basedir/$1", "$basedir/$path") + or &error ("Couldn't symlink $basedir/$path -> $basedir/$1: $!\n", 1); + + } else { + &error ("Bogus dirtree type: \"$dirtree{$path}\"\n", 1); + } + } + if ($just_setup_tree) { + die "Tree is setup...\n"; + } +} + +# compare a directory tree with an associative array in the format used +# by create_dir_tree, above. +# The first argument is the dir under which the structure should be found; +# the second argument is the associative array. + +sub compare_dir_tree +{ + 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) { + print "dirtree: (%dirtree)\n$basedir: (@allfiles)\n"; + } + + foreach my $path (sort keys (%dirtree)) + { + if ($debug) { + print "Checking $path ($dirtree{$path}).\n"; + } + + my $found = 0; + foreach my $i (0 .. $#allfiles) { + if ($allfiles[$i] eq $path) { + splice (@allfiles, $i, 1); # delete it + if ($debug) { + print " Zapped $path; files now (@allfiles).\n"; + } + lstat ("$basedir/$path"); + $found = 1; + last; + } + } + + if (!$found) { + print "compare_dir_tree: $path does not exist.\n"; + $bogus = 1; + next; + } + + 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); + if ($debug) + { + print " Read in $path; new files (@files).\n"; + } + + } else { + print "compare_dir_tree: $path is not a dir.\n"; + $bogus = 1; + } + + } elsif ($dirtree {$path} =~ /^FILE:(.*)$/) { + if (-l _ || !-f _) { + print "compare_dir_tree: $path is not a file.\n"; + $bogus = 1; + next; + } + + 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:(.*)$/) { + my $target = $1; + if (!-l _) { + print "compare_dir_tree: $path is not a link.\n"; + $bogus = 1; + next; + } + + my $contents = readlink ("$basedir/$path"); + $contents =~ tr/>/\//; + my $fulltarget = "$basedir/$target"; + $fulltarget =~ tr/>/\//; + if (!($contents =~ /$fulltarget$/)) { + if ($debug) { + $target = $fulltarget; + } + print "compare_dir_tree: $path should be link to $target, " + . "not $contents.\n"; + $bogus = 1; + } + + } else { + &error ("Bogus dirtree type: \"$dirtree{$path}\"\n", 1); + } + } + + if ($debug) { + print "leftovers: (@allfiles).\n"; + } + + foreach my $file (@allfiles) { + print "compare_dir_tree: $file should not exist.\n"; + $bogus = 1; + } + + return !$bogus; +} + +# this subroutine generates the numeric suffix used to keep tmp filenames, +# log filenames, etc., unique. If the number passed in is 1, then a null +# string is returned; otherwise, we return ".n", where n + 1 is the number +# we were given. + +sub num_suffix +{ + my ($num) = @_; + if (--$num > 0) { + return "$extext$num"; + } + + return ""; +} + +# This subroutine returns a log filename with a number appended to +# the end corresponding to how many logfiles have been created in the +# current running test. An optional parameter may be passed (0 or 1). +# If a 1 is passed, then it does NOT increment the logfile counter +# and returns the name of the latest logfile. If either no parameter +# is passed at all or a 0 is passed, then the logfile counter is +# incremented and the new name is returned. + +sub get_logfile +{ + my ($no_increment) = @_; + + $num_of_logfiles += !$no_increment; + + return ($log_filename . &num_suffix ($num_of_logfiles)); +} + +# This subroutine returns a base (answer) filename with a number +# appended to the end corresponding to how many logfiles (and thus +# base files) have been created in the current running test. +# NO PARAMETERS ARE PASSED TO THIS SUBROUTINE. + +sub get_basefile +{ + return ($base_filename . &num_suffix ($num_of_logfiles)); +} + +# This subroutine returns a difference filename with a number appended +# to the end corresponding to how many logfiles (and thus diff files) +# have been created in the current running test. + +sub get_difffile +{ + return ($diff_filename . &num_suffix ($num_of_logfiles)); +} + +# This subroutine returns a command filename with a number appended +# to the end corresponding to how many logfiles (and thus command files) +# have been created in the current running test. + +sub get_runfile +{ + return ($run_filename . &num_suffix ($num_of_logfiles)); +} + +# just like logfile, only a generic tmp filename for use by the test. +# they are automatically cleaned up unless -keep was used, or the test fails. +# Pass an argument of 1 to return the same filename as the previous call. + +sub get_tmpfile +{ + my ($no_increment) = @_; + + $num_of_tmpfiles += !$no_increment; + + return ($tmp_filename . &num_suffix ($num_of_tmpfiles)); +} + +1; diff --git a/third_party/make/tests/thelp.pl b/third_party/make/tests/thelp.pl new file mode 100755 index 00000000000..d8aaa667d40 --- /dev/null +++ b/third_party/make/tests/thelp.pl @@ -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 : echo to stdout +# file : echo to stdout AND create the file +# dir : echo to stdout AND create the directory +# rm : echo to stdout AND delete the file/directory +# wait : wait for a file named to exist +# tmout : Change the timeout for waiting. Default is 4 seconds. +# sleep : Sleep for seconds then echo +# fail : echo 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/third_party/make/vms_export_symbol_test.com b/third_party/make/vms_export_symbol_test.com new file mode 100644 index 00000000000..4345f44af41 --- /dev/null +++ b/third_party/make/vms_export_symbol_test.com @@ -0,0 +1,37 @@ +$! VMS_EXPORT_SYMBOL_TEST.COM +$! +$! Verify the VMS_EXPORT_SYMBOL.C module +$! +$! 22-May-2014 J. Malmberg +$! +$!========================================================================= +$! +$ cc/names=(as_is)/define=(DEBUG=1,_POSIX_EXIT=1) vms_export_symbol.c +$! +$ link vms_export_symbol +$! +$ delete vms_export_symbol.obj;* +$! +$! Need a foreign command to test. +$ vms_export_symbol := $sys$disk:[]vms_export_symbol.exe +$ save_export_symbol = vms_export_symbol +$! +$ vms_export_symbol +$ if $severity .ne. 1 +$ then +$ write sys$output "Test program failed!"; +$ endif +$! +$ if vms_export_symbol .nes. save_export_symbol +$ then +$ write sys$output "Test failed to restore foreign command!" +$ endif +$ if f$type(test_export_symbol) .nes. "" +$ then +$ write sys$output "Test failed to clear exported symbol!" +$ endif +$ if f$type(test_putenv_symbol) .nes. "" +$ then +$ write sys$output "Test failed to clear putenv exported symbol!" +$ endif +$! From b279b0dee1dc90abcbcab32a285d4f1456c35909 Mon Sep 17 00:00:00 2001 From: ahgamut <41098605+ahgamut@users.noreply.github.com> Date: Tue, 26 Oct 2021 23:45:32 +0530 Subject: [PATCH 2/3] changes made to enable compilation --- third_party/make/lib/fcntl.c | 17 +- third_party/make/lib/stdbool.in.h | 4 +- third_party/make/src/arscan.c | 2 +- third_party/make/src/config.h | 1133 +++++++++++++++++++++++++++++ third_party/make/src/dir.c | 9 + third_party/make/src/getopt.h | 8 + third_party/make/src/job.c | 14 +- third_party/make/src/makeint.h | 3 +- third_party/make/src/misc.c | 5 +- third_party/make/src/read.c | 9 +- 10 files changed, 1171 insertions(+), 33 deletions(-) create mode 100644 third_party/make/src/config.h diff --git a/third_party/make/lib/fcntl.c b/third_party/make/lib/fcntl.c index 6b9927ec4e5..291b9a915a8 100644 --- a/third_party/make/lib/fcntl.c +++ b/third_party/make/lib/fcntl.c @@ -208,24 +208,20 @@ fcntl (int fd, int action, /* arg */...) va_list arg; int result = -1; va_start (arg, action); - switch (action) - { - case F_DUPFD: + if(action == F_DUPFD) { int target = va_arg (arg, int); result = rpl_fcntl_DUPFD (fd, target); - break; } - case F_DUPFD_CLOEXEC: + else if(action == F_DUPFD_CLOEXEC) { int target = va_arg (arg, int); result = rpl_fcntl_DUPFD_CLOEXEC (fd, target); - break; } #if !HAVE_FCNTL - case F_GETFD: + else if(action == F_GETFD) { # if defined _WIN32 && ! defined __CYGWIN__ HANDLE handle = (HANDLE) _get_osfhandle (fd); @@ -241,7 +237,6 @@ fcntl (int fd, int action, /* arg */...) if (0 <= dup2 (fd, fd)) result = 0; # endif /* !W32 */ - break; } /* F_GETFD */ #endif /* !HAVE_FCNTL */ @@ -253,9 +248,9 @@ fcntl (int fd, int action, /* arg */...) using dup2 to move the duplicate onto the original, but that is not supported for now. */ - default: + else { -#if HAVE_FCNTL +#if 0 switch (action) { #ifdef F_BARRIERFSYNC /* macOS */ @@ -436,9 +431,7 @@ fcntl (int fd, int action, /* arg */...) #else errno = EINVAL; #endif - break; } - } va_end (arg); return result; } diff --git a/third_party/make/lib/stdbool.in.h b/third_party/make/lib/stdbool.in.h index baacf98a38b..795d251c9a5 100644 --- a/third_party/make/lib/stdbool.in.h +++ b/third_party/make/lib/stdbool.in.h @@ -74,7 +74,7 @@ /* 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@ +# if 0 typedef bool _Bool; # endif # else @@ -115,7 +115,7 @@ typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool; # endif # endif # endif -# define bool _Bool +// # define bool _Bool #endif /* The other macros must be usable in preprocessor directives. */ diff --git a/third_party/make/src/arscan.c b/third_party/make/src/arscan.c index 3ce21db8d16..3b6cfa2e5a6 100644 --- a/third_party/make/src/arscan.c +++ b/third_party/make/src/arscan.c @@ -331,7 +331,7 @@ ar_scan (const char *archive, ar_member_func_t function, const void *varg) #endif #ifndef WINDOWS32 -# if !defined (__ANDROID__) && !defined (__BEOS__) +# if 0 && !defined (__ANDROID__) && !defined (__BEOS__) # include # else /* These platforms don't have but have archives in the same format diff --git a/third_party/make/src/config.h b/third_party/make/src/config.h new file mode 100644 index 00000000000..bbb1d3a3ed5 --- /dev/null +++ b/third_party/make/src/config.h @@ -0,0 +1,1133 @@ +/* src/config.h. Generated from config.h.in by configure. */ +/* 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__ +#define __x86_64__ 1 +#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'. */ +#define BITSIZEOF_PTRDIFF_T 64 + +/* Define to the number of bits in type 'sig_atomic_t'. */ +#define BITSIZEOF_SIG_ATOMIC_T 32 + +/* Define to the number of bits in type 'size_t'. */ +#define BITSIZEOF_SIZE_T 64 + +/* Define to the number of bits in type 'wchar_t'. */ +#define BITSIZEOF_WCHAR_T 32 + +/* Define to the number of bits in type 'wint_t'. */ +#define BITSIZEOF_WINT_T 32 + +/* 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 . */ +/* #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. */ +#define FILE_TIMESTAMP_HI_RES 1 + +/* Define to a C preprocessor expression that evaluates to 1 or 0, depending + whether the gnulib module fscanf shall be considered present. */ +#define GNULIB_FSCANF 1 + +/* Define to a C preprocessor expression that evaluates to 1 or 0, depending + whether the gnulib module msvc-nothrow shall be considered present. */ +#define GNULIB_MSVC_NOTHROW 1 + +/* 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. */ +#define GNULIB_SCANF 1 + +/* Define to a C preprocessor expression that evaluates to 1 or 0, depending + whether the gnulib module strerror shall be considered present. */ +#define GNULIB_STRERROR 1 + +/* Define to 1 when the gnulib module access should be tested. */ +#define GNULIB_TEST_ACCESS 1 + +/* Define to 1 when the gnulib module close should be tested. */ +#define GNULIB_TEST_CLOSE 1 + +/* Define to 1 when the gnulib module dup2 should be tested. */ +#define GNULIB_TEST_DUP2 1 + +/* Define to 1 when the gnulib module fcntl should be tested. */ +#define GNULIB_TEST_FCNTL 1 + +/* Define to 1 when the gnulib module getdtablesize should be tested. */ +#define GNULIB_TEST_GETDTABLESIZE 1 + +/* Define to 1 when the gnulib module getloadavg should be tested. */ +#define GNULIB_TEST_GETLOADAVG 1 + +/* Define to 1 when the gnulib module malloc-posix should be tested. */ +#define GNULIB_TEST_MALLOC_POSIX 1 + +/* Define to 1 when the gnulib module stpcpy should be tested. */ +#define GNULIB_TEST_STPCPY 1 + +/* Define to 1 when the gnulib module strerror should be tested. */ +#define GNULIB_TEST_STRERROR 1 + +/* Define to 1 if you have 'alloca' after including , a header that + may be supplied by this distribution. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* 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 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. */ +#define HAVE_DECL_BSD_SIGNAL 0 + +/* Define to 1 if you have the declaration of `dlerror', and to 0 if you + don't. */ +#define HAVE_DECL_DLERROR 1 + +/* Define to 1 if you have the declaration of `dlopen', and to 0 if you don't. + */ +#define HAVE_DECL_DLOPEN 1 + +/* Define to 1 if you have the declaration of `dlsym', and to 0 if you don't. + */ +#define HAVE_DECL_DLSYM 1 + +/* Define to 1 if you have the declaration of `getdtablesize', and to 0 if you + don't. */ +#define HAVE_DECL_GETDTABLESIZE 1 + +/* Define to 1 if you have the declaration of `program_invocation_name', and + to 0 if you don't. */ +#define HAVE_DECL_PROGRAM_INVOCATION_NAME 1 + +/* Define to 1 if you have the declaration of `program_invocation_short_name', + and to 0 if you don't. */ +#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 1 + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#define HAVE_DECL_STRERROR_R 1 + +/* 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 `__argv', and to 0 if you don't. + */ +#define HAVE_DECL___ARGV 1 + +/* 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 header file, and it defines `DIR'. + */ +#define HAVE_DIRENT_H 1 + +/* Use platform specific coding */ +/* #undef HAVE_DOS_PATHS */ + +/* Define to 1 if you have the `dup' function. */ +#define HAVE_DUP 1 + +/* Define to 1 if you have the `dup2' function. */ +#define HAVE_DUP2 1 + +/* Define to 1 if you have the `fcntl' function. */ +#define HAVE_FCNTL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `fdopen' function. */ +#define HAVE_FDOPEN 1 + +/* Define to 1 if you have the `fork' function. */ +#define HAVE_FORK 1 + +/* Define to 1 if you have the `getcwd' function. */ +#define HAVE_GETCWD 1 + +/* Define to 1 if you have the `getdtablesize' function. */ +#define HAVE_GETDTABLESIZE 1 + +/* Define to 1 if you have the `getexecname' function. */ +/* #undef HAVE_GETEXECNAME */ + +/* Define to 1 if you have the `getgroups' function. */ +#define HAVE_GETGROUPS 1 + +/* 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. */ +#define HAVE_GETRLIMIT 1 + +/* Define if the GNU gettext() function is already present or preinstalled. */ +/* #undef HAVE_GETTEXT */ + +/* Define to 1 if you have a standard gettimeofday function */ +#define HAVE_GETTIMEOFDAY 1 + +/* 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 header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `isatty' function. */ +#define HAVE_ISATTY 1 + +/* 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 header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if the system has the type 'long long int'. */ +#define HAVE_LONG_LONG_INT 1 + +/* Define to 1 if you have the `lstat' function. */ +#define HAVE_LSTAT 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACH_MACH_H */ + +/* Define if the 'malloc' function is POSIX compliant. */ +#define HAVE_MALLOC_POSIX 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memrchr' function. */ +#define HAVE_MEMRCHR 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 on MSVC platforms that have the "invalid parameter handler" + concept. */ +/* #undef HAVE_MSVC_INVALID_PARAMETER_HANDLER */ + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NLIST_H */ + +/* Define to 1 if you have the `pipe' function. */ +#define HAVE_PIPE 1 + +/* Define to 1 if you have the `posix_spawn' function. */ +#define HAVE_POSIX_SPAWN 1 + +/* Define to 1 if you have the `posix_spawnattr_setsigmask' function. */ +#define HAVE_POSIX_SPAWNATTR_SETSIGMASK 1 + +/* 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. */ +#define HAVE_READLINK 1 + +/* Define to 1 if you have the `realpath' function. */ +#define HAVE_REALPATH 1 + +/* Define to 1 if defines the SA_RESTART constant. */ +#define HAVE_SA_RESTART 1 + +/* Define to 1 if you have the `setdtablesize' function. */ +/* #undef HAVE_SETDTABLESIZE */ + +/* Define to 1 if you have the `setegid' function. */ +#define HAVE_SETEGID 1 + +/* Define to 1 if you have the `seteuid' function. */ +#define HAVE_SETEUID 1 + +/* Define to 1 if you have the `setlinebuf' function. */ +/* #undef HAVE_SETLINEBUF */ + +/* Define to 1 if you have the `setregid' function. */ +#define HAVE_SETREGID 1 + +/* Define to 1 if you have the `setreuid' function. */ +#define HAVE_SETREUID 1 + +/* Define to 1 if you have the `setrlimit' function. */ +#define HAVE_SETRLIMIT 1 + +/* Define to 1 if you have the `setvbuf' function. */ +#define HAVE_SETVBUF 1 + +/* Define to 1 if you have the `sigaction' function. */ +#define HAVE_SIGACTION 1 + +/* Define to 1 if 'sig_atomic_t' is a signed integer type. */ +#define HAVE_SIGNED_SIG_ATOMIC_T 1 + +/* Define to 1 if 'wchar_t' is a signed integer type. */ +#define HAVE_SIGNED_WCHAR_T 1 + +/* 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 header file. */ +#define HAVE_SPAWN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `stpcpy' function. */ +#define HAVE_STPCPY 1 + +/* 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 `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_r' function. */ +#define HAVE_STRERROR_R 1 + +/* Define to 1 if you have the `stricmp' function. */ +/* #undef HAVE_STRICMP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 + +/* Define to 1 if you have the `strncmpi' function. */ +/* #undef HAVE_STRNCMPI */ + +/* Define to 1 if you have the `strndup' function. */ +#define HAVE_STRNDUP 1 + +/* Define to 1 if you have the `strnicmp' function. */ +/* #undef HAVE_STRNICMP */ + +/* Define to 1 if you have the `strsignal' function. */ +#define HAVE_STRSIGNAL 1 + +/* Define to 1 if `d_type' is a member of `struct dirent'. */ +#define HAVE_STRUCT_DIRENT_D_TYPE 1 + +/* 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. */ +#define HAVE_SYMLINK 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_BITYPES_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_FILE_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_INTTYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_LOADAVG_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_TIMEB_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define to 1 if you have the `ttyname' function. */ +#define HAVE_TTYNAME 1 + +/* Define to 1 if the system has the type `uintmax_t'. */ +#define HAVE_UINTMAX_T 1 + +/* Define to 1 if you have the `umask' function. */ +#define HAVE_UMASK 1 + +/* Define to 1 if you have the 'union wait' type in . */ +/* #undef HAVE_UNION_WAIT */ + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if the system has the type 'unsigned long long int'. */ +#define HAVE_UNSIGNED_LONG_LONG_INT 1 + +/* Define if you have a global __progname variable */ +/* #undef HAVE_VAR___PROGNAME */ + +/* Define to 1 if you have the `vfork' function. */ +#define HAVE_VFORK 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_VFORK_H */ + +/* Define to 1 if you have the `wait3' function. */ +#define HAVE_WAIT3 1 + +/* Define to 1 if you have the `waitpid' function. */ +#define HAVE_WAITPID 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_WCHAR_H 1 + +/* Define if you have the 'wchar_t' type. */ +#define HAVE_WCHAR_T 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_WINSOCK2_H */ + +/* Define if you have the 'wint_t' type. */ +#define HAVE_WINT_T 1 + +/* Define to 1 if `fork' works. */ +#define HAVE_WORKING_FORK 1 + +/* Define to 1 if O_NOATIME works. */ +#define HAVE_WORKING_O_NOATIME 0 + +/* Define to 1 if O_NOFOLLOW works. */ +#define HAVE_WORKING_O_NOFOLLOW 0 + +/* Define to 1 if `vfork' works. */ +#define HAVE_WORKING_VFORK 1 + +/* Define to 1 if the system has the type `_Bool'. */ +#define HAVE__BOOL 1 + +/* Define to 1 if you have the `_set_invalid_parameter_handler' function. */ +/* #undef HAVE__SET_INVALID_PARAMETER_HANDLER */ + +/* Build host information. */ +#define MAKE_HOST "x86_64-pc-linux-gnu" + +/* 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. */ +#define MAKE_SYMLINKS 1 + +/* Use GNU style printf and scanf. */ +#ifndef __USE_MINGW_ANSI_STDIO +# define __USE_MINGW_ANSI_STDIO 1 +#endif + + +/* Define to 1 if the nlist n_name member is a pointer */ +/* #undef N_NAME_POINTER */ + +/* Name of 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 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 to l, ll, u, ul, ull, etc., as suitable for constants of type + 'ptrdiff_t'. */ +#define PTRDIFF_T_SUFFIX l + +/* 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'). */ +#define RETSIGTYPE void + +/* Define to the name of the SCCS 'get' command. */ +#define SCCS_GET "get" + +/* Define to 1 if the SCCS 'get' command understands the '-G' option. */ +/* #undef SCCS_GET_MINUS_G */ + +/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type + 'sig_atomic_t'. */ +#define SIG_ATOMIC_T_SUFFIX + +/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type + 'size_t'. */ +#define SIZE_T_SUFFIX ul + +/* 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 do not work properly. */ +/* #undef STAT_MACROS_BROKEN */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if strerror_r returns char *. */ +/* #undef STRERROR_R_CHAR_P */ + +/* Define if struct stat contains a nanoseconds field */ +#define ST_MTIM_NSEC st_mtim.tv_nsec + +/* Define to 1 on System V Release 4. */ +/* #undef SVR4 */ + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define to 1 for Encore UMAX. */ +/* #undef UMAX */ + +/* Define to 1 for Encore UMAX 4.3 that has instead of + . */ +/* #undef UMAX4_3 */ + +/* Define to 1 to use posix_spawn(). */ +/* #undef USE_POSIX_SPAWN */ + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# define _ALL_SOURCE 1 +#endif +/* Enable general extensions on macOS. */ +#ifndef _DARWIN_C_SOURCE +# define _DARWIN_C_SOURCE 1 +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif +/* Enable NetBSD extensions on NetBSD. */ +#ifndef _NETBSD_SOURCE +# define _NETBSD_SOURCE 1 +#endif +/* Enable OpenBSD extensions on NetBSD. */ +#ifndef _OPENBSD_SOURCE +# define _OPENBSD_SOURCE 1 +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# define _POSIX_PTHREAD_SEMANTICS 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ +#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ +# define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ +#ifndef __STDC_WANT_IEC_60559_BFP_EXT__ +# define __STDC_WANT_IEC_60559_BFP_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ +#ifndef __STDC_WANT_IEC_60559_DFP_EXT__ +# define __STDC_WANT_IEC_60559_DFP_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ +#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ +# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */ +#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ +# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ +#ifndef __STDC_WANT_LIB_EXT2__ +# define __STDC_WANT_LIB_EXT2__ 1 +#endif +/* Enable extensions specified by ISO/IEC 24747:2009. */ +#ifndef __STDC_WANT_MATH_SPEC_FUNCS__ +# define __STDC_WANT_MATH_SPEC_FUNCS__ 1 +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# define _TANDEM_SOURCE 1 +#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 +# define _HPUX_ALT_XOPEN_SOCKET_API 1 +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# define __EXTENSIONS__ 1 +#endif + + +/* Version number of package */ +#define VERSION "4.3" + +/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type + 'wchar_t'. */ +#define 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'. */ +#define WINT_T_SUFFIX u + +/* 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. */ +#define _NETBSD_SOURCE 1 + +/* 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. */ +#define _USE_STD_STAT 1 + +/* Define to 1 if the system predates C++11. */ +/* #undef __STDC_CONSTANT_MACROS */ + +/* Define to 1 if the system 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 + + 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. */ +#define eaccess access + +/* 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 + . + + 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 . 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 . + 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 + and + . */ +#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 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 does not define. */ +/* #undef mode_t */ + +/* Define to `long int' if does not define. */ +/* #undef off_t */ + +/* Define to `int' if 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. */ +#define restrict __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 does not define. */ +/* #undef size_t */ + +/* Define to `int' if does not define. */ +/* #undef ssize_t */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Define to the widest unsigned integer type if and + 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/third_party/make/src/dir.c b/third_party/make/src/dir.c index 862a18ead91..4a45ad36078 100644 --- a/third_party/make/src/dir.c +++ b/third_party/make/src/dir.c @@ -19,6 +19,15 @@ this program. If not, see . */ #include "filedef.h" #include "dep.h" +#ifndef __ptr_t +#define __ptr_t void* +#endif +#define gl_readdir __dummy2[1] +#define gl_opendir __dummy2[2] +#define gl_closedir __dummy2[0] +#define gl_lstat __dummy2[3] +#define gl_stat __dummy2[4] + #ifdef HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen((dirent)->d_name) diff --git a/third_party/make/src/getopt.h b/third_party/make/src/getopt.h index abfc31e70da..cd033ea94ca 100644 --- a/third_party/make/src/getopt.h +++ b/third_party/make/src/getopt.h @@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _GETOPT_H +#if 0 && !defined(_GETOPT_H) #define _GETOPT_H 1 #ifdef __cplusplus @@ -127,4 +128,11 @@ extern int _getopt_internal (); } #endif +#else +extern int _getopt_internal (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind, + int long_only); +#endif + #endif /* getopt.h */ diff --git a/third_party/make/src/job.c b/third_party/make/src/job.c index ae1f18b9b8a..9f9074f22bc 100644 --- a/third_party/make/src/job.c +++ b/third_party/make/src/job.c @@ -2552,12 +2552,10 @@ exec_command (char **argv, char **envp) # endif /* !__EMX__ */ - switch (errno) { - case ENOENT: + if(errno == ENOENT) OSS (error, NILF, "%s: %s", argv[0], strerror (errno)); - break; - case ENOEXEC: + else if(errno == ENOEXEC) { /* The file was not a program. Try it as a shell script. */ const char *shell; @@ -2614,19 +2612,15 @@ exec_command (char **argv, char **envp) execvp (shell, new_argv); # endif OSS (error, NILF, "%s: %s", new_argv[0], strerror (errno)); - break; } # ifdef __EMX__ - case EINVAL: + else if (errno == 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__ @@ -2916,7 +2910,7 @@ construct_command_argv_internal (char *line, char **restp, const char *shell, instring = word_has_equals = seen_nonequals = last_argument_was_empty = 0; for (p = line; *p != '\0'; ++p) { - assert (ap <= end); + // assert (ap <= end); if (instring) { diff --git a/third_party/make/src/makeint.h b/third_party/make/src/makeint.h index c428a362a4c..f84e4deba28 100644 --- a/third_party/make/src/makeint.h +++ b/third_party/make/src/makeint.h @@ -517,7 +517,8 @@ 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 *xcalloc (size_t); +#define xcalloc(size) ((xcalloc)(1, (size))) void *xrealloc (void *, size_t); char *xstrdup (const char *); char *xstrndup (const char *, size_t); diff --git a/third_party/make/src/misc.c b/third_party/make/src/misc.c index de19e37547c..1973025eb29 100644 --- a/third_party/make/src/misc.c +++ b/third_party/make/src/misc.c @@ -176,7 +176,7 @@ concat (unsigned int num, ...) /* 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 +#if 0 && !defined(HAVE_DMALLOC_H) #undef xmalloc #undef xcalloc @@ -197,14 +197,13 @@ xmalloc (size_t size) void * xcalloc (size_t size) { - /* Make sure we don't allocate 0, for pre-ISO implementations. */ + /* 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) { diff --git a/third_party/make/src/read.c b/third_party/make/src/read.c index fa197fb80a2..6d54fb60667 100644 --- a/third_party/make/src/read.c +++ b/third_party/make/src/read.c @@ -27,6 +27,7 @@ this program. If not, see . */ #include "rule.h" #include "debug.h" #include "hash.h" +# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions. */ #ifdef WINDOWS32 @@ -361,15 +362,15 @@ eval_makefile (const char *filename, unsigned short flags) deps->error = errno; /* Check for unrecoverable errors: out of mem or FILE slots. */ - switch (deps->error) { + if (0 || #ifdef EMFILE - case EMFILE: + deps->error == EMFILE || #endif #ifdef ENFILE - case ENFILE: + deps->error == ENFILE || #endif - case ENOMEM: + deps->error == ENOMEM) { const char *err = strerror (deps->error); OS (fatal, reading_file, "%s", err); From df074162e56b26a17db346eb3277c97ad91ede6c Mon Sep 17 00:00:00 2001 From: ahgamut <41098605+ahgamut@users.noreply.github.com> Date: Wed, 27 Oct 2021 00:24:07 +0530 Subject: [PATCH 3/3] get make to build --- Makefile | 1 + third_party/make/lib/alloca.h | 72 + third_party/make/lib/basename-lgpl.c | 4 +- third_party/make/lib/concat-filename.c | 6 +- third_party/make/lib/dirname-lgpl.c | 4 +- third_party/make/lib/dup2.c | 2 +- third_party/make/lib/error.c | 5 +- third_party/make/lib/exitfail.c | 7 +- third_party/make/lib/fcntl.c | 4 +- third_party/make/lib/fcntl.h | 866 +++++++++ third_party/make/lib/fd-hook.c | 4 +- third_party/make/lib/findprog-in.c | 11 +- third_party/make/lib/getloadavg.c | 4 +- third_party/make/lib/getprogname.c | 6 +- third_party/make/lib/limits.h | 105 ++ third_party/make/lib/stdbool.h | 133 ++ third_party/make/lib/stddef.h | 122 ++ third_party/make/lib/stdint.h | 747 ++++++++ third_party/make/lib/stdio.h | 1918 ++++++++++++++++++++ third_party/make/lib/stdlib.h | 1626 +++++++++++++++++ third_party/make/lib/string.h | 1541 ++++++++++++++++ third_party/make/lib/stripslash.c | 4 +- third_party/make/lib/unistd.c | 4 +- third_party/make/lib/unistd.h | 2193 +++++++++++++++++++++++ third_party/make/lib/xalloc-die.c | 10 +- third_party/make/lib/xalloc.h | 3 +- third_party/make/lib/xconcat-filename.c | 6 +- third_party/make/lib/xmalloc.c | 4 +- third_party/make/make.mk | 129 ++ third_party/make/src/ar.c | 8 +- third_party/make/src/arscan.c | 4 +- third_party/make/src/commands.c | 14 +- third_party/make/src/default.c | 14 +- third_party/make/src/dir.c | 11 +- third_party/make/src/expand.c | 12 +- third_party/make/src/file.c | 16 +- third_party/make/src/filedef.h | 2 +- third_party/make/src/function.c | 20 +- third_party/make/src/getopt.c | 7 +- third_party/make/src/getopt.h | 1 + third_party/make/src/getopt1.c | 4 +- third_party/make/src/guile.c | 14 +- third_party/make/src/hash.c | 4 +- third_party/make/src/implicit.c | 16 +- third_party/make/src/job.c | 20 +- third_party/make/src/job.h | 2 +- third_party/make/src/load.c | 10 +- third_party/make/src/loadapi.c | 8 +- third_party/make/src/main.c | 29 +- third_party/make/src/makeint.h | 16 +- third_party/make/src/misc.c | 9 +- third_party/make/src/output.c | 9 +- third_party/make/src/posixos.c | 9 +- third_party/make/src/read.c | 22 +- third_party/make/src/remake.c | 14 +- third_party/make/src/remote-stub.c | 8 +- third_party/make/src/rule.c | 14 +- third_party/make/src/signame.c | 2 +- third_party/make/src/strcache.c | 4 +- third_party/make/src/variable.c | 18 +- third_party/make/src/variable.h | 2 +- third_party/make/src/version.c | 2 +- third_party/make/src/vpath.c | 8 +- third_party/third_party.mk | 1 + 64 files changed, 9683 insertions(+), 212 deletions(-) create mode 100644 third_party/make/lib/alloca.h create mode 100644 third_party/make/lib/fcntl.h create mode 100644 third_party/make/lib/limits.h create mode 100644 third_party/make/lib/stdbool.h create mode 100644 third_party/make/lib/stddef.h create mode 100644 third_party/make/lib/stdint.h create mode 100644 third_party/make/lib/stdio.h create mode 100644 third_party/make/lib/stdlib.h create mode 100644 third_party/make/lib/string.h create mode 100644 third_party/make/lib/unistd.h create mode 100644 third_party/make/make.mk diff --git a/Makefile b/Makefile index 96315cb03b6..f713a1e8200 100644 --- a/Makefile +++ b/Makefile @@ -139,6 +139,7 @@ include libc/testlib/testlib.mk include tool/viz/lib/vizlib.mk include third_party/linenoise/linenoise.mk include third_party/lua/lua.mk +include third_party/make/make.mk include third_party/argon2/argon2.mk include third_party/sqlite3/sqlite3.mk include third_party/mbedtls/test/test.mk diff --git a/third_party/make/lib/alloca.h b/third_party/make/lib/alloca.h new file mode 100644 index 00000000000..21b4f5eb3c9 --- /dev/null +++ b/third_party/make/lib/alloca.h @@ -0,0 +1,72 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 + . + */ + +/* 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 that causes trouble when + included after 'alloca' gets defined as a macro. As a workaround, include + this first and define 'alloca' as a macro afterwards. */ +# if (defined _WIN32 && ! defined __CYGWIN__) && 1 +# include_next +# endif +# define alloca __builtin_alloca +# elif defined _AIX +# define alloca __alloca +# elif defined _MSC_VER +# include +# 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 +# else +# include +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +# endif +#endif + +#endif /* _GL_ALLOCA_H */ diff --git a/third_party/make/lib/basename-lgpl.c b/third_party/make/lib/basename-lgpl.c index 565469ea3d1..06170b3119f 100644 --- a/third_party/make/lib/basename-lgpl.c +++ b/third_party/make/lib/basename-lgpl.c @@ -16,9 +16,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include +#include "third_party/make/src/config.h" -#include "dirname.h" +#include "third_party/make/lib/dirname.h" #include diff --git a/third_party/make/lib/concat-filename.c b/third_party/make/lib/concat-filename.c index 367e41d22c9..32e02a760f2 100644 --- a/third_party/make/lib/concat-filename.c +++ b/third_party/make/lib/concat-filename.c @@ -16,16 +16,16 @@ /* Written by Bruno Haible . */ -#include +#include "third_party/make/src/config.h" /* Specification. */ -#include "concat-filename.h" +#include "third_party/make/lib/concat-filename.h" #include #include #include -#include "filename.h" +#include "third_party/make/lib/filename.h" /* Concatenate a directory filename, a relative filename and an optional suffix. The directory may end with the directory separator. The second diff --git a/third_party/make/lib/dirname-lgpl.c b/third_party/make/lib/dirname-lgpl.c index 27d4374c2e7..f11c20bf3fa 100644 --- a/third_party/make/lib/dirname-lgpl.c +++ b/third_party/make/lib/dirname-lgpl.c @@ -16,9 +16,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include +#include "third_party/make/src/config.h" -#include "dirname.h" +#include "third_party/make/lib/dirname.h" #include #include diff --git a/third_party/make/lib/dup2.c b/third_party/make/lib/dup2.c index 88ef2591313..78918bc05e2 100644 --- a/third_party/make/lib/dup2.c +++ b/third_party/make/lib/dup2.c @@ -17,7 +17,7 @@ /* written by Paul Eggert */ -#include +#include "third_party/make/src/config.h" /* Specification. */ #include diff --git a/third_party/make/lib/error.c b/third_party/make/lib/error.c index 3657b51cdfe..3a69bf0b294 100644 --- a/third_party/make/lib/error.c +++ b/third_party/make/lib/error.c @@ -18,10 +18,11 @@ /* Written by David MacKenzie . */ #if !_LIBC -# include +#include "third_party/make/src/config.h" #endif -#include "error.h" +#include "third_party/make/lib/error.h" +#include "third_party/make/lib/stdio.h" #include #include diff --git a/third_party/make/lib/exitfail.c b/third_party/make/lib/exitfail.c index 189fa16f46a..abe82026083 100644 --- a/third_party/make/lib/exitfail.c +++ b/third_party/make/lib/exitfail.c @@ -15,10 +15,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include +#include "third_party/make/src/config.h" -#include "exitfail.h" +#include "third_party/make/lib/exitfail.h" +#include "libc/sysv/consts/exit.h" #include -int volatile exit_failure = EXIT_FAILURE; +int volatile exit_failure = 1; /*TODO: this should be EXIT_FAILURE; */ diff --git a/third_party/make/lib/fcntl.c b/third_party/make/lib/fcntl.c index 291b9a915a8..e12b74befac 100644 --- a/third_party/make/lib/fcntl.c +++ b/third_party/make/lib/fcntl.c @@ -17,10 +17,10 @@ /* Written by Eric Blake . */ -#include +#include "third_party/make/src/config.h" /* Specification. */ -#include +#include "third_party/make/lib/fcntl.h" #include #include diff --git a/third_party/make/lib/fcntl.h b/third_party/make/lib/fcntl.h new file mode 100644 index 00000000000..63ff800f993 --- /dev/null +++ b/third_party/make/lib/fcntl.h @@ -0,0 +1,866 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Like , 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 . */ + +/* written by Paul Eggert */ + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + + +#if defined __need_system_fcntl_h +/* Special invocation convention. */ + +/* Needed before . + May also define off_t to a 64-bit type on native Windows. */ +#include +/* On some systems other than glibc, is a prerequisite of + . On glibc systems, we would like to avoid namespace pollution. + But on glibc systems, includes inside an + extern "C" { ... } block, which leads to errors in C++ mode with the + overridden 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 +#endif +#include_next + +/* Native Windows platforms declare open(), creat() in . */ +#if (0 || 0 || defined GNULIB_POSIXCHECK) \ + && (defined _WIN32 && ! defined __CYGWIN__) +# include +#endif + +#else +/* Normal invocation convention. */ + +#ifndef _GL_FCNTL_H + +/* Needed before . + May also define off_t to a 64-bit type on native Windows. */ +#include +/* On some systems other than glibc, is a prerequisite of + . On glibc systems, we would like to avoid namespace pollution. + But on glibc systems, includes inside an + extern "C" { ... } block, which leads to errors in C++ mode with the + overridden 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 +#endif +/* The include_next requires a split double-inclusion guard. */ +#include_next + +/* Native Windows platforms declare open(), creat() in . */ +#if (0 || 0 || defined GNULIB_POSIXCHECK) \ + && (defined _WIN32 && ! defined __CYGWIN__) +# include +#endif + +#ifndef _GL_FCNTL_H +#define _GL_FCNTL_H + +#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */ +# include +#endif + + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ +/* 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 . */ + +#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(::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(::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((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 , + 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 , + 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 */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ +/* 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 . */ + +/* _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 + +/* The definition of _GL_WARN_ON_USE is copied here. */ +/* 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 . */ + +/* _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 ]], + [getline]) in configure.ac, which potentially defines + HAVE_RAW_DECL_GETLINE + - adding this code to a header that wraps the system : + #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 + + +/* Declare overridden functions. */ + +#if 0 +# if 0 +# 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 1 +# if 1 +# 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 !1 +_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 0 +# if 0 +# 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 0 +# if 0 +# 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 !1 +_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 +# 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 0 +# 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 /* _GL_FCNTL_H */ +#endif /* _GL_FCNTL_H */ +#endif diff --git a/third_party/make/lib/fd-hook.c b/third_party/make/lib/fd-hook.c index 8840f634880..31a54980794 100644 --- a/third_party/make/lib/fd-hook.c +++ b/third_party/make/lib/fd-hook.c @@ -15,10 +15,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include +#include "third_party/make/src/config.h" /* Specification. */ -#include "fd-hook.h" +#include "third_party/make/lib/fd-hook.h" #include diff --git a/third_party/make/lib/findprog-in.c b/third_party/make/lib/findprog-in.c index c254f2f588e..cd0a038b550 100644 --- a/third_party/make/lib/findprog-in.c +++ b/third_party/make/lib/findprog-in.c @@ -16,10 +16,11 @@ along with this program. If not, see . */ -#include +#include "third_party/make/src/config.h" /* Specification. */ -#include "findprog.h" +#include "third_party/make/lib/findprog.h" +#include "libc/sysv/consts/ok.h" #include #include @@ -27,9 +28,9 @@ #include #include -#include "filename.h" -#include "concat-filename.h" -#include "xalloc.h" +#include "third_party/make/lib/filename.h" +#include "third_party/make/lib/concat-filename.h" +#include "third_party/make/lib/xalloc.h" #if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__ /* Native Windows, OS/2, DOS */ diff --git a/third_party/make/lib/getloadavg.c b/third_party/make/lib/getloadavg.c index ebb6f5d5dba..967b799ce34 100644 --- a/third_party/make/lib/getloadavg.c +++ b/third_party/make/lib/getloadavg.c @@ -76,7 +76,7 @@ We also #define LDAV_PRIVILEGED if a program will require special installation to be able to call getloadavg. */ -#include +#include "third_party/make/src/config.h" /* Specification. */ #include @@ -88,7 +88,7 @@ # include # if HAVE_SYS_PARAM_H -# include +// # include # endif # include "intprops.h" diff --git a/third_party/make/lib/getprogname.c b/third_party/make/lib/getprogname.c index 9f69f5a5592..0db6665ff03 100644 --- a/third_party/make/lib/getprogname.c +++ b/third_party/make/lib/getprogname.c @@ -14,10 +14,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include +#include "third_party/make/src/config.h" /* Specification. */ -#include "getprogname.h" +#include "third_party/make/lib/getprogname.h" #include /* get program_invocation_name declaration */ #include /* get __argv declaration */ @@ -51,7 +51,7 @@ # include #endif -#include "dirname.h" +#include "third_party/make/lib/dirname.h" #ifndef HAVE_GETPROGNAME /* not Mac OS X, FreeBSD, NetBSD, OpenBSD >= 5.4, Cygwin */ char const * diff --git a/third_party/make/lib/limits.h b/third_party/make/lib/limits.h new file mode 100644 index 00000000000..c48685dd92a --- /dev/null +++ b/third_party/make/lib/limits.h @@ -0,0 +1,105 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A GNU-like . + + 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 . */ + +#ifndef _GL_LIMITS_H + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + + +/* The include_next requires a split double-inclusion guard. */ +#include_next + +#ifndef _GL_LIMITS_H +#define _GL_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 /* _GL_LIMITS_H */ +#endif /* _GL_LIMITS_H */ diff --git a/third_party/make/lib/stdbool.h b/third_party/make/lib/stdbool.h new file mode 100644 index 00000000000..4afcd7db8d8 --- /dev/null +++ b/third_party/make/lib/stdbool.h @@ -0,0 +1,133 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Copyright (C) 2001-2003, 2006-2020 Free Software Foundation, Inc. + Written by Bruno Haible , 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 . */ + +#ifndef _GL_STDBOOL_H +#define _GL_STDBOOL_H + +/* ISO C 99 for platforms that lack it. */ + +/* Usage suggestions: + + Programs that use should be aware of some limitations + and standards compliance issues. + + Standards compliance: + + - 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: + + - 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 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 /* 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 0 +typedef bool _Bool; +# endif +# else +# if !defined __GNUC__ + /* If 1: + 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 was working. + So we override the _Bool type. + If !1: + 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 !1 + /* 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/third_party/make/lib/stddef.h b/third_party/make/lib/stddef.h new file mode 100644 index 00000000000..7c135ada0a4 --- /dev/null +++ b/third_party/make/lib/stddef.h @@ -0,0 +1,122 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A substitute for POSIX 2008 , 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 . */ + +/* Written by Eric Blake. */ + +/* + * POSIX 2008 for platforms that have issues. + * + */ + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + + +#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 that blindly + redefines NULL even when __need_wint_t was defined, even though + wint_t is not normally provided by . 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 _GL_STDDEF_H && defined _GL_STDDEF_WINT_T) +# ifdef __need_wint_t +# define _GL_STDDEF_WINT_T +# endif +# include_next +# endif + +#else +/* Normal invocation convention. */ + +# ifndef _GL_STDDEF_H + +/* The include_next requires a split double-inclusion guard. */ + +# include_next + +/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */ +# if (0 \ + && (!defined _GL_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 _GL_STDDEF_H +# define _GL_STDDEF_H + +/* Some platforms lack wchar_t. */ +#if !1 +# 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 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 +#else +# if ! (0 || 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 /* _GL_STDDEF_H */ +# endif /* _GL_STDDEF_H */ +#endif /* __need_XXX */ diff --git a/third_party/make/lib/stdint.h b/third_party/make/lib/stdint.h new file mode 100644 index 00000000000..8c715650087 --- /dev/null +++ b/third_party/make/lib/stdint.h @@ -0,0 +1,747 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 . */ + +/* + * ISO C 99 for platforms that lack it. + * + */ + +#ifndef _GL_STDINT_H + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + + +/* When including a system file that in turn includes , + use the system , not our substitute. This avoids + problems with (for example) VMS, whose includes + . */ +#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H + +/* On Android (Bionic libc), includes this file before + having defined 'time_t'. Therefore in this case avoid including + other system header files; just include the system's . + Ideally we should test __BIONIC__ here, but it is only defined after + has been included; hence test __ANDROID__ instead. */ +#if defined __ANDROID__ && defined _GL_INCLUDING_SYS_TYPES_H +# include_next +#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 1 +# if defined __sgi && ! defined __c99 + /* Bypass IRIX's 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 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 . + Include it before , since any "#include " + in would reinclude us, skipping our contents because + _GL_STDINT_H is defined. + The include_next requires a split double-inclusion guard. */ +# include_next +#endif + +#if ! defined _GL_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H +#define _GL_STDINT_H + +/* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX, + LONG_MIN, LONG_MAX, ULONG_MAX, _GL_INTEGER_WIDTH. */ +#include + +/* Override WINT_MIN and WINT_MAX if gnulib's or overrides + wint_t. */ +#if 0 +# undef WINT_MIN +# undef WINT_MAX +# define WINT_MIN 0x0U +# define WINT_MAX 0xffffffffU +#endif + +#if ! 0 + +/* defines some of the stdint.h types as well, on glibc, + IRIX 6.5, and OpenBSD 3.8 (via ). + AIX 5.2 isn't needed and causes troubles. + Mac OS X 10.4.6 includes (which is us), but + relies on the system definitions, so include + after . */ +# if 1 && ! defined _AIX +# include +# endif + +# if 1 + /* In OpenBSD 3.8, includes , which defines + int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__. + also defines intptr_t and uintptr_t. */ +# include +# elif 0 + /* Solaris 7 has the types except the *_fast*_t types, and + the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */ +# include +# endif + +# if 0 && ! defined __BIT_TYPES_DEFINED__ + /* Linux libc4 >= 4.6.7 and libc5 have a that defines + int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is + included by . */ +# include +# 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 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 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 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 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 . */ +# 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 0 +# 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 (64, 0l) +# define PTRDIFF_MAX \ + _STDINT_MAX (1, 64, 0l) +# endif + +/* sig_atomic_t limits */ +# undef SIG_ATOMIC_MIN +# undef SIG_ATOMIC_MAX +# if 1 +# define SIG_ATOMIC_MIN \ + _STDINT_SIGNED_MIN (32, 0) +# else +# define SIG_ATOMIC_MIN \ + _STDINT_UNSIGNED_MIN (32, 0) +# endif +# define SIG_ATOMIC_MAX \ + _STDINT_MAX (1, 32, \ + 0) + + +/* size_t limit */ +# undef SIZE_MAX +# if 0 +# 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, 64, 0ul) +# 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 + -> -> -> , and the latter includes + and assumes its types are already defined. */ +# if 1 && ! (defined WCHAR_MIN && defined WCHAR_MAX) + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ +# include +# include +# include +# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H +# include +# undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H +# endif +# undef WCHAR_MIN +# undef WCHAR_MAX +# if 1 +# define WCHAR_MIN \ + _STDINT_SIGNED_MIN (32, 0) +# else +# define WCHAR_MIN \ + _STDINT_UNSIGNED_MIN (32, 0) +# endif +# define WCHAR_MAX \ + _STDINT_MAX (1, 32, 0) + +/* wint_t limits */ +/* If gnulib's or overrides wint_t, u is not + accurate, therefore use the definitions from above. */ +# if !0 +# undef WINT_MIN +# undef WINT_MAX +# if 0 +# define WINT_MIN \ + _STDINT_SIGNED_MIN (32, 0u) +# else +# define WINT_MIN \ + _STDINT_UNSIGNED_MIN (32, 0u) +# endif +# define WINT_MAX \ + _STDINT_MAX (0, 32, 0u) +# 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 /* !0 */ + +/* 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 /* _GL_STDINT_H */ +#endif /* !(defined __ANDROID__ && ...) */ +#endif /* !defined _GL_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */ diff --git a/third_party/make/lib/stdio.h b/third_party/make/lib/stdio.h new file mode 100644 index 00000000000..91eeb9ffd10 --- /dev/null +++ b/third_party/make/lib/stdio.h @@ -0,0 +1,1918 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A GNU-like . + + 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 . */ + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + + +#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 + -> -> -> -> + -> -> -> . + In this situation, the functions are not yet declared, therefore we cannot + provide the C++ aliases. */ + +#include_next + +#else +/* Normal invocation convention. */ + +#ifndef _GL_STDIO_H + +#define _GL_ALREADY_INCLUDING_STDIO_H + +/* The include_next requires a split double-inclusion guard. */ +#include_next + +#undef _GL_ALREADY_INCLUDING_STDIO_H + +#ifndef _GL_STDIO_H +#define _GL_STDIO_H + +/* Get va_list. Needed on many systems, including glibc 2.8. */ +#include + +#include + +/* 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 + +/* 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 , not in . */ +/* But in any case avoid namespace pollution on glibc systems. */ +#if (0 || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \ + && ! defined __GLIBC__ +# include +#endif + +/* Android 4.3 declares renameat in , not in . */ +/* But in any case avoid namespace pollution on glibc systems. */ +#if (0 || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \ + && ! defined __GLIBC__ +# include +#endif + +/* MSVC declares 'perror' in , not in . We must include + it before we #define perror rpl_perror. */ +/* But in any case avoid namespace pollution on glibc systems. */ +#if (0 || defined GNULIB_POSIXCHECK) \ + && (defined _WIN32 && ! defined __CYGWIN__) \ + && ! defined __GLIBC__ +# include +#endif + +/* MSVC declares 'remove' in , not in . We must include + it before we #define remove rpl_remove. */ +/* MSVC declares 'rename' in , not in . We must include + it before we #define rename rpl_rename. */ +/* But in any case avoid namespace pollution on glibc systems. */ +#if (0 || 0 || defined GNULIB_POSIXCHECK) \ + && (defined _WIN32 && ! defined __CYGWIN__) \ + && ! defined __GLIBC__ +# include +#endif + + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ +/* 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 . */ + +#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(::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(::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((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 , + 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 , + 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 */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ +/* 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 . */ + +/* _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 + +/* The definition of _GL_WARN_ON_USE is copied here. */ +/* 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 . */ + +/* _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 ]], + [getline]) in configure.ac, which potentially defines + HAVE_RAW_DECL_GETLINE + - adding this code to a header that wraps the system : + #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 + +/* 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., + . + 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 0 +# if 0 +# 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 !1 +_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 0 +/* Close STREAM and its underlying file descriptor. */ +# if 0 +# 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 0 +# if 0 +# 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 0 +/* 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 0 +# 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 1 +# if 0 && 0 +# 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 1 +# if 0 && 0 +# 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 0 +# if 0 +# 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 0 || 1 +# if (0 && 0) \ + || (1 && 0 && (0 || 0)) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define fprintf rpl_fprintf +# endif +# define GNULIB_overrides_fprintf 1 +# if 0 || 0 +_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 !0 && 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 0 +/* 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 0 +# 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 !1 +_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 1 +# if 0 && (0 || 0) +# 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 1 +# if 0 && (0 || 0) +# 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 1 +# if 0 && 0 +# 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 0 +# if 0 +# 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 1 +# if 0 && 0 +# 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 0 +# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES +# define _GL_FSEEK_WARN /* Category 2, above. */ +# undef fseek +# endif +# if 0 +# 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 0 +# if !0 && !defined _GL_NO_LARGE_FILES +# define _GL_FSEEK_WARN /* Category 3, above. */ +# undef fseek +# endif +# if 0 +/* 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 ! 1 +_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 0 +# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES +# define _GL_FTELL_WARN /* Category 2, above. */ +# undef ftell +# endif +# if 0 +# 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 0 +# if !0 && !defined _GL_NO_LARGE_FILES +# define _GL_FTELL_WARN /* Category 3, above. */ +# undef ftell +# endif +# if 0 +# 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 ! 1 +_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 1 +# if 0 && (0 || 0) +# 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 + , + 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 1 +# if 0 && 0 +# 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 1 +# if 0 && 0 +# 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 0 +/* 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 0 +# 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 !1 +_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 0 +/* 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 0 +# 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 !1 +_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 1 +_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 0 || 0 +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 0 +# 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 !1 +_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 0 +# 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 !1 +_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 0 +# if !1 +_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 0 +/* 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 0 +# 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 0 +# if 0 +# 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 !1 +_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 0 || 1 +# if (0 && 0) \ + || (1 && 0 && (0 || 0)) +# if defined __GNUC__ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +/* Don't break __attribute__((format(printf,M,N))). */ +# define printf __printf__ +# endif +# if 0 || 0 +_GL_FUNCDECL_RPL_1 (__printf__, int, + (const char *format, ...) + __asm__ ( + _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__ ( + _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 !0 && 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 1 +# if 0 && (0 || 0) +# 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 1 +# if 0 && (0 || 0) +# 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 1 +# if 0 && (0 || 0) +# 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 0 +# if 0 +# 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 0 +# if 0 +# 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 0 +# if 0 +# 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 !1 +_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 1 +# if 0 && 0 +# 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__ ( + _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 0 +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 0 +# if 0 +# 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 0 +/* 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 0 +# 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 !1 +_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 0 +# 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 !1 +_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 0 +# if 0 +# 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 !1 +_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 0 || 1 +# if (0 && 0) \ + || (1 && 0 && (0 || 0)) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define vfprintf rpl_vfprintf +# endif +# define GNULIB_overrides_vfprintf 1 +# if 0 +_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 !0 && 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 0 +# if 0 && 0 +# 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 0 || 1 +# if (0 && 0) \ + || (1 && 0 && (0 || 0)) +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define vprintf rpl_vprintf +# endif +# define GNULIB_overrides_vprintf 1 +# if 0 || 0 +_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 !0 && 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 0 +# if 0 && 0 +# 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 0 +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 /* _GL_STDIO_H */ +#endif /* _GL_STDIO_H */ +#endif diff --git a/third_party/make/lib/stdlib.h b/third_party/make/lib/stdlib.h new file mode 100644 index 00000000000..4d390feece5 --- /dev/null +++ b/third_party/make/lib/stdlib.h @@ -0,0 +1,1626 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A GNU-like . + + 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 . */ + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + + +#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 + +#else +/* Normal invocation convention. */ + +#ifndef _GL_STDLIB_H + +/* The include_next requires a split double-inclusion guard. */ +#include_next + +#ifndef _GL_STDLIB_H +#define _GL_STDLIB_H + +/* NetBSD 5.0 mis-defines NULL. */ +#include + +/* MirBSD 10 defines WEXITSTATUS in , not in . */ +#if 0 && !defined WEXITSTATUS +# include +#endif + +/* Solaris declares getloadavg() in . */ +#if (1 || defined GNULIB_POSIXCHECK) && 0 +/* OpenIndiana has a bug: must be included before + . */ +# include +# include +#endif + +/* Native Windows platforms declare mktemp() in . */ +#if 0 && (defined _WIN32 && ! defined __CYGWIN__) +# include +#endif + +#if 0 + +/* OSF/1 5.1 declares 'struct random_data' in , which is included + from if _REENTRANT is defined. Include it whenever we need + 'struct random_data'. */ +# if 1 +# include +# endif + +# if !1 || 0 || !1 +# include +# endif + +# if !1 +/* Define 'struct random_data'. + But allow multiple gnulib generated 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 (0 || 0 || 0 || 0 || 0 || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !(defined _WIN32 && ! defined __CYGWIN__) +/* On Mac OS X 10.3, only declares mkstemp. */ +/* On Mac OS X 10.5, only declares mkstemps. */ +/* On Mac OS X 10.13, only declares mkostemp and mkostemps. */ +/* On Cygwin 1.7.1, only declares getsubopt. */ +/* But avoid namespace pollution on glibc systems and native Windows. */ +# include +#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. */ +/* 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 . */ + +#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 + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ +/* 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 . */ + +#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(::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(::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((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 , + 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 , + 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 */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ +/* 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 . */ + +/* _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 + +/* The definition of _GL_WARN_ON_USE is copied here. */ +/* 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 . */ + +/* _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 ]], + [getline]) in configure.ac, which potentially defines + HAVE_RAW_DECL_GETLINE + - adding this code to a header that wraps the system : + #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 + + +/* 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 0 +/* Terminate the current process with the given return code, without running + the 'atexit' handlers. */ +# if !1 +_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 0 +/* Parse a signed decimal integer. + Returns the value of the integer. Errors are not detected. */ +# if !1 +_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 0 +# if 0 +# 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 0 +# if 0 +# 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 !1 +_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 1 +/* 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 !0 +_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 0 +/* 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 !1 +_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 0 +/* Change the ownership and access permission of the slave side of the + pseudo-terminal whose master side is specified by FD. */ +# if !1 +_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 1 +# if 0 +# 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 0 +# if 0 +# 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 !1 +_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 0 +/* 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 !1 +_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 0 +/* 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 ) + 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 !1 +_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 0 +/* 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 ) + 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 !1 +_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 0 +/* 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 0 +# 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 ! 1 +_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 0 +/* 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 !1 +_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 0 +/* Return an FD open to the master side of a pseudo-terminal. Flags should + include O_RDWR, and may also include O_NOCTTY. */ +# if !1 +_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 0 +/* Return the pathname of the pseudo-terminal slave associated with + the master FD is open on, or NULL on errors. */ +# if 0 +# 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 !1 +_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 0 +/* 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 0 +# 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 !1 +_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 0 +# if 0 +# 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 0 +/* 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 0 +# 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 !1 +_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 0 +# if !1 +# ifndef RAND_MAX +# define RAND_MAX 2147483647 +# endif +# endif +#endif + + +#if 0 +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 !1 || !1 +_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 0 +# if 0 +# 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 !1 || !1 +_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 0 +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 0 +# if ! 1 +_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 0 +# if 0 +# 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 !1 +_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 0 +/* Test a user response to a question. + Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */ +# if !1 +_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 0 +/* Look up NAME in the environment, returning 0 in insecure situations. */ +# if !1 +_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 0 +/* Set NAME to VALUE in the environment. + If REPLACE is nonzero, overwrite an existing value. */ +# if 0 +# 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 !1 +_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 !(0 && !1) +_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 0 + /* Parse a double from STRING, updating ENDP if appropriate. */ +# if 0 +# 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 !1 +_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 0 + /* Parse a 'long double' from STRING, updating ENDP if appropriate. */ +# if 0 +# 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 !1 +_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 0 +/* 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 !1 +_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 0 +/* 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 !1 +_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 0 +/* Unlock the slave side of the pseudo-terminal whose master side is specified + by FD, so that it can be opened. */ +# if !1 +_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 0 +/* Remove the variable NAME from the environment. */ +# if 0 +# 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 !1 +_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (unsetenv, int, (const char *name)); +# endif +# if !(0 && !1) +_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 0 +# if 0 +# 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 /* _GL_STDLIB_H */ +#endif /* _GL_STDLIB_H */ +#endif diff --git a/third_party/make/lib/string.h b/third_party/make/lib/string.h new file mode 100644 index 00000000000..9c4bda1c744 --- /dev/null +++ b/third_party/make/lib/string.h @@ -0,0 +1,1541 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A GNU-like . + + 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 . */ + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + + +#if defined _GL_ALREADY_INCLUDING_STRING_H +/* Special invocation convention: + - On OS X/NetBSD we have a sequence of nested includes + -> -> "string.h" + In this situation system _chk variants due to -D_FORTIFY_SOURCE + might be used after any replacements defined here. */ + +#include_next + +#else +/* Normal invocation convention. */ + +#ifndef _GL_STRING_H + +#define _GL_ALREADY_INCLUDING_STRING_H + +/* The include_next requires a split double-inclusion guard. */ +#include_next + +#undef _GL_ALREADY_INCLUDING_STRING_H + +#ifndef _GL_STRING_H +#define _GL_STRING_H + +/* NetBSD 5.0 mis-defines NULL. */ +#include + +/* MirBSD defines mbslen as a macro. */ +#if 0 && defined __MirBSD__ +# include +#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 , not in . */ +/* But in any case avoid namespace pollution on glibc systems. */ +#if (0 || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \ + && ! defined __GLIBC__ +# include +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ +/* 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 . */ + +#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(::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(::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((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 , + 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 , + 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 */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ +/* 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 . */ + +/* _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 + +/* The definition of _GL_WARN_ON_USE is copied here. */ +/* 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 . */ + +/* _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 ]], + [getline]) in configure.ac, which potentially defines + HAVE_RAW_DECL_GETLINE + - adding this code to a header that wraps the system : + #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 + + +/* 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 0 +# if ! 1 +_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 0 +# if !1 +_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 0 +# if !1 +_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 0 +# if 0 +# 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 ! 1 +_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 0 +# if 0 +# 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 ! 1 +_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 0 +# if ! 1 +_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 0 +# if ! 1 +_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 0 +# if ! 1 +_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 1 +# if ! 1 +_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 0 +# if 0 +# 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 ! 1 +_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 0 +# if 0 +# 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 ! 1 +_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 0 +# if 0 +# 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 !(1 || 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 0 +# if 0 +# 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 0 +# if 0 +# 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 ! 1 +_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 0 +# if 0 +# 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 ! 1 +_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 0 +# if ! 1 +_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 0 +# if ! 1 +_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 0 +# if 0 +# 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 0 +# if 0 +# 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 ! 1 +_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 0 +# if 0 +# 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 0 || defined GNULIB_POSIXCHECK +# undef strtok_r +# endif +# if ! 1 +_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 0 +/* 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 0 /* 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 0 +/* 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 0 +/* 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 0 +/* 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 0 +/* 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 0 +/* 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 0 +/* 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 0 +/* 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 0 +/* 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 0 +/* 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 0 +/* 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 0 +/* 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 0 +/* 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 0 +/* 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 1 +# if 0 +# 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 0 +# if 0 +# 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 !1 +_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 1 +_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 0 +# if 0 +# 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 ! 1 +_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 0 +# if !1 +_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 /* _GL_STRING_H */ +#endif /* _GL_STRING_H */ +#endif diff --git a/third_party/make/lib/stripslash.c b/third_party/make/lib/stripslash.c index 6818b306141..e147c5d3f88 100644 --- a/third_party/make/lib/stripslash.c +++ b/third_party/make/lib/stripslash.c @@ -16,9 +16,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include +#include "third_party/make/src/config.h" -#include "dirname.h" +#include "third_party/make/lib/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 diff --git a/third_party/make/lib/unistd.c b/third_party/make/lib/unistd.c index 72bad1c0527..7522af39c8b 100644 --- a/third_party/make/lib/unistd.c +++ b/third_party/make/lib/unistd.c @@ -1,4 +1,4 @@ -#include +#include "third_party/make/src/config.h" #define _GL_UNISTD_INLINE _GL_EXTERN_INLINE -#include "unistd.h" +#include "third_party/make/lib/unistd.h" typedef int dummy; diff --git a/third_party/make/lib/unistd.h b/third_party/make/lib/unistd.h new file mode 100644 index 00000000000..16d66ef14b2 --- /dev/null +++ b/third_party/make/lib/unistd.h @@ -0,0 +1,2193 @@ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Substitute for and wrapper around . + 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 . */ + +#ifndef _GL_UNISTD_H + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + + +#if 1 && defined _GL_INCLUDING_UNISTD_H +/* Special invocation convention: + - On Mac OS X 10.3.9 we have a sequence of nested includes + -> -> -> + In this situation, the functions are not yet declared, therefore we cannot + provide the C++ aliases. */ + +#include_next + +#else +/* Normal invocation convention. */ + +/* The include_next requires a split double-inclusion guard. */ +#if 1 +# define _GL_INCLUDING_UNISTD_H +# include_next +# undef _GL_INCLUDING_UNISTD_H +#endif + +/* Get all possible declarations of gethostname(). */ +#if 0 && 0 \ + && !defined _GL_INCLUDING_WINSOCK2_H +# define _GL_INCLUDING_WINSOCK2_H +# include +# undef _GL_INCLUDING_WINSOCK2_H +#endif + +#if !defined _GL_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H +#define _GL_UNISTD_H + +/* NetBSD 5.0 mis-defines NULL. Also get size_t. */ +/* But avoid namespace pollution on glibc systems. */ +#ifndef __GLIBC__ +# include +#endif + +/* mingw doesn't define the SEEK_* or *_FILENO macros in . */ +/* MSVC declares 'unlink' in , not in . We must include + it before we #define unlink rpl_unlink. */ +/* Cygwin 1.7.1 declares symlinkat in , not in . */ +/* But avoid namespace pollution on glibc systems. */ +#if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \ + || ((0 || defined GNULIB_POSIXCHECK) \ + && (defined _WIN32 && ! defined __CYGWIN__)) \ + || ((0 || defined GNULIB_POSIXCHECK) \ + && defined __CYGWIN__)) \ + && ! defined __GLIBC__ +# include +#endif + +/* Cygwin 1.7.1 and Android 4.3 declare unlinkat in , not in + . */ +/* But avoid namespace pollution on glibc systems. */ +#if (0 || defined GNULIB_POSIXCHECK) \ + && (defined __CYGWIN__ || defined __ANDROID__) \ + && ! defined __GLIBC__ +# include +#endif + +/* mingw fails to declare _exit in . */ +/* mingw, MSVC, BeOS, Haiku declare environ in , not in + . */ +/* Solaris declares getcwd not only in but also in . */ +/* OSF Tru64 Unix cannot see gnulib rpl_strtod when system is + included here. */ +/* But avoid namespace pollution on glibc systems. */ +#if !defined __GLIBC__ && !defined __osf__ +# define __need_system_stdlib_h +# include +# undef __need_system_stdlib_h +#endif + +/* Native Windows platforms declare chdir, getcwd, rmdir in + and/or , not in . + They also declare access(), chmod(), close(), dup(), dup2(), isatty(), + lseek(), read(), unlink(), write() in . */ +#if ((0 || 0 || 0 \ + || defined GNULIB_POSIXCHECK) \ + && (defined _WIN32 && ! defined __CYGWIN__)) +# include /* mingw32, mingw64 */ +# include /* mingw64, MSVC 9 */ +#elif (1 || 0 || 1 || 0 \ + || 0 || 0 || 0 || 0 \ + || defined GNULIB_POSIXCHECK) \ + && (defined _WIN32 && ! defined __CYGWIN__) +# include +#endif + +/* AIX and OSF/1 5.1 declare getdomainname in , not in . + NonStop Kernel declares gethostname in , not in . */ +/* But avoid namespace pollution on glibc systems. */ +#if ((0 && (defined _AIX || defined __osf__)) \ + || (0 && defined __TANDEM)) \ + && !defined __GLIBC__ +# include +#endif + +/* Android 4.3 declares fchownat in , not in . */ +/* But avoid namespace pollution on glibc systems. */ +#if (0 || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \ + && !defined __GLIBC__ +# include +#endif + +/* MSVC defines off_t in . + 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 +#endif + +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ +/* 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 . */ + +#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(::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(::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((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 , + 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 , + 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 */ + +/* The definition of _GL_ARG_NONNULL is copied here. */ +/* 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 . */ + +/* _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 + +/* The definition of _GL_WARN_ON_USE is copied here. */ +/* 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 . */ + +/* _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 ]], + [getline]) in configure.ac, which potentially defines + HAVE_RAW_DECL_GETLINE + - adding this code to a header that wraps the system : + #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 + + +/* Get getopt(), optarg, optind, opterr, optopt. */ +#if 0 && !defined _GL_SYSTEM_GETOPT +# include +# include +#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 . */ + +#if 0 && 0 +# if !defined _GL_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 "); + _GL_WARN_ON_USE (connect, + "connect() used without including "); + _GL_WARN_ON_USE (accept, + "accept() used without including "); + _GL_WARN_ON_USE (bind, + "bind() used without including "); + _GL_WARN_ON_USE (getpeername, + "getpeername() used without including "); + _GL_WARN_ON_USE (getsockname, + "getsockname() used without including "); + _GL_WARN_ON_USE (getsockopt, + "getsockopt() used without including "); + _GL_WARN_ON_USE (listen, + "listen() used without including "); + _GL_WARN_ON_USE (recv, + "recv() used without including "); + _GL_WARN_ON_USE (send, + "send() used without including "); + _GL_WARN_ON_USE (recvfrom, + "recvfrom() used without including "); + _GL_WARN_ON_USE (sendto, + "sendto() used without including "); + _GL_WARN_ON_USE (setsockopt, + "setsockopt() used without including "); + _GL_WARN_ON_USE (shutdown, + "shutdown() used without including "); +# endif +# endif +# if !defined _GL_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 "); +# 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 1 +# if 0 +# 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 0 +_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 - " + "use gnulib module chdir for portability"); +# endif +#endif + + +#if 0 +/* 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 + . */ +# if 1 +# 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 !1 +_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 0 +/* Copy the file descriptor OLDFD into file descriptor NEWFD, with the + specified flags. + The flags are a bitmask, possibly including O_CLOEXEC (defined in ) + 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 + . */ +# if 1 +# 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 0 +# 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 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 !1 +/* 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 +# if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR +# define _GL_USE_CRT_EXTERNS +# endif +# endif +# ifdef _GL_USE_CRT_EXTERNS +# include +# 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 0 +/* Like access(), except that it uses the effective user id and group id of + the current process. */ +# if !1 +_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 0 +# if 0 +# 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 !1 +_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 0 +/* 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 + . */ +# if ! 1 +_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 !1 +_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 0 +# if 0 +# 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 !1 +_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 0 +/* Synchronize changes to a file. + Return 0 if successful, otherwise -1 and errno set. + See POSIX:2008 specification + . */ +# if !1 || !1 +_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 0 +/* Synchronize changes, including metadata, to a file. + Return 0 if successful, otherwise -1 and errno set. + See POSIX:2008 specification + . */ +# if !1 +_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 0 +/* 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 + . */ +# if 0 +# 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 !1 +_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 0 +/* 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 + . + 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 0 +# 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 0 +/* 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 0 +# 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 !1 +_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 1 +/* Return the maximum number of file descriptors in the current process. + In POSIX, this is same as sysconf (_SC_OPEN_MAX). */ +# if 0 +# 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 !1 +_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 0 +/* 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 0 +# 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 !1 +_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 0 +/* 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 0 +# 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 !1 +_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 0 +# 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 0 +/* Returns the user's login name, or NULL if it cannot be found. Upon error, + returns NULL with errno set. + + See . + + 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 !1 +_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 0 +/* 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 . + + 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 0 +# 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 !1 +_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 0 +# if 0 +# 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 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 !1 +# 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 && 0 +# include +# 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 && 0 +# include +# 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 1 +_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 0 +/* 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 0 +# 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 !1 +_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 0 +/* Return the next valid login shell on the system, or NULL when the end of + the list has been reached. */ +# if !1 +_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 0 +/* Rewind to pointer that is advanced at each getusershell() call. */ +# if !1 +_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 0 +/* Free the pointer that is advanced at each getusershell() call and + associated resources. */ +# if !1 +_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 0 +/* Determine whether group id is in calling user's group list. */ +# if !1 +_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 0 +# if 0 +# 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 0 +/* 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 + . */ +# if 0 +# 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 !1 +_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 0 +/* Create a new hard link for an existing file. + Return 0 if successful, otherwise -1 and errno set. + See POSIX:2008 specification + . */ +# if 0 +# 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 !1 +_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 0 +/* 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 0 +# 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 !1 +_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 0 +/* 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 + . */ +# if 0 +# 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 0 +/* 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 !1 +_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 0 +/* 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 ) + 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 + . */ +# if 1 +# 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 0 +/* 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 + . */ +# if 0 +# 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 !1 +_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 0 +/* 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 + . */ +# if 0 +# 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 !1 +_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 0 +/* Read up to COUNT bytes from file descriptor FD into the buffer starting + at BUF. See the POSIX:2008 specification + . */ +# if 0 +# 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 0 +/* 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 + . */ +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 !1 +_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 0 +/* Remove the directory DIR. */ +# if 0 +# 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 0 +/* 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 !1 || !1 +_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 0 +/* Pause the execution of the current thread for N seconds. + Returns the number of seconds left to sleep. + See the POSIX:2008 specification + . */ +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 !1 +_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 0 +# if 0 +# 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 !1 +_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 0 +/* 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 + . */ +# if 0 +# 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 !1 +_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 0 +/* 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 0 +# 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 !1 +_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 0 +# if 0 +# 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 0 +# if 0 +# 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 !1 +_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 0 +/* Pause the execution of the current thread for N microseconds. + Returns 0 on completion, or -1 on range error. + See the POSIX:2001 specification + . */ +# if 0 +# 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 !1 +_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 0 +/* Write up to COUNT bytes starting at BUF to file descriptor FD. + See the POSIX:2008 specification + . */ +# if 0 +# 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 /* _GL_UNISTD_H */ +#endif /* _GL_INCLUDING_UNISTD_H */ +#endif /* _GL_UNISTD_H */ diff --git a/third_party/make/lib/xalloc-die.c b/third_party/make/lib/xalloc-die.c index 68559deebb3..4e1909797cf 100644 --- a/third_party/make/lib/xalloc-die.c +++ b/third_party/make/lib/xalloc-die.c @@ -16,16 +16,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include +#include "third_party/make/src/config.h" -#include "xalloc.h" +#include "third_party/make/lib/xalloc.h" #include -#include "error.h" -#include "exitfail.h" +#include "third_party/make/lib/error.h" +#include "third_party/make/lib/exitfail.h" -#include "gettext.h" +#include "third_party/make/src/gettext.h" #define _(msgid) gettext (msgid) void diff --git a/third_party/make/lib/xalloc.h b/third_party/make/lib/xalloc.h index 9563b0bc926..b13b3eae759 100644 --- a/third_party/make/lib/xalloc.h +++ b/third_party/make/lib/xalloc.h @@ -20,8 +20,9 @@ #include #include +#include "libc/limits.h" -#include "xalloc-oversized.h" +#include "third_party/make/lib/xalloc-oversized.h" #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." diff --git a/third_party/make/lib/xconcat-filename.c b/third_party/make/lib/xconcat-filename.c index e04d4337eb6..37986d41c1a 100644 --- a/third_party/make/lib/xconcat-filename.c +++ b/third_party/make/lib/xconcat-filename.c @@ -16,12 +16,12 @@ /* Written by Bruno Haible . */ -#include +#include "third_party/make/src/config.h" /* Specification. */ -#include "concat-filename.h" +#include "third_party/make/lib/concat-filename.h" -#include "xalloc.h" +#include "third_party/make/lib/xalloc.h" /* Concatenate a directory filename, a relative filename and an optional suffix. The directory may end with the directory separator. The second diff --git a/third_party/make/lib/xmalloc.c b/third_party/make/lib/xmalloc.c index 486873602e4..0f36a98aa4f 100644 --- a/third_party/make/lib/xmalloc.c +++ b/third_party/make/lib/xmalloc.c @@ -15,11 +15,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include +#include "third_party/make/src/config.h" #define XALLOC_INLINE _GL_EXTERN_INLINE -#include "xalloc.h" +#include "third_party/make/lib/xalloc.h" #include #include diff --git a/third_party/make/make.mk b/third_party/make/make.mk new file mode 100644 index 00000000000..f1bc878be1b --- /dev/null +++ b/third_party/make/make.mk @@ -0,0 +1,129 @@ +#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐ +#───vi: set et ft=make ts=8 tw=8 fenc=utf-8 :vi───────────────────────┘ + +PKGS += THIRD_PARTY_MAKE + +THIRD_PARTY_MAKE_COMS = \ + o/$(MODE)/third_party/make/make.com + +THIRD_PARTY_MAKE_BINS = \ + $(THIRD_PARTY_MAKE_COMS) \ + $(THIRD_PARTY_MAKE_COMS:%=%.dbg) + +THIRD_PARTY_MAKE_A = \ + o/$(MODE)/third_party/make/make.a + +THIRD_PARTY_MAKE_CHECKS = \ + $(THIRD_PARTY_MAKE_A).pkg + +# libgnu.a recipe +THIRD_PARTY_MAKE_SRCS_LIB = \ + third_party/make/lib/basename-lgpl.c \ + third_party/make/lib/concat-filename.c \ + third_party/make/lib/dirname-lgpl.c \ + third_party/make/lib/dup2.c \ + third_party/make/lib/error.c \ + third_party/make/lib/exitfail.c \ + third_party/make/lib/fcntl.c \ + third_party/make/lib/fd-hook.c \ + third_party/make/lib/findprog-in.c \ + third_party/make/lib/getloadavg.c \ + third_party/make/lib/getprogname.c \ + third_party/make/lib/stripslash.c \ + third_party/make/lib/unistd.c \ + third_party/make/lib/xalloc-die.c \ + third_party/make/lib/xconcat-filename.c \ + third_party/make/lib/xmalloc.c + +THIRD_PARTY_MAKE_SRCS_BASE = \ + third_party/make/src/ar.c \ + third_party/make/src/arscan.c \ + third_party/make/src/commands.c \ + third_party/make/src/default.c \ + third_party/make/src/dir.c \ + third_party/make/src/expand.c \ + third_party/make/src/file.c \ + third_party/make/src/function.c \ + third_party/make/src/getopt.c \ + third_party/make/src/getopt1.c \ + third_party/make/src/guile.c \ + third_party/make/src/hash.c \ + third_party/make/src/implicit.c \ + third_party/make/src/job.c \ + third_party/make/src/load.c \ + third_party/make/src/loadapi.c \ + third_party/make/src/main.c \ + third_party/make/src/misc.c \ + third_party/make/src/output.c \ + third_party/make/src/posixos.c \ + third_party/make/src/read.c \ + third_party/make/src/remake.c \ + third_party/make/src/remote-stub.c \ + third_party/make/src/rule.c \ + third_party/make/src/signame.c \ + third_party/make/src/strcache.c \ + third_party/make/src/variable.c \ + third_party/make/src/version.c \ + third_party/make/src/vpath.c + +THIRD_PARTY_MAKE_SRCS = \ + $(THIRD_PARTY_MAKE_SRCS_BASE) \ + $(THIRD_PARTY_MAKE_SRCS_LIB) + +THIRD_PARTY_MAKE_OBJS = \ + $(THIRD_PARTY_MAKE_SRCS:%.c=o/$(MODE)/%.o) + +THIRD_PARTY_MAKE_DIRECTDEPS = \ + LIBC_CALLS \ + LIBC_FMT \ + LIBC_INTRIN \ + LIBC_LOG \ + LIBC_MEM \ + LIBC_NEXGEN32E \ + LIBC_RUNTIME \ + LIBC_STDIO \ + LIBC_STR \ + LIBC_SYSV \ + LIBC_SYSV_CALLS \ + LIBC_TIME \ + LIBC_X \ + LIBC_TINYMATH \ + LIBC_UNICODE \ + THIRD_PARTY_COMPILER_RT \ + THIRD_PARTY_MUSL \ + THIRD_PARTY_GDTOA + +THIRD_PARTY_MAKE_DEPS := \ + $(call uniq,$(foreach x,$(THIRD_PARTY_MAKE_DIRECTDEPS),$($(x)))) + +$(THIRD_PARTY_MAKE_A).pkg: \ + $(THIRD_PARTY_MAKE_OBJS) \ + $(foreach x,$(THIRD_PARTY_MAKE_DIRECTDEPS),$($(x)_A).pkg) + +$(THIRD_PARTY_MAKE_A): \ + third_party/make/ \ + $(THIRD_PARTY_MAKE_A).pkg \ + $(filter-out %main.o,$(THIRD_PARTY_MAKE_OBJS)) + +o/$(MODE)/third_party/make/make.com.dbg: \ + $(THIRD_PARTY_MAKE_DEPS) \ + $(THIRD_PARTY_MAKE_A) \ + $(THIRD_PARTY_MAKE_A).pkg \ + o/$(MODE)/third_party/make/src/main.o \ + $(CRT) \ + $(APE) + @$(APELINK) + + +$(THIRD_PARTY_MAKE_OBJS): \ + OVERRIDE_CFLAGS += \ + -isystem libc/isystem \ + -DHAVE_CONFIG_H \ + -DINCLUDEDIR=\".\" \ + -DLIBDIR=\".\" \ + -DLOCALEDIR=\".\" + +.PHONY: o/$(MODE)/third_party/make +o/$(MODE)/third_party/make: \ + $(THIRD_PARTY_MAKE_BINS) \ + $(THIRD_PARTY_MAKE_CHECKS) diff --git a/third_party/make/src/ar.c b/third_party/make/src/ar.c index 62919ff398e..f6eb2af2a1a 100644 --- a/third_party/make/src/ar.c +++ b/third_party/make/src/ar.c @@ -15,13 +15,13 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #ifndef NO_ARCHIVES -#include "filedef.h" -#include "dep.h" -#include +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/dep.h" +#include "third_party/musl/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 diff --git a/third_party/make/src/arscan.c b/third_party/make/src/arscan.c index 3b6cfa2e5a6..1b91d2a31f0 100644 --- a/third_party/make/src/arscan.c +++ b/third_party/make/src/arscan.c @@ -14,7 +14,7 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #ifdef TEST /* Hack, the real error() routine eventually pulls in die from main.c */ @@ -376,7 +376,7 @@ struct ar_hdr # define AR_HDR_SIZE (sizeof (struct ar_hdr)) #endif -#include "output.h" +#include "third_party/make/src/output.h" /* Takes three arguments ARCHIVE, FUNCTION and ARG. diff --git a/third_party/make/src/commands.c b/third_party/make/src/commands.c index 88c33a324f3..4523de684f8 100644 --- a/third_party/make/src/commands.c +++ b/third_party/make/src/commands.c @@ -14,15 +14,15 @@ 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 . */ -#include "makeint.h" -#include "filedef.h" -#include "dep.h" -#include "variable.h" -#include "job.h" -#include "commands.h" +#include "third_party/make/src/makeint.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/commands.h" #ifdef WINDOWS32 #include -#include "w32err.h" +// #include "w32err.h" #endif #if VMS diff --git a/third_party/make/src/default.c b/third_party/make/src/default.c index 751ea154e54..1c888cf2a31 100644 --- a/third_party/make/src/default.c +++ b/third_party/make/src/default.c @@ -14,16 +14,16 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #include -#include "filedef.h" -#include "variable.h" -#include "rule.h" -#include "dep.h" -#include "job.h" -#include "commands.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/rule.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/commands.h" /* Define GCC_IS_NATIVE if gcc is the native development environment on your system (gcc/bison/flex vs cc/yacc/lex). */ diff --git a/third_party/make/src/dir.c b/third_party/make/src/dir.c index 4a45ad36078..c84248903e8 100644 --- a/third_party/make/src/dir.c +++ b/third_party/make/src/dir.c @@ -14,10 +14,11 @@ 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 . */ -#include "makeint.h" -#include "hash.h" -#include "filedef.h" -#include "dep.h" +#include "third_party/make/src/makeint.h" +#include "third_party/make/src/hash.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/dep.h" +#include "third_party/musl/glob.h" #ifndef __ptr_t #define __ptr_t void* @@ -119,7 +120,7 @@ dosify (const char *filename) #endif /* __MSDOS__ */ #ifdef WINDOWS32 -#include "pathstuff.h" +//#include "pathstuff.h" #endif #ifdef _AMIGA diff --git a/third_party/make/src/expand.c b/third_party/make/src/expand.c index 0b6bb255f4b..9a45ddb48c6 100644 --- a/third_party/make/src/expand.c +++ b/third_party/make/src/expand.c @@ -14,15 +14,15 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #include -#include "filedef.h" -#include "job.h" -#include "commands.h" -#include "variable.h" -#include "rule.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/commands.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/rule.h" /* Initially, any errors reported when expanding strings will be reported against the file where the error appears. */ diff --git a/third_party/make/src/file.c b/third_party/make/src/file.c index a979ca550e8..5efd523b6dc 100644 --- a/third_party/make/src/file.c +++ b/third_party/make/src/file.c @@ -14,17 +14,17 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #include -#include "filedef.h" -#include "dep.h" -#include "job.h" -#include "commands.h" -#include "variable.h" -#include "debug.h" -#include "hash.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/commands.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/debug.h" +#include "third_party/make/src/hash.h" /* Remember whether snap_deps has been invoked: we need this to be sure we diff --git a/third_party/make/src/filedef.h b/third_party/make/src/filedef.h index 972f85331c4..92c681bab9c 100644 --- a/third_party/make/src/filedef.h +++ b/third_party/make/src/filedef.h @@ -19,7 +19,7 @@ this program. If not, see . */ that the makefile says how to make. All of these are chained together through 'next'. */ -#include "hash.h" +#include "third_party/make/src/hash.h" struct commands; struct dep; diff --git a/third_party/make/src/function.c b/third_party/make/src/function.c index 0917e0cd21b..6ce1973b395 100644 --- a/third_party/make/src/function.c +++ b/third_party/make/src/function.c @@ -14,17 +14,17 @@ 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 . */ -#include "makeint.h" -#include "filedef.h" -#include "variable.h" -#include "dep.h" -#include "job.h" -#include "os.h" -#include "commands.h" -#include "debug.h" +#include "third_party/make/src/makeint.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/os.h" +#include "third_party/make/src/commands.h" +#include "third_party/make/src/debug.h" #ifdef _AMIGA -#include "amiga.h" +#include "third_party/make/src/amiga.h" #endif @@ -1484,7 +1484,7 @@ shell_completed (int exit_code, int exit_sig) #include #include -#include "sub_proc.h" +// #include "sub_proc.h" int diff --git a/third_party/make/src/getopt.c b/third_party/make/src/getopt.c index 35e71ef8cfc..d370e29c796 100644 --- a/third_party/make/src/getopt.c +++ b/third_party/make/src/getopt.c @@ -27,8 +27,9 @@ this program. If not, see . */ #endif #ifdef HAVE_CONFIG_H -# include +# include "third_party/make/src/config.h" #endif +#pragma GCC diagnostic ignored "-Wredundant-decls" #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems @@ -77,7 +78,7 @@ this program. If not, see . */ /* This is for other GNU distributions with internationalized messages. When compiling libc, the _ macro is predefined. */ -#include "gettext.h" +#include "third_party/make/src/gettext.h" #define _(msgid) gettext (msgid) @@ -95,7 +96,7 @@ this program. If not, see . */ 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" +#include "third_party/make/src/getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, diff --git a/third_party/make/src/getopt.h b/third_party/make/src/getopt.h index cd033ea94ca..f3282c41525 100644 --- a/third_party/make/src/getopt.h +++ b/third_party/make/src/getopt.h @@ -16,6 +16,7 @@ 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 . */ +#include "third_party/getopt/getopt.h" #ifndef _GETOPT_H #if 0 && !defined(_GETOPT_H) #define _GETOPT_H 1 diff --git a/third_party/make/src/getopt1.c b/third_party/make/src/getopt1.c index 0bef6b03cc0..f741bfc25db 100644 --- a/third_party/make/src/getopt1.c +++ b/third_party/make/src/getopt1.c @@ -17,10 +17,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifdef HAVE_CONFIG_H -#include +#include "third_party/make/src/config.h" #endif -#include "getopt.h" +#include "third_party/make/src/getopt.h" #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems diff --git a/third_party/make/src/guile.c b/third_party/make/src/guile.c index 52f0e5cbb89..647cc23fffb 100644 --- a/third_party/make/src/guile.c +++ b/third_party/make/src/guile.c @@ -14,16 +14,16 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #ifdef HAVE_GUILE -#include "gnumake.h" +#include "third_party/make/src/gnumake.h" -#include "debug.h" -#include "filedef.h" -#include "dep.h" -#include "variable.h" +#include "third_party/make/src/debug.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/variable.h" #include @@ -82,7 +82,7 @@ static void guile_define_module (void *data UNUSED) { /* Ingest the predefined Guile module for GNU make. */ -#include "gmk-default.h" +#include "third_party/make/src/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); diff --git a/third_party/make/src/hash.c b/third_party/make/src/hash.c index 004097d0aa2..082b666e110 100644 --- a/third_party/make/src/hash.c +++ b/third_party/make/src/hash.c @@ -14,8 +14,8 @@ 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 . */ -#include "makeint.h" -#include "hash.h" +#include "third_party/make/src/makeint.h" +#include "third_party/make/src/hash.h" #include #define CALLOC(t, n) ((t *) xcalloc (sizeof (t) * (n))) diff --git a/third_party/make/src/implicit.c b/third_party/make/src/implicit.c index b281a1777f1..643687f0463 100644 --- a/third_party/make/src/implicit.c +++ b/third_party/make/src/implicit.c @@ -14,14 +14,14 @@ 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 . */ -#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 */ +#include "third_party/make/src/makeint.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/rule.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/debug.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/job.h" /* struct child, used inside commands.h */ +#include "third_party/make/src/commands.h" /* set_file_variables */ static int pattern_search (struct file *file, int archive, unsigned int depth, unsigned int recursions); diff --git a/third_party/make/src/job.c b/third_party/make/src/job.c index 9f9074f22bc..a1866df3dde 100644 --- a/third_party/make/src/job.c +++ b/third_party/make/src/job.c @@ -14,17 +14,17 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #include #include -#include "job.h" -#include "debug.h" -#include "filedef.h" -#include "commands.h" -#include "variable.h" -#include "os.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/debug.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/commands.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/os.h" /* Default shell to use. */ #ifdef WINDOWS32 @@ -111,9 +111,9 @@ static void vmsWaitForChildren (int *); # include # include # include -# include "sub_proc.h" -# include "w32err.h" -# include "pathstuff.h" +// # include "sub_proc.h" +// # include "w32err.h" +// # include "pathstuff.h" # define WAIT_NOHANG 1 #endif /* WINDOWS32 */ diff --git a/third_party/make/src/job.h b/third_party/make/src/job.h index ee290fb4aea..8308b64280b 100644 --- a/third_party/make/src/job.h +++ b/third_party/make/src/job.h @@ -14,7 +14,7 @@ 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 . */ -#include "output.h" +#include "third_party/make/src/output.h" /* Structure describing a running or dead child process. */ diff --git a/third_party/make/src/load.c b/third_party/make/src/load.c index 27f5899f820..6a98aaa0d4e 100644 --- a/third_party/make/src/load.c +++ b/third_party/make/src/load.c @@ -14,21 +14,21 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #if MAKE_LOAD #include #include #include -#include +#include "libc/runtime/dlfcn.h" #include #define SYMBOL_EXTENSION "_gmk_setup" -#include "debug.h" -#include "filedef.h" -#include "variable.h" +#include "third_party/make/src/debug.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/variable.h" /* Tru64 V4.0 does not have this flag */ #ifndef RTLD_GLOBAL diff --git a/third_party/make/src/loadapi.c b/third_party/make/src/loadapi.c index 4914b2d919c..1c8de10b722 100644 --- a/third_party/make/src/loadapi.c +++ b/third_party/make/src/loadapi.c @@ -14,11 +14,11 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" -#include "filedef.h" -#include "variable.h" -#include "dep.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/dep.h" /* Allocate a buffer in our context, so we can free it. */ char * diff --git a/third_party/make/src/main.c b/third_party/make/src/main.c index 78a27d7130e..d7e9bebec5c 100644 --- a/third_party/make/src/main.c +++ b/third_party/make/src/main.c @@ -14,16 +14,19 @@ 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 . */ -#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 "third_party/make/src/makeint.h" +#include "third_party/make/src/os.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/commands.h" +#include "third_party/make/src/rule.h" +#include "third_party/make/src/debug.h" +#include "third_party/make/src/getopt.h" + +#include "libc/sysv/consts/sa.h" +#include "third_party/gdtoa/gdtoa.h" #include #ifdef _AMIGA @@ -36,9 +39,9 @@ this program. If not, see . */ #ifdef HAVE_STRINGS_H # include /* for strcasecmp */ #endif -# include "pathstuff.h" -# include "sub_proc.h" -# include "w32err.h" +// # include "pathstuff.h" +// # include "sub_proc.h" +// # include "w32err.h" #endif #ifdef __EMX__ # include diff --git a/third_party/make/src/makeint.h b/third_party/make/src/makeint.h index f84e4deba28..142ff300c7c 100644 --- a/third_party/make/src/makeint.h +++ b/third_party/make/src/makeint.h @@ -17,7 +17,8 @@ this program. If not, see . */ /* We use 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 +#include "third_party/make/src/config.h" +#pragma GCC diagnostic ignored "-Wredundant-decls" #undef HAVE_CONFIG_H #define HAVE_CONFIG_H 1 @@ -54,7 +55,7 @@ char *alloca (); #ifdef WINDOWS32 # define GMK_BUILDING_MAKE #endif -#include "gnumake.h" +#include "third_party/make/src/gnumake.h" #ifdef CRAY /* This must happen before #include so @@ -92,7 +93,7 @@ char *alloca (); #include -#ifndef errno +#if 0 && !defined(errno) extern int errno; #endif @@ -143,7 +144,7 @@ extern int errno; # include #endif #ifdef HAVE_SYS_PARAM_H -# include +// # include #endif #ifndef PATH_MAX @@ -344,7 +345,7 @@ extern mode_t umask (mode_t); # define setlocale(category, locale) #endif -#include +#include "third_party/make/src/gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) gettext_noop (msgid) @@ -460,7 +461,7 @@ extern int unixy_shell; extern struct rlimit stack_limit; #endif -#include +#include "third_party/musl/glob.h" #define NILF ((floc *)0) @@ -512,6 +513,9 @@ void out_of_memory () NORETURN; #define ONS(_t,_a,_f,_n,_s) _t((_a), INTSTR_LENGTH + strlen (_s), \ (_f), (_n), (_s)) +#include "libc/x/x.h" +#include "libc/time/struct/tm.h" + void die (int) NORETURN; void pfatal_with_name (const char *) NORETURN; void perror_with_name (const char *, const char *); diff --git a/third_party/make/src/misc.c b/third_party/make/src/misc.c index 1973025eb29..3f6e57d05aa 100644 --- a/third_party/make/src/misc.c +++ b/third_party/make/src/misc.c @@ -14,10 +14,11 @@ 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 . */ -#include "makeint.h" -#include "filedef.h" -#include "dep.h" -#include "debug.h" +#include "third_party/make/src/makeint.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/debug.h" +#include "libc/calls/calls.h" /* GNU make no longer supports pre-ANSI89 environments. */ diff --git a/third_party/make/src/output.c b/third_party/make/src/output.c index 221174963d7..2f10ebf2e5c 100644 --- a/third_party/make/src/output.c +++ b/third_party/make/src/output.c @@ -14,9 +14,10 @@ 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 . */ -#include "makeint.h" -#include "os.h" -#include "output.h" +#include "third_party/make/src/makeint.h" +#include "third_party/make/src/os.h" +#include "third_party/make/src/output.h" +#include "libc/calls/struct/flock.h" /* GNU make no longer supports pre-ANSI89 environments. */ @@ -37,7 +38,7 @@ this program. If not, see . */ #ifdef WINDOWS32 # include # include -# include "sub_proc.h" +// # include "sub_proc.h" #endif /* WINDOWS32 */ struct output *output_context = NULL; diff --git a/third_party/make/src/posixos.c b/third_party/make/src/posixos.c index 525f292c99c..d5317ba5f48 100644 --- a/third_party/make/src/posixos.c +++ b/third_party/make/src/posixos.c @@ -14,7 +14,8 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" +#include "libc/sysv/consts/sa.h" #include @@ -28,9 +29,9 @@ this program. If not, see . */ # include #endif -#include "debug.h" -#include "job.h" -#include "os.h" +#include "third_party/make/src/debug.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/os.h" #ifdef MAKE_JOBSERVER diff --git a/third_party/make/src/read.c b/third_party/make/src/read.c index 6d54fb60667..c0943fbae7d 100644 --- a/third_party/make/src/read.c +++ b/third_party/make/src/read.c @@ -14,25 +14,25 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #include -#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" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/os.h" +#include "third_party/make/src/commands.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/rule.h" +#include "third_party/make/src/debug.h" +#include "third_party/make/src/hash.h" # define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions. */ #ifdef WINDOWS32 #include -#include "sub_proc.h" +// #include "sub_proc.h" #else /* !WINDOWS32 */ #ifndef _AMIGA #ifndef VMS diff --git a/third_party/make/src/remake.c b/third_party/make/src/remake.c index fb237c5e2c3..7d90e9f1420 100644 --- a/third_party/make/src/remake.c +++ b/third_party/make/src/remake.c @@ -14,13 +14,13 @@ 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 . */ -#include "makeint.h" -#include "filedef.h" -#include "job.h" -#include "commands.h" -#include "dep.h" -#include "variable.h" -#include "debug.h" +#include "third_party/make/src/makeint.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/commands.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/debug.h" #include diff --git a/third_party/make/src/remote-stub.c b/third_party/make/src/remote-stub.c index 05ab336db9d..1198f0bb433 100644 --- a/third_party/make/src/remote-stub.c +++ b/third_party/make/src/remote-stub.c @@ -14,10 +14,10 @@ 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 . */ -#include "makeint.h" -#include "filedef.h" -#include "job.h" -#include "commands.h" +#include "third_party/make/src/makeint.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/commands.h" char *remote_description = 0; diff --git a/third_party/make/src/rule.c b/third_party/make/src/rule.c index 7efca58bc61..e3058a3678c 100644 --- a/third_party/make/src/rule.c +++ b/third_party/make/src/rule.c @@ -14,16 +14,16 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #include -#include "filedef.h" -#include "dep.h" -#include "job.h" -#include "commands.h" -#include "variable.h" -#include "rule.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/commands.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/rule.h" static void freerule (struct rule *rule, struct rule *lastrule); diff --git a/third_party/make/src/signame.c b/third_party/make/src/signame.c index 77bae3b6bb6..816ea04b4b7 100644 --- a/third_party/make/src/signame.c +++ b/third_party/make/src/signame.c @@ -14,7 +14,7 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" /* If the system provides strsignal, we don't need it. */ diff --git a/third_party/make/src/strcache.c b/third_party/make/src/strcache.c index cee9d093808..bf5ff0aef01 100644 --- a/third_party/make/src/strcache.c +++ b/third_party/make/src/strcache.c @@ -14,12 +14,12 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #include #include -#include "hash.h" +#include "third_party/make/src/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 diff --git a/third_party/make/src/variable.c b/third_party/make/src/variable.c index e3796224fcb..3bd0d91623b 100644 --- a/third_party/make/src/variable.c +++ b/third_party/make/src/variable.c @@ -14,20 +14,20 @@ 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 . */ -#include "makeint.h" +#include "third_party/make/src/makeint.h" #include -#include "filedef.h" -#include "dep.h" -#include "job.h" -#include "commands.h" -#include "variable.h" -#include "rule.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/dep.h" +#include "third_party/make/src/job.h" +#include "third_party/make/src/commands.h" +#include "third_party/make/src/variable.h" +#include "third_party/make/src/rule.h" #ifdef WINDOWS32 -#include "pathstuff.h" +// #include "pathstuff.h" #endif -#include "hash.h" +#include "third_party/make/src/hash.h" /* Incremented every time we add or remove a global variable. */ static unsigned long variable_changenum; diff --git a/third_party/make/src/variable.h b/third_party/make/src/variable.h index e8cba4fd260..9ae665b180a 100644 --- a/third_party/make/src/variable.h +++ b/third_party/make/src/variable.h @@ -14,7 +14,7 @@ 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 . */ -#include "hash.h" +#include "third_party/make/src/hash.h" /* Codes in a variable definition saying where the definition came from. Increasing numeric values signify less-overridable definitions. */ diff --git a/third_party/make/src/version.c b/third_party/make/src/version.c index 36fad60d62c..2ad36edbff4 100644 --- a/third_party/make/src/version.c +++ b/third_party/make/src/version.c @@ -17,7 +17,7 @@ this program. If not, see . */ /* We use 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 +#include "third_party/make/src/config.h" #ifndef MAKE_HOST # define MAKE_HOST "unknown" diff --git a/third_party/make/src/vpath.c b/third_party/make/src/vpath.c index d4e7dc73f7b..618aaaf96c1 100644 --- a/third_party/make/src/vpath.c +++ b/third_party/make/src/vpath.c @@ -14,11 +14,11 @@ 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 . */ -#include "makeint.h" -#include "filedef.h" -#include "variable.h" +#include "third_party/make/src/makeint.h" +#include "third_party/make/src/filedef.h" +#include "third_party/make/src/variable.h" #ifdef WINDOWS32 -#include "pathstuff.h" +// #include "pathstuff.h" #endif diff --git a/third_party/third_party.mk b/third_party/third_party.mk index 2401c23f7c6..fbeee7a1376 100644 --- a/third_party/third_party.mk +++ b/third_party/third_party.mk @@ -15,6 +15,7 @@ o/$(MODE)/third_party: \ o/$(MODE)/third_party/lua \ o/$(MODE)/third_party/lz4cli \ o/$(MODE)/third_party/mbedtls \ + o/$(MODE)/third_party/make \ o/$(MODE)/third_party/musl \ o/$(MODE)/third_party/python \ o/$(MODE)/third_party/quickjs \