From 9de84c07c0648cde63bfcd2769b07faf86668e1a Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Sun, 5 Oct 2014 16:25:56 +0000 Subject: Imported from /home/lorry/working-area/delta_make-tarball/make-4.1.tar.bz2. --- ABOUT-NLS | 1282 +++ AUTHORS | 88 + COPYING | 674 ++ INSTALL | 231 + Makefile.DOS | 818 ++ Makefile.am | 204 + Makefile.ami | 308 + Makefile.in | 1280 +++ NEWS | 1235 +++ NMakefile | 360 + README | 178 + README.Amiga | 77 + README.DOS | 340 + README.OS2 | 176 + README.VMS | 284 + README.W32 | 309 + README.customs | 112 + SCOPTIONS | 13 + SMakefile | 449 + acinclude.m4 | 132 + aclocal.m4 | 1435 +++ alloca.c | 503 + amiga.c | 117 + amiga.h | 18 + ar.c | 328 + arscan.c | 961 ++ build.sh.in | 81 + build_w32.bat | 310 + commands.c | 712 ++ commands.h | 41 + config.ami | 337 + config.h-vms | 432 + config.h.W32 | 532 + config.h.in | 469 + config/Makefile.am | 18 + config/Makefile.in | 455 + config/ar-lib | 270 + config/compile | 347 + config/config.guess | 1420 +++ config/config.rpath | 672 ++ config/config.sub | 1805 ++++ config/depcomp | 791 ++ config/dospaths.m4 | 33 + config/gettext.m4 | 383 + config/iconv.m4 | 214 + config/install-sh | 527 + config/intlmacosx.m4 | 51 + config/lib-ld.m4 | 110 + config/lib-link.m4 | 774 ++ config/lib-prefix.m4 | 224 + config/mdate-sh | 224 + config/missing | 215 + config/nls.m4 | 32 + config/po.m4 | 449 + config/progtest.m4 | 92 + config/texinfo.tex | 10174 ++++++++++++++++++ configh.dos | 113 + configure | 12904 +++++++++++++++++++++++ configure.ac | 525 + configure.bat | 60 + debug.h | 37 + default.c | 663 ++ dep.h | 92 + dir.c | 1234 +++ doc/Makefile.am | 24 + doc/Makefile.in | 793 ++ doc/fdl.texi | 505 + doc/make-stds.texi | 1172 ++ doc/make.info | 200 + doc/make.info-1 | 7316 +++++++++++++ doc/make.info-2 | 5884 +++++++++++ doc/make.texi | 12556 ++++++++++++++++++++++ doc/stamp-vti | 4 + doc/version.texi | 4 + dosbuild.bat | 65 + expand.c | 596 ++ file.c | 1141 ++ filedef.h | 209 + function.c | 2623 +++++ getloadavg.c | 1026 ++ getopt.c | 1026 ++ getopt.h | 130 + getopt1.c | 176 + gettext.h | 57 + glob/COPYING.LIB | 481 + glob/ChangeLog | 191 + glob/Makefile.am | 30 + glob/Makefile.ami | 67 + glob/Makefile.in | 589 ++ glob/SCOPTIONS | 13 + glob/SMakefile | 67 + glob/configure.bat | 43 + glob/fnmatch.c | 489 + glob/fnmatch.h | 85 + glob/glob.c | 1432 +++ glob/glob.h | 210 + gmk-default.h | 28 + gmk-default.scm | 53 + gnumake.h | 79 + guile.c | 159 + hash.c | 330 + hash.h | 234 + implicit.c | 998 ++ job.c | 3677 +++++++ job.h | 159 + load.c | 255 + loadapi.c | 70 + main.c | 3455 ++++++ make.1 | 381 + make.lnk | 5 + make_msvc_net2003.sln | 21 + make_msvc_net2003.vcproj | 337 + makefile.com | 163 + makefile.vms | 173 + makeint.h | 714 ++ misc.c | 726 ++ output.c | 723 ++ output.h | 51 + po/LINGUAS | 5 + po/Makefile.in.in | 444 + po/Makevars | 59 + po/POTFILES.in | 45 + po/Rules-quot | 47 + po/be.gmo | Bin 0 -> 7250 bytes po/be.po | 2192 ++++ po/boldquot.sed | 10 + po/cs.gmo | Bin 0 -> 44904 bytes po/cs.po | 2312 ++++ po/da.gmo | Bin 0 -> 24537 bytes po/da.po | 2360 +++++ po/de.gmo | Bin 0 -> 46111 bytes po/de.po | 2470 +++++ po/en@boldquot.header | 25 + po/en@quot.header | 22 + po/es.gmo | Bin 0 -> 45174 bytes po/es.po | 2787 +++++ po/fi.gmo | Bin 0 -> 19871 bytes po/fi.po | 2312 ++++ po/fr.gmo | Bin 0 -> 44572 bytes po/fr.po | 2602 +++++ po/ga.gmo | Bin 0 -> 20299 bytes po/ga.po | 2323 ++++ po/gl.gmo | Bin 0 -> 23164 bytes po/gl.po | 2604 +++++ po/he.gmo | Bin 0 -> 11497 bytes po/he.po | 2362 +++++ po/hr.gmo | Bin 0 -> 25498 bytes po/hr.po | 2427 +++++ po/id.gmo | Bin 0 -> 42957 bytes po/id.po | 2395 +++++ po/insert-header.sin | 23 + po/it.gmo | Bin 0 -> 44464 bytes po/it.po | 2330 ++++ po/ja.gmo | Bin 0 -> 48160 bytes po/ja.po | 2330 ++++ po/ko.gmo | Bin 0 -> 46044 bytes po/ko.po | 2261 ++++ po/lt.gmo | Bin 0 -> 7400 bytes po/lt.po | 2186 ++++ po/make.pot | 2112 ++++ po/nl.gmo | Bin 0 -> 43672 bytes po/nl.po | 2334 ++++ po/pl.gmo | Bin 0 -> 43817 bytes po/pl.po | 2259 ++++ po/pt_BR.gmo | Bin 0 -> 25254 bytes po/pt_BR.po | 2341 ++++ po/quot.sed | 6 + po/remove-potcdate.sin | 19 + po/ru.gmo | Bin 0 -> 55757 bytes po/ru.po | 2327 ++++ po/stamp-po | 1 + po/sv.gmo | Bin 0 -> 42718 bytes po/sv.po | 2251 ++++ po/tr.gmo | Bin 0 -> 20668 bytes po/tr.po | 2396 +++++ po/uk.gmo | Bin 0 -> 55097 bytes po/uk.po | 2276 ++++ po/vi.gmo | Bin 0 -> 46511 bytes po/vi.po | 2312 ++++ po/zh_CN.gmo | Bin 0 -> 19093 bytes po/zh_CN.po | 2373 +++++ read.c | 3354 ++++++ remake.c | 1703 +++ remote-cstms.c | 300 + remote-stub.c | 99 + rule.c | 533 + rule.h | 57 + signame.c | 254 + strcache.c | 291 + subproc.bat | 23 + tests/COPYING | 674 ++ tests/ChangeLog.1 | 1429 +++ tests/NEWS | 178 + tests/README | 102 + tests/config-flags.pm | 19 + tests/config-flags.pm.in | 19 + tests/config_flags_pm.com | 53 + tests/guile.supp | 31 + tests/mkshadow | 57 + tests/run_make_tests | 2 + tests/run_make_tests.com | 272 + tests/run_make_tests.pl | 491 + tests/scripts/features/archives | 97 + tests/scripts/features/comments | 35 + tests/scripts/features/conditionals | 146 + tests/scripts/features/default_names | 44 + tests/scripts/features/double_colon | 164 + tests/scripts/features/echoing | 64 + tests/scripts/features/errors | 95 + tests/scripts/features/escape | 74 + tests/scripts/features/export | 186 + tests/scripts/features/include | 179 + tests/scripts/features/jobserver | 61 + tests/scripts/features/load | 110 + tests/scripts/features/loadapi | 116 + tests/scripts/features/mult_rules | 78 + tests/scripts/features/mult_targets | 46 + tests/scripts/features/order_only | 118 + tests/scripts/features/output-sync | 341 + tests/scripts/features/override | 45 + tests/scripts/features/parallelism | 216 + tests/scripts/features/patspecific_vars | 148 + tests/scripts/features/patternrules | 225 + tests/scripts/features/quoting | 32 + tests/scripts/features/recursion | 55 + tests/scripts/features/reinvoke | 80 + tests/scripts/features/rule_glob | 37 + tests/scripts/features/se_explicit | 167 + tests/scripts/features/se_implicit | 260 + tests/scripts/features/se_statpat | 107 + tests/scripts/features/shell_assignment | 65 + tests/scripts/features/statipattrules | 111 + tests/scripts/features/targetvars | 273 + tests/scripts/features/utf8 | 11 + tests/scripts/features/varnesting | 35 + tests/scripts/features/vpath | 81 + tests/scripts/features/vpath2 | 45 + tests/scripts/features/vpath3 | 35 + tests/scripts/features/vpathgpath | 66 + tests/scripts/features/vpathplus | 129 + tests/scripts/functions/abspath | 81 + tests/scripts/functions/addprefix | 44 + tests/scripts/functions/addsuffix | 36 + tests/scripts/functions/andor | 50 + tests/scripts/functions/basename | 44 + tests/scripts/functions/call | 110 + tests/scripts/functions/dir | 44 + tests/scripts/functions/error | 73 + tests/scripts/functions/eval | 169 + tests/scripts/functions/file | 118 + tests/scripts/functions/filter-out | 42 + tests/scripts/functions/findstring | 47 + tests/scripts/functions/flavor | 44 + tests/scripts/functions/foreach | 77 + tests/scripts/functions/guile | 99 + tests/scripts/functions/if | 33 + tests/scripts/functions/join | 44 + tests/scripts/functions/notdir | 44 + tests/scripts/functions/origin | 51 + tests/scripts/functions/realpath | 82 + tests/scripts/functions/shell | 32 + tests/scripts/functions/sort | 47 + tests/scripts/functions/strip | 57 + tests/scripts/functions/substitution | 38 + tests/scripts/functions/suffix | 57 + tests/scripts/functions/value | 30 + tests/scripts/functions/warning | 65 + tests/scripts/functions/wildcard | 103 + tests/scripts/functions/word | 167 + tests/scripts/misc/bs-nl | 129 + tests/scripts/misc/close_stdout | 9 + tests/scripts/misc/fopen-fail | 15 + tests/scripts/misc/general1 | 51 + tests/scripts/misc/general2 | 50 + tests/scripts/misc/general3 | 313 + tests/scripts/misc/general4 | 82 + tests/scripts/misc/utf8 | 14 + tests/scripts/options/dash-B | 85 + tests/scripts/options/dash-C | 71 + tests/scripts/options/dash-I | 59 + tests/scripts/options/dash-W | 88 + tests/scripts/options/dash-e | 24 + tests/scripts/options/dash-f | 85 + tests/scripts/options/dash-k | 115 + tests/scripts/options/dash-l | 56 + tests/scripts/options/dash-n | 100 + tests/scripts/options/dash-q | 77 + tests/scripts/options/dash-t | 58 + tests/scripts/options/eval | 29 + tests/scripts/options/general | 35 + tests/scripts/options/print-directory | 33 + tests/scripts/options/symlinks | 68 + tests/scripts/options/warn-undefined-variables | 25 + tests/scripts/targets/DEFAULT | 53 + tests/scripts/targets/FORCE | 40 + tests/scripts/targets/INTERMEDIATE | 108 + tests/scripts/targets/ONESHELL | 88 + tests/scripts/targets/PHONY | 54 + tests/scripts/targets/POSIX | 57 + tests/scripts/targets/SECONDARY | 190 + tests/scripts/targets/SILENT | 42 + tests/scripts/targets/clean | 50 + tests/scripts/test_template | 29 + tests/scripts/variables/CURDIR | 20 + tests/scripts/variables/DEFAULT_GOAL | 87 + tests/scripts/variables/GNUMAKEFLAGS | 42 + tests/scripts/variables/INCLUDE_DIRS | 46 + tests/scripts/variables/LIBPATTERNS | 38 + tests/scripts/variables/MAKE | 24 + tests/scripts/variables/MAKECMDGOALS | 52 + tests/scripts/variables/MAKEFILES | 53 + tests/scripts/variables/MAKEFLAGS | 41 + tests/scripts/variables/MAKELEVEL | 33 + tests/scripts/variables/MAKE_RESTARTS | 62 + tests/scripts/variables/MFILE_LIST | 30 + tests/scripts/variables/SHELL | 103 + tests/scripts/variables/automatic | 122 + tests/scripts/variables/define | 282 + tests/scripts/variables/flavors | 96 + tests/scripts/variables/negative | 46 + tests/scripts/variables/private | 122 + tests/scripts/variables/special | 141 + tests/scripts/variables/undefine | 73 + tests/test_driver.pl | 1474 +++ variable.c | 1772 ++++ variable.h | 236 + version.c | 33 + vmsdir.h | 76 + vmsfunctions.c | 226 + vmsify.c | 1005 ++ vmsjobs.c | 928 ++ vpath.c | 617 ++ w32/Makefile.am | 25 + w32/Makefile.in | 696 ++ w32/compat/dirent.c | 206 + w32/compat/posixfcn.c | 486 + w32/include/dirent.h | 59 + w32/include/dlfcn.h | 29 + w32/include/pathstuff.h | 25 + w32/include/sub_proc.h | 71 + w32/include/w32err.h | 26 + w32/pathstuff.c | 266 + w32/subproc/NMakefile | 60 + w32/subproc/build.bat | 34 + w32/subproc/misc.c | 83 + w32/subproc/proc.h | 29 + w32/subproc/sub_proc.c | 1561 +++ w32/subproc/w32err.c | 85 + 348 files changed, 193718 insertions(+) create mode 100644 ABOUT-NLS create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 INSTALL create mode 100644 Makefile.DOS create mode 100644 Makefile.am create mode 100644 Makefile.ami create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 NMakefile create mode 100644 README create mode 100644 README.Amiga create mode 100644 README.DOS create mode 100644 README.OS2 create mode 100644 README.VMS create mode 100644 README.W32 create mode 100644 README.customs create mode 100644 SCOPTIONS create mode 100644 SMakefile create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100644 alloca.c create mode 100644 amiga.c create mode 100644 amiga.h create mode 100644 ar.c create mode 100644 arscan.c create mode 100755 build.sh.in create mode 100644 build_w32.bat create mode 100644 commands.c create mode 100644 commands.h create mode 100644 config.ami create mode 100644 config.h-vms create mode 100644 config.h.W32 create mode 100644 config.h.in create mode 100644 config/Makefile.am create mode 100644 config/Makefile.in create mode 100755 config/ar-lib create mode 100755 config/compile create mode 100644 config/config.guess create mode 100755 config/config.rpath create mode 100644 config/config.sub create mode 100755 config/depcomp create mode 100644 config/dospaths.m4 create mode 100644 config/gettext.m4 create mode 100644 config/iconv.m4 create mode 100755 config/install-sh create mode 100644 config/intlmacosx.m4 create mode 100644 config/lib-ld.m4 create mode 100644 config/lib-link.m4 create mode 100644 config/lib-prefix.m4 create mode 100755 config/mdate-sh create mode 100755 config/missing create mode 100644 config/nls.m4 create mode 100644 config/po.m4 create mode 100644 config/progtest.m4 create mode 100644 config/texinfo.tex create mode 100644 configh.dos create mode 100755 configure create mode 100644 configure.ac create mode 100644 configure.bat create mode 100644 debug.h create mode 100644 default.c create mode 100644 dep.h create mode 100644 dir.c create mode 100644 doc/Makefile.am create mode 100644 doc/Makefile.in create mode 100644 doc/fdl.texi create mode 100644 doc/make-stds.texi create mode 100644 doc/make.info create mode 100644 doc/make.info-1 create mode 100644 doc/make.info-2 create mode 100644 doc/make.texi create mode 100644 doc/stamp-vti create mode 100644 doc/version.texi create mode 100644 dosbuild.bat create mode 100644 expand.c create mode 100644 file.c create mode 100644 filedef.h create mode 100644 function.c create mode 100644 getloadavg.c create mode 100644 getopt.c create mode 100644 getopt.h create mode 100644 getopt1.c create mode 100644 gettext.h create mode 100644 glob/COPYING.LIB create mode 100644 glob/ChangeLog create mode 100644 glob/Makefile.am create mode 100644 glob/Makefile.ami create mode 100644 glob/Makefile.in create mode 100644 glob/SCOPTIONS create mode 100644 glob/SMakefile create mode 100644 glob/configure.bat create mode 100644 glob/fnmatch.c create mode 100644 glob/fnmatch.h create mode 100644 glob/glob.c create mode 100644 glob/glob.h create mode 100644 gmk-default.h create mode 100644 gmk-default.scm create mode 100644 gnumake.h create mode 100644 guile.c create mode 100644 hash.c create mode 100644 hash.h create mode 100644 implicit.c create mode 100644 job.c create mode 100644 job.h create mode 100644 load.c create mode 100644 loadapi.c create mode 100644 main.c create mode 100644 make.1 create mode 100644 make.lnk create mode 100644 make_msvc_net2003.sln create mode 100644 make_msvc_net2003.vcproj create mode 100644 makefile.com create mode 100644 makefile.vms create mode 100644 makeint.h create mode 100644 misc.c create mode 100644 output.c create mode 100644 output.h create mode 100644 po/LINGUAS create mode 100644 po/Makefile.in.in create mode 100644 po/Makevars create mode 100644 po/POTFILES.in create mode 100644 po/Rules-quot create mode 100644 po/be.gmo create mode 100644 po/be.po create mode 100644 po/boldquot.sed create mode 100644 po/cs.gmo create mode 100644 po/cs.po create mode 100644 po/da.gmo create mode 100644 po/da.po create mode 100644 po/de.gmo create mode 100644 po/de.po create mode 100644 po/en@boldquot.header create mode 100644 po/en@quot.header create mode 100644 po/es.gmo create mode 100644 po/es.po create mode 100644 po/fi.gmo create mode 100644 po/fi.po create mode 100644 po/fr.gmo create mode 100644 po/fr.po create mode 100644 po/ga.gmo create mode 100644 po/ga.po create mode 100644 po/gl.gmo create mode 100644 po/gl.po create mode 100644 po/he.gmo create mode 100644 po/he.po create mode 100644 po/hr.gmo create mode 100644 po/hr.po create mode 100644 po/id.gmo create mode 100644 po/id.po create mode 100644 po/insert-header.sin create mode 100644 po/it.gmo create mode 100644 po/it.po create mode 100644 po/ja.gmo create mode 100644 po/ja.po create mode 100644 po/ko.gmo create mode 100644 po/ko.po create mode 100644 po/lt.gmo create mode 100644 po/lt.po create mode 100644 po/make.pot create mode 100644 po/nl.gmo create mode 100644 po/nl.po create mode 100644 po/pl.gmo create mode 100644 po/pl.po create mode 100644 po/pt_BR.gmo create mode 100644 po/pt_BR.po create mode 100644 po/quot.sed create mode 100644 po/remove-potcdate.sin create mode 100644 po/ru.gmo create mode 100644 po/ru.po create mode 100644 po/stamp-po create mode 100644 po/sv.gmo create mode 100644 po/sv.po create mode 100644 po/tr.gmo create mode 100644 po/tr.po create mode 100644 po/uk.gmo create mode 100644 po/uk.po create mode 100644 po/vi.gmo create mode 100644 po/vi.po create mode 100644 po/zh_CN.gmo create mode 100644 po/zh_CN.po create mode 100644 read.c create mode 100644 remake.c create mode 100644 remote-cstms.c create mode 100644 remote-stub.c create mode 100644 rule.c create mode 100644 rule.h create mode 100644 signame.c create mode 100644 strcache.c create mode 100644 subproc.bat create mode 100644 tests/COPYING create mode 100644 tests/ChangeLog.1 create mode 100644 tests/NEWS create mode 100644 tests/README create mode 100644 tests/config-flags.pm create mode 100644 tests/config-flags.pm.in create mode 100755 tests/config_flags_pm.com create mode 100644 tests/guile.supp create mode 100755 tests/mkshadow create mode 100755 tests/run_make_tests create mode 100755 tests/run_make_tests.com create mode 100644 tests/run_make_tests.pl create mode 100644 tests/scripts/features/archives create mode 100644 tests/scripts/features/comments create mode 100644 tests/scripts/features/conditionals create mode 100644 tests/scripts/features/default_names create mode 100644 tests/scripts/features/double_colon create mode 100644 tests/scripts/features/echoing create mode 100644 tests/scripts/features/errors create mode 100644 tests/scripts/features/escape create mode 100644 tests/scripts/features/export create mode 100644 tests/scripts/features/include create mode 100644 tests/scripts/features/jobserver create mode 100644 tests/scripts/features/load create mode 100644 tests/scripts/features/loadapi create mode 100644 tests/scripts/features/mult_rules create mode 100644 tests/scripts/features/mult_targets create mode 100644 tests/scripts/features/order_only create mode 100644 tests/scripts/features/output-sync create mode 100644 tests/scripts/features/override create mode 100644 tests/scripts/features/parallelism create mode 100644 tests/scripts/features/patspecific_vars create mode 100644 tests/scripts/features/patternrules create mode 100644 tests/scripts/features/quoting create mode 100644 tests/scripts/features/recursion create mode 100644 tests/scripts/features/reinvoke create mode 100644 tests/scripts/features/rule_glob create mode 100644 tests/scripts/features/se_explicit create mode 100644 tests/scripts/features/se_implicit create mode 100644 tests/scripts/features/se_statpat create mode 100644 tests/scripts/features/shell_assignment create mode 100644 tests/scripts/features/statipattrules create mode 100644 tests/scripts/features/targetvars create mode 100644 tests/scripts/features/utf8 create mode 100644 tests/scripts/features/varnesting create mode 100644 tests/scripts/features/vpath create mode 100644 tests/scripts/features/vpath2 create mode 100644 tests/scripts/features/vpath3 create mode 100644 tests/scripts/features/vpathgpath create mode 100644 tests/scripts/features/vpathplus create mode 100644 tests/scripts/functions/abspath create mode 100644 tests/scripts/functions/addprefix create mode 100644 tests/scripts/functions/addsuffix create mode 100644 tests/scripts/functions/andor create mode 100644 tests/scripts/functions/basename create mode 100644 tests/scripts/functions/call create mode 100644 tests/scripts/functions/dir create mode 100644 tests/scripts/functions/error create mode 100644 tests/scripts/functions/eval create mode 100644 tests/scripts/functions/file create mode 100644 tests/scripts/functions/filter-out create mode 100644 tests/scripts/functions/findstring create mode 100644 tests/scripts/functions/flavor create mode 100644 tests/scripts/functions/foreach create mode 100644 tests/scripts/functions/guile create mode 100644 tests/scripts/functions/if create mode 100644 tests/scripts/functions/join create mode 100644 tests/scripts/functions/notdir create mode 100644 tests/scripts/functions/origin create mode 100644 tests/scripts/functions/realpath create mode 100644 tests/scripts/functions/shell create mode 100644 tests/scripts/functions/sort create mode 100644 tests/scripts/functions/strip create mode 100644 tests/scripts/functions/substitution create mode 100644 tests/scripts/functions/suffix create mode 100644 tests/scripts/functions/value create mode 100644 tests/scripts/functions/warning create mode 100644 tests/scripts/functions/wildcard create mode 100644 tests/scripts/functions/word create mode 100644 tests/scripts/misc/bs-nl create mode 100644 tests/scripts/misc/close_stdout create mode 100644 tests/scripts/misc/fopen-fail create mode 100644 tests/scripts/misc/general1 create mode 100644 tests/scripts/misc/general2 create mode 100644 tests/scripts/misc/general3 create mode 100644 tests/scripts/misc/general4 create mode 100644 tests/scripts/misc/utf8 create mode 100644 tests/scripts/options/dash-B create mode 100644 tests/scripts/options/dash-C create mode 100644 tests/scripts/options/dash-I create mode 100644 tests/scripts/options/dash-W create mode 100644 tests/scripts/options/dash-e create mode 100644 tests/scripts/options/dash-f create mode 100644 tests/scripts/options/dash-k create mode 100644 tests/scripts/options/dash-l create mode 100644 tests/scripts/options/dash-n create mode 100644 tests/scripts/options/dash-q create mode 100644 tests/scripts/options/dash-t create mode 100644 tests/scripts/options/eval create mode 100644 tests/scripts/options/general create mode 100644 tests/scripts/options/print-directory create mode 100644 tests/scripts/options/symlinks create mode 100644 tests/scripts/options/warn-undefined-variables create mode 100644 tests/scripts/targets/DEFAULT create mode 100644 tests/scripts/targets/FORCE create mode 100644 tests/scripts/targets/INTERMEDIATE create mode 100644 tests/scripts/targets/ONESHELL create mode 100644 tests/scripts/targets/PHONY create mode 100644 tests/scripts/targets/POSIX create mode 100644 tests/scripts/targets/SECONDARY create mode 100644 tests/scripts/targets/SILENT create mode 100644 tests/scripts/targets/clean create mode 100644 tests/scripts/test_template create mode 100644 tests/scripts/variables/CURDIR create mode 100644 tests/scripts/variables/DEFAULT_GOAL create mode 100644 tests/scripts/variables/GNUMAKEFLAGS create mode 100644 tests/scripts/variables/INCLUDE_DIRS create mode 100644 tests/scripts/variables/LIBPATTERNS create mode 100644 tests/scripts/variables/MAKE create mode 100644 tests/scripts/variables/MAKECMDGOALS create mode 100644 tests/scripts/variables/MAKEFILES create mode 100644 tests/scripts/variables/MAKEFLAGS create mode 100644 tests/scripts/variables/MAKELEVEL create mode 100644 tests/scripts/variables/MAKE_RESTARTS create mode 100644 tests/scripts/variables/MFILE_LIST create mode 100644 tests/scripts/variables/SHELL create mode 100644 tests/scripts/variables/automatic create mode 100644 tests/scripts/variables/define create mode 100644 tests/scripts/variables/flavors create mode 100644 tests/scripts/variables/negative create mode 100644 tests/scripts/variables/private create mode 100644 tests/scripts/variables/special create mode 100644 tests/scripts/variables/undefine create mode 100644 tests/test_driver.pl create mode 100644 variable.c create mode 100644 variable.h create mode 100644 version.c create mode 100644 vmsdir.h create mode 100644 vmsfunctions.c create mode 100644 vmsify.c create mode 100644 vmsjobs.c create mode 100644 vpath.c create mode 100644 w32/Makefile.am create mode 100644 w32/Makefile.in create mode 100644 w32/compat/dirent.c create mode 100644 w32/compat/posixfcn.c create mode 100644 w32/include/dirent.h create mode 100644 w32/include/dlfcn.h create mode 100644 w32/include/pathstuff.h create mode 100644 w32/include/sub_proc.h create mode 100644 w32/include/w32err.h create mode 100644 w32/pathstuff.c create mode 100644 w32/subproc/NMakefile create mode 100644 w32/subproc/build.bat create mode 100644 w32/subproc/misc.c create mode 100644 w32/subproc/proc.h create mode 100644 w32/subproc/sub_proc.c create mode 100644 w32/subproc/w32err.c diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 0000000..b1de1b6 --- /dev/null +++ b/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/AUTHORS b/AUTHORS new file mode 100644 index 0000000..6539881 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,88 @@ +----------------------------------- + +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 + +With suggestions/comments/bug reports from a cast of ... well ... +hundreds, anyway :) + +------------------------------------------------------------------------------- +Copyright (C) 1997-2014 Free 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/COPYING b/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/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/INSTALL b/INSTALL new file mode 100644 index 0000000..095b1eb --- /dev/null +++ b/INSTALL @@ -0,0 +1,231 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + +By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.DOS b/Makefile.DOS new file mode 100644 index 0000000..43753e4 --- /dev/null +++ b/Makefile.DOS @@ -0,0 +1,818 @@ +# -*-Makefile-*- template for DJGPP +# Makefile.in generated automatically by automake 1.2 from Makefile.am +# +# Copyright (C) 1994-2014 Free 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 . + +SHELL = /bin/sh + +srcdir = . +VPATH = $(srcdir) +# $DJDIR is defined automatically by DJGPP to point +# to the root of the DJGPP installation tree. +prefix = /dev/env/DJDIR +exec_prefix = ${prefix} + +bindir = /bin +datadir = /share +libdir = /lib +infodir = /info +mandir = /man +includedir = /include +oldincludedir = c:/djgpp/include + +DESTDIR = /dev/env/DJDIR + +pkgdatadir = $(datadir)/make +pkglibdir = $(libdir)/make +pkgincludedir = $(includedir)/make +localedir = $(datadir)/locale + +INSTALL = ${exec_prefix}/bin/ginstall -c +INSTALL_PROGRAM = ${exec_prefix}/bin/ginstall -c +INSTALL_DATA = ${exec_prefix}/bin/ginstall -c -m 644 +INSTALL_SCRIPT = ${exec_prefix}/bin/ginstall -c +transform = s,x,x, + +# This will fail even if they don't have a Unix-like shell (stock DOS +# shell doesn't know about `false'). The only difference is that they +# get "Error -1" instead of "Error 1". +EXIT_FAIL = false + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +EXEEXT = .exe +OBJEXT = o + +AR = ar +AWK = gawk +CC = gcc +CPP = gcc -E +LIBOBJS = +MAKEINFO = ${exec_prefix}/bin/makeinfo +PACKAGE = make +PERL = perl +RANLIB = ranlib +REMOTE = stub +VERSION = 4.1 + +AUTOMAKE_OPTIONS = 1.2 + +bin_PROGRAMS = make$(EXEEXT) + +make_SOURCES = ar.c arscan.c commands.c default.c dir.c expand.c file.c function.c getopt.c getopt1.c guile.c implicit.c job.c load.c loadapi.c main.c misc.c output.c read.c remake.c rule.c signame.c strcache.c variable.c version.c vpath.c hash.c remote-$(REMOTE).c +# This should include the glob/ prefix +libglob_a_SOURCES = glob/fnmatch.c glob/glob.c glob/fnmatch.h glob/glob.h +make_LDADD = glob/libglob.a + +man_MANS = make.1 + +INCLUDES = -I$(srcdir)/glob -DLIBDIR=\"$(prefix)$(libdir)\" -DINCLUDEDIR=\"$(prefix)$(includedir)\" -DLOCALEDIR=\"$(prefix)$(localedir)\" + +BUILT_SOURCES = README build.sh-in + +EXTRA_DIST = $(BUILT_SOURCES) $(man_MANS) README.customs remote-cstms.c make-stds.texi texinfo.tex SCOPTIONS SMakefile Makefile.ami README.Amiga config.ami amiga.c amiga.h NMakefile README.DOS configh.dos configure.bat makefile.com README.W32 build_w32.bat config.h-W32 subproc.bat make.lnk config.h-vms makefile.vms README.VMS vmsdir.h vmsfunctions.c vmsify.c gmk-default.scm gmk-default.h + +SUBDIRS = glob doc +mkinstalldirs = ${exec_prefix}/bin/gmkdir -p +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = build.sh +PROGRAMS = $(bin_PROGRAMS) + +MAKE_HOST = i386-pc-msdosdjgpp + + +DEFS = -I. -I$(srcdir) -I. +CPPFLAGS = -DHAVE_CONFIG_H +LDFLAGS = +LIBS = +make_OBJECTS = ar.o arscan.o commands.o default.o dir.o expand.o file.o function.o getopt.o getopt1.o guile.o implicit.o job.o load.o loadapi.o main.o misc.o output.o read.o remake.o rule.o signame.o strcache.o variable.o version.o vpath.o hash.o remote-$(REMOTE).o +make_DEPENDENCIES = glob/libglob.a +make_LDFLAGS = +libglob_a_LIBADD = +libglob_a_OBJECTS = fnmatch.o glob.o +noinst_LIBRARIES = glob/libglob.a +CFLAGS = -O2 -g +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) +LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@ +TEXI2DVI = texi2dvi +TEXINFO_TEX = $(srcdir)/config/texinfo.tex +INFO_DEPS = doc/make.info +DVIS = doc/make.dvi +TEXINFOS = doc/make.texi +noinst_TEXINFOS = doc/fdl.texi doc/make-stds.texi +man1dir = $(mandir)/man1 +MANS = $(man_MANS) + +NROFF = nroff +DIST_COMMON = README ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 alloca.c build.sh-in config.h-in configure configure.ac getloadavg.c + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = gtar +GZIP = --best +SOURCES = $(make_SOURCES) +OBJECTS = $(make_OBJECTS) +HEADERS = $(wildcard $(srcdir)/*.h) + +default: all + +.SUFFIXES: +.SUFFIXES: .c .dvi .info .o .obj .ps .texi .tex .html + +mostlyclean-hdr: + +clean-hdr: + +distclean-hdr: + -rm -f config.h + +maintainer-clean-hdr: + +mostlyclean-binPROGRAMS: + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +distclean-binPROGRAMS: + +maintainer-clean-binPROGRAMS: + +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do if test -f $$p; then echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`"; $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`; else :; fi; done + +uninstall-binPROGRAMS: + $(NORMAL_UNINSTALL) + list='$(bin_PROGRAMS)'; for p in $$list; do rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`.exe; done + +.c.o: + $(COMPILE) -c $< + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) *$(EXEEXT) make.new core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c *_tab.c + +maintainer-clean-compile: + +make$(EXEEXT): $(make_OBJECTS) $(make_DEPENDENCIES) + @command.com /c if exist make del make + @command.com /c if exist make.exe del make.exe + $(LINK) $(make_LDFLAGS) $(make_OBJECTS) $(make_LDADD) $(LIBS) + +# Documentation + +make.info: make.texi +make.dvi: make.texi +make.ps: make.dvi make.texi +make.html: make.texi + + +DVIPS = dvips + +.texi.info: + @command.com /c if exist make.info* del make.info* + @command.com /c if exist make.i* del make.i* + $(MAKEINFO) -I$(srcdir) --no-split $< -o ./$@ + +.texi: + @command.com /c if exist make.info* del make.info* + @command.com /c if exist make.i* del make.i* + $(MAKEINFO) -I$(srcdir) --no-split $< -o ./$@ + +.texi.dvi: + TEXINPUTS="$(srcdir);$$TEXINPUTS" MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< + +.dvi.ps: + $(DVIPS) $< -o $@ + +# Other documentation formats + +html: html-recursive + +.texi.html: + @command.com /c if exist make.html* del make.html* + $(MAKEINFO) --html -I$(srcdir) --no-split $< -o ./$@ + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(infodir) + @for file in $(INFO_DEPS); do iifile=`echo $$file | sed "s|doc/||"`; d=$(srcdir); for ifile in `cd $$d && echo $$file`; do if test -f $$d/$$ifile; then echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$iifile"; $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$iifile; else : ; fi; done; done + @$(POST_INSTALL) + @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then for file in $(INFO_DEPS); do iifile=`echo $$file | sed "s|doc/||"`; echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$iifile"; install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$iifile || :; done; else : ; fi + +uninstall-info: + $(PRE_UNINSTALL) + @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then ii=yes; else ii=; fi; for file in $(INFO_DEPS); do test -z $ii || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; done + $(NORMAL_UNINSTALL) + for file in $(INFO_DEPS); do (cd $(DESTDIR)$(infodir) && rm -f $$file); done + +dist-info: $(INFO_DEPS) + for base in $(INFO_DEPS); do d=$(srcdir); for file in `cd $$d && eval echo $$base*`; do test -f $(distdir)/$$file || ln $$d/$$file $(distdir)/$$file 2> /dev/null || cp -p $$d/$$file $(distdir)/$$file; done; done + +mostlyclean-aminfo: + -rm -f $(srcdir)/doc/make.aux $(srcdir)/doc/make.cp $(srcdir)/doc/make.cps $(srcdir)/doc/make.dvi \ + $(srcdir)/doc/make.fn $(srcdir)/doc/make.fns $(srcdir)/doc/make.ky $(srcdir)/doc/make.kys \ + $(srcdir)/doc/make.ps $(srcdir)/doc/make.log $(srcdir)/doc/make.pg $(srcdir)/doc/make.toc \ + $(srcdir)/doc/make.tp $(srcdir)/doc/make.tps $(srcdir)/doc/make.vr $(srcdir)/doc/make.vrs \ + $(srcdir)/doc/make.op $(srcdir)/doc/make.tr $(srcdir)/doc/make.cv $(srcdir)/doc/make.cn \ + $(srcdir)/doc/make.html + +clean-aminfo: + +distclean-aminfo: + +maintainer-clean-aminfo: + for i in $(INFO_DEPS); do rm -f $$i*; done + +install-man1: + $(mkinstalldirs) $(DESTDIR)$(man1dir) + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + done + +uninstall-man1: + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ + rm -f $(DESTDIR)$(man1dir)/$$inst; \ + done +install-man: $(MANS) + @$(NORMAL_INSTALL) + $(MAKE) install-man1 +uninstall-man: + @$(NORMAL_UNINSTALL) + $(MAKE) uninstall-man1 + +# Assume that the only thing to do in glob is to build libglob.a, +# but do a sanity check: if $SUBDIRS will ever have more than +# a single directory, yell bloody murder. +all-recursive: +ifeq ($(findstring glob, $(SUBDIRS)), glob) + @command.com /c if not exist glob\\nul md glob + @echo Making all in glob + $(MAKE) -C glob -f ../Makefile INCLUDES='-I$(srcdir) -I$(srcdir)/glob' DEFS='-I.. -I$(srcdir)' VPATH=$(srcdir)/glob libglob.a +endif + +$(SUBDIRS): + command.com /c md $@ + +libglob.a: $(libglob_a_OBJECTS) + command.com /c if exist libglob.a del libglob.a + $(AR) cru libglob.a $(libglob_a_OBJECTS) $(libglob_a_LIBADD) + $(RANLIB) libglob.a + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive check-recursive: +ifeq ($(words $(SUBDIRS)), 2) + @echo Making $(shell echo $@ | sed s/-recursive//) in glob + $(MAKE) -C glob -f ../Makefile $(shell echo $@ | sed s/-recursive//)-am + @echo Making $(shell echo $@ | sed s/-recursive//) in doc + $(MAKE) -C doc -f ../Makefile $(shell echo $@ | sed s/-recursive//)-am +else + @echo FATAL: There is more than two directory in "($(SUBDIRS))" + @$(EXIT_FAIL) +endif + +tags-in-glob: $(libglob_a_SOURCES) + etags $(addprefix $(srcdir)/,$^) -o ./glob/TAGS + +tags-recursive: +ifeq ($(words $(SUBDIRS)), 2) + $(MAKE) tags-in-glob +else + @echo FATAL: There is more than two directory in "($(SUBDIRS))" + @$(EXIT_FAIL) +endif + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) + mkid $(srcdir)/$(SOURCES) $(srcdir)/$(libglob_a_SOURCES) ./config.h $(HEADERS) + +TAGS: tags-recursive $(HEADERS) $(srcdir)/$(SOURCES) config.h $(TAGS_DEPENDENCIES) + etags -i ./glob/TAGS $(ETAGS_ARGS) $(srcdir)/$(SOURCES) ./config.h $(HEADERS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + rm -rf $(distdir) + GZIP=$(GZIP) $(TAR) zxf $(distdir).tar.gz + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + dc_install_base=`cd $(distdir)/=inst && pwd`; cd $(distdir)/=build && ../configure --srcdir=.. --prefix=$$dc_install_base && $(MAKE) && $(MAKE) dvi && $(MAKE) check && $(MAKE) install && $(MAKE) installcheck && $(MAKE) dist + rm -rf $(distdir) + @echo "========================"; echo "$(distdir).tar.gz is ready for distribution"; echo "========================" +dist: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir) + rm -rf $(distdir) +dist-all: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir) + rm -rf $(distdir) +distdir: $(DISTFILES) + rm -rf $(distdir) + mkdir $(distdir) + -chmod 777 $(distdir) + @for file in $(DISTFILES); do d=$(srcdir); test -f $(distdir)/$$file || ln $$d/$$file $(distdir)/$$file 2> /dev/null || cp -p $$d/$$file $(distdir)/$$file; done; for subdir in $(SUBDIRS); do test -d $(distdir)/$$subdir || mkdir $(distdir)/$$subdir || exit 1; chmod 777 $(distdir)/$$subdir; (cd $$subdir && $(MAKE) top_distdir=../$(top_distdir)/$$subdir distdir=../$(distdir)/$$subdir distdir) || exit 1; done + $(MAKE) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info + $(MAKE) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook + +info: info-recursive +info-recursive: +ifeq ($(findstring doc, $(SUBDIRS)), doc) + @command.com /c if not exist doc\\nul md doc + @echo Making all in doc + $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.info +endif + +dvi: dvi-recursive +dvi-recursive: +ifeq ($(findstring doc, $(SUBDIRS)), doc) + @command.com /c if not exist doc\\nul md doc + @echo Making all in doc + $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.dvi +endif + +ps: ps-recursive +ps-recursive: +ifeq ($(findstring doc, $(SUBDIRS)), doc) + @command.com /c if not exist doc\\nul md doc + @echo Making all in doc + $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.ps +endif + +html-recursive: +ifeq ($(findstring doc, $(SUBDIRS)), doc) + @command.com /c if not exist doc\\nul md doc + @echo Making all in doc + $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.html +endif + +check: all-am check-recursive check-local + @: +installcheck: installcheck-recursive +all-recursive-am: config.h + $(MAKE) all-recursive + +all-am: Makefile $(PROGRAMS) config.h info + +install-exec-am: install-binPROGRAMS + +install-data-am: install-info-am + +uninstall-am: uninstall-binPROGRAMS uninstall-info + +install-exec: install-exec-recursive install-exec-am + @$(NORMAL_INSTALL) + +install-data: install-data-recursive install-data-am + @$(NORMAL_INSTALL) + +install-recursive uninstall-recursive: + @: + +install: install-recursive install-exec-am install-data-am + @: + +uninstall: uninstall-recursive uninstall-am + +all: all-recursive-am all-am + +install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install +installdirs: installdirs-recursive + $(mkinstalldirs) $(bindir) $(infodir) + + +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -rm -f Makefile $(DISTCLEANFILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS mostlyclean-compile mostlyclean-aminfo mostlyclean-tags mostlyclean-generic + +clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-aminfo clean-tags clean-generic mostlyclean-am + +distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile distclean-aminfo distclean-tags distclean-generic clean-am + +maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS maintainer-clean-compile maintainer-clean-aminfo maintainer-clean-tags maintainer-clean-generic distclean-am + +mostlyclean: mostlyclean-recursive mostlyclean-am + +clean: clean-noinstLIBRARIES clean-recursive clean-am + +distclean: distclean-recursive distclean-am + rm -f config.status + +maintainer-clean: maintainer-clean-recursive maintainer-clean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f config.status + +.PHONY: default mostlyclean-hdr distclean-hdr clean-hdr \ +maintainer-clean-hdr mostlyclean-binPROGRAMS distclean-binPROGRAMS \ +clean-binPROGRAMS maintainer-clean-binPROGRAMS uninstall-binPROGRAMS \ +install-binPROGRAMS mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile install-info-am uninstall-info \ +mostlyclean-aminfo distclean-aminfo clean-aminfo \ +maintainer-clean-aminfo install-data-recursive uninstall-data-recursive \ +install-exec-recursive uninstall-exec-recursive installdirs-recursive \ +uninstalldirs-recursive all-recursive check-recursive check-am \ +installcheck-recursive info-recursive dvi-recursive \ +mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir \ +mostlyclean-depend distclean-depend clean-depend \ +maintainer-clean-depend info dvi check-local installcheck \ +all-recursive-am all-am install-exec-am install-data-am uninstall-am \ +install-exec install-data install uninstall all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean \ +html + + +# --------------- Local DIST Section + +# Install the w32 subdirectory +# +dist-hook: + (cd $(srcdir); \ + w32=`find w32 -follow \( -name .git -prune \) -o -type f -print`; \ + tar chf - $$w32) \ + | (cd $(distdir); tar xfBp -) + +# --------------- Local CHECK Section + +# Note: check-loadavg is NOT a prerequisite of check-local, since +# there's no uptime utility, and the test it does doesn't make sense +# on MSDOS anyway. +check-local: check-shell check-regression + @banner=" Regression PASSED: GNU Make $(VERSION) ($(MAKE_HOST)) built with $(CC) "; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + echo + +.PHONY: check-loadavg check-shell check-regression + +# > check-shell +# +# check-shell is designed to fail if they don't have a Unixy shell +# installed. The test suite requires such a shell. +check-shell: + @echo If Make says Error -1, you do not have Unix-style shell installed + @foo=bar.exe : + +# > check-loadavg +# +loadavg: loadavg.c config.h + @rm -f loadavg + $(LINK) -DTEST $(make_LDFLAGS) loadavg.c $(LIBS) +# We copy getloadavg.c into a different file rather than compiling it +# directly because some compilers clobber getloadavg.o in the process. +loadavg.c: getloadavg.c + ln $(srcdir)/getloadavg.c loadavg.c || \ + cp $(srcdir)/getloadavg.c loadavg.c +check-loadavg: loadavg + @echo The system uptime program believes the load average to be: + -uptime + @echo The GNU load average checking code believes: + -./loadavg + +# > check-regression +# +# Look for the make test suite, and run it if found. Look in MAKE_TEST if +# specified, or else in the srcdir or the distdir, their parents, and _their_ +# parents. +# +check-regression: + @if test -f "$(srcdir)/tests/run_make_tests"; then \ + if $(PERL) -v >/dev/null 2>&1; then \ + case `cd $(srcdir); pwd` in `pwd`) : ;; \ + *) test -d tests || mkdir tests; \ + for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \ + rm -rf tests/$$f; cp -pr $(srcdir)/tests/$$f tests; \ + done ;; \ + esac; \ + echo "cd tests && $(PERL) ./run_make_tests.pl -make ../make.exe $(MAKETESTFLAGS)"; \ + cd tests && $(PERL) ./run_make_tests.pl -make ../make.exe $(MAKETESTFLAGS); \ + else \ + echo "Can't find a working Perl ($(PERL)); the test suite requires Perl."; \ + fi; \ + else \ + echo "Can't find the GNU Make test suite ($(srcdir)/tests)."; \ + fi + +# --------------- Maintainer's Section + +# Note this requires GNU make. Not to worry, since it will only be included +# in the Makefile if we're in the maintainer's environment. +#include $(srcdir)/maintMakefile + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# --------------- DEPENDENCIES + +# --------------- DEPENDENCIES +# + +# .deps/alloca.Po +# dummy + +# .deps/ar.Po +ar.o: ar.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + +# .deps/arscan.Po +arscan.o: arscan.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + +# .deps/commands.Po +commands.o: commands.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + variable.h job.h output.h \ + commands.h + +# .deps/default.Po +default.o: default.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h rule.h dep.h job.h output.h \ + commands.h + +# .deps/dir.Po +dir.o: dir.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + hash.h filedef.h dep.h \ + +# .deps/expand.Po +expand.o: expand.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h output.h \ + commands.h variable.h rule.h + +# .deps/file.Po +file.o: file.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h \ + debug.h + +# .deps/function.Po +function.o: function.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + variable.h dep.h job.h output.h \ + commands.h debug.h + +# .deps/getloadavg.Po +# dummy + +# .deps/getopt.Po +getopt.o: getopt.c config.h \ + +# .deps/getopt1.Po +getopt1.o: getopt1.c config.h getopt.h \ + +# .deps/guile.Po +guile.o: guile.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + debug.h filedef.h hash.h \ + dep.h variable.h \ + gmk-default.h + +# .deps/hash.Po +hash.o: hash.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/implicit.Po +implicit.o: implicit.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h rule.h \ + dep.h debug.h variable.h job.h output.h \ + commands.h + +# .deps/job.Po +job.o: job.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + job.h output.h \ + debug.h filedef.h hash.h \ + commands.h variable.h + +# .deps/load.Po +load.o: load.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + debug.h filedef.h hash.h \ + variable.h + +# .deps/loadapi.Po +loadapi.o: loadapi.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + variable.h dep.h + +# .deps/loadavg-getloadavg.Po +# dummy + +# .deps/main.Po +main.o: main.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + variable.h job.h output.h \ + commands.h rule.h debug.h \ + getopt.h + +# .deps/misc.Po +misc.o: misc.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + debug.h \ + +# .deps/output.Po +output.o: output.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + job.h output.h \ + +# .deps/read.Po +read.o: read.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h rule.h \ + debug.h + +# .deps/remake.Po +remake.o: remake.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + output.h \ + commands.h dep.h variable.h \ + debug.h + +# .deps/remote-cstms.Po +# dummy + +# .deps/remote-stub.Po +remote-stub.o: remote-stub.c makeint.h \ + config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + output.h \ + commands.h + +# .deps/rule.Po +rule.o: rule.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h rule.h + +# .deps/signame.Po +signame.o: signame.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + +# .deps/strcache.Po +strcache.o: strcache.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/variable.Po +variable.o: variable.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h rule.h + +# .deps/version.Po +version.o: version.c config.h + +# .deps/vmsjobs.Po +# dummy + +# .deps/vpath.Po +vpath.o: vpath.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + variable.h diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..204ab32 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,204 @@ +# This is a -*-Makefile-*-, or close enough +# +# Copyright (C) 1997-2014 Free 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 = 1.8 dist-bzip2 check-news +ACLOCAL_AMFLAGS = -I config + +MAKE_HOST = @MAKE_HOST@ + +# Only process if target is MS-Windows +if WINDOWSENV + MAYBE_W32 = w32 + W32INC = -I $(top_srcdir)/w32/include + W32LIB = -Lw32 -lw32 +endif + +SUBDIRS = glob config po doc $(MAYBE_W32) + +bin_PROGRAMS = make +include_HEADERS = gnumake.h + +if USE_CUSTOMS + remote = remote-cstms.c +else + remote = remote-stub.c +endif + +make_SOURCES = ar.c arscan.c commands.c default.c dir.c expand.c file.c \ + function.c getopt.c getopt1.c guile.c implicit.c job.c load.c \ + loadapi.c main.c misc.c output.c read.c remake.c rule.c \ + signame.c strcache.c variable.c version.c vpath.c hash.c \ + $(remote) + +EXTRA_make_SOURCES = vmsjobs.c remote-stub.c remote-cstms.c + +noinst_HEADERS = commands.h dep.h filedef.h job.h makeint.h rule.h variable.h \ + debug.h getopt.h gettext.h hash.h output.h + +make_LDADD = @LIBOBJS@ @ALLOCA@ $(GLOBLIB) @GETLOADAVG_LIBS@ @LIBINTL@ \ + $(GUILE_LIBS) +# Only process if target is MS-Windows +if WINDOWSENV + make_LDADD += $(W32LIB) +endif + +man_MANS = make.1 + +DEFS = -DLOCALEDIR=\"$(localedir)\" -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" @DEFS@ + +AM_CPPFLAGS = $(GLOBINC) +AM_CFLAGS = $(GUILE_CFLAGS) +# Only process if target is MS-Windows +if WINDOWSENV + AM_CPPFLAGS += $(W32INC) +endif + + +# Extra stuff to include in the distribution. + +EXTRA_DIST = README build.sh.in $(man_MANS) \ + README.customs README.OS2 \ + SCOPTIONS SMakefile \ + README.Amiga Makefile.ami config.ami make.lnk amiga.c amiga.h \ + README.DOS Makefile.DOS configure.bat dosbuild.bat configh.dos\ + README.W32 NMakefile config.h.W32 build_w32.bat subproc.bat \ + make_msvc_net2003.sln make_msvc_net2003.vcproj \ + README.VMS makefile.vms makefile.com config.h-vms \ + vmsdir.h vmsfunctions.c vmsify.c \ + gmk-default.scm gmk-default.h + +# This is built during configure, but behind configure's back + +DISTCLEANFILES = build.sh + +# --------------- Internationalization Section + +localedir = $(datadir)/locale + +# --------------- Local INSTALL Section + +# If necessary, change the gid of the app and turn on the setgid flag. +# + +# Whether or not make needs to be installed setgid. +# The value should be either 'true' or 'false'. +# On many systems, the getloadavg function (used to implement the '-l' +# switch) will not work unless make is installed setgid kmem. +# +inst_setgid = @NEED_SETGID@ + +# Install make setgid to this group so it can get the load average. +# +inst_group = @KMEM_GROUP@ + +install-exec-local: + @if $(inst_setgid); then \ + app=$(DESTDIR)$(bindir)/`echo $(bin_PROGRAMS)|sed '$(transform)'`; \ + if chgrp $(inst_group) $$app && chmod g+s $$app; then \ + echo "chgrp $(inst_group) $$app && chmod g+s $$app"; \ + else \ + echo "$$app needs to be owned by group $(inst_group) and setgid;"; \ + echo "otherwise the '-l' option will probably not work."; \ + echo "You may need special privileges to complete the installation"; \ + echo "of $$app."; \ + fi; \ + else true; fi + +# --------------- Generate the Guile default module content + +guile.$(OBJEXT): gmk-default.h +gmk-default.h: $(srcdir)/gmk-default.scm + (echo 'static const char *const GUILE_module_defn = " '\\ \ + && sed -e 's/;.*//' -e '/^[ \t]*$$/d' -e 's/"/\\"/g' -e 's/$$/ \\/' \ + $(srcdir)/gmk-default.scm \ + && echo '";') > $@ + +# --------------- Local DIST Section + +# Install the w32 and tests subdirectories +# +dist-hook: + (cd $(srcdir); \ + sub=`find w32 tests -follow \( -name .git -o -name .deps -o -name work -o -name .gitignore -o -name \*.orig -o -name \*.rej -o -name \*~ -o -name Makefile \) -prune -o -type f -print`; \ + tar chf - $$sub) \ + | (cd $(distdir); tar xfBp -) + + +# --------------- Local CHECK Section + +check-local: check-regression check-loadavg + @banner=" Regression PASSED: GNU Make $(VERSION) ($(MAKE_HOST)) built with $(CC) "; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + echo + +.PHONY: check-loadavg check-regression + +check-loadavg: loadavg$(EXEEXT) + @echo The system uptime program believes the load average to be: + -uptime + @echo The GNU load average checking code thinks: + -./loadavg$(EXEEXT) + +# The loadavg function is invoked during "make check" to test getloadavg. +check_PROGRAMS = loadavg +nodist_loadavg_SOURCES = getloadavg.c +loadavg_CPPFLAGS = -DTEST +loadavg_LDADD = @GETLOADAVG_LIBS@ + +# > check-regression +# +# Look for the make test suite, and run it if found and we can find perl. +# 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 = + +check-regression: tests/config-flags.pm + @if test -f '$(srcdir)/tests/run_make_tests'; then \ + if $(PERL) -v >/dev/null 2>&1; then \ + case `cd '$(srcdir)'; pwd` in `pwd`) : ;; \ + *) test -d tests || mkdir tests; \ + rm -f srctests; \ + if ln -s '$(srcdir)/tests' srctests; then \ + for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \ + rm -f tests/$$f; ln -s ../srctests/$$f tests; \ + done; fi ;; \ + esac; \ + echo "cd tests && $(PERL) ./run_make_tests.pl -srcdir $(abs_srcdir) -make ../make$(EXEEXT) $(MAKETESTFLAGS)"; \ + cd tests && $(PERL) ./run_make_tests.pl -srcdir '$(abs_srcdir)' -make '../make$(EXEEXT)' $(MAKETESTFLAGS); \ + else \ + echo "Can't find a working Perl ($(PERL)); the test suite requires Perl."; \ + fi; \ + else \ + echo "Can't find the GNU Make test suite ($(srcdir)/tests)."; \ + fi + + +# --------------- Maintainer's Section + +# 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/Makefile.ami b/Makefile.ami new file mode 100644 index 0000000..7c561a3 --- /dev/null +++ b/Makefile.ami @@ -0,0 +1,308 @@ +# -*-Makefile-*- for GNU make on Amiga +# +# NOTE: If you have no 'make' program at all to process this makefile, run +# 'build.sh' instead. +# +# Copyright (C) 1995-2014 Free 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 . + +# +# Makefile for GNU Make +# + +CC = sc +RM = delete + +CFLAGS = +CPPFLAGS = +LDFLAGS = + +# Define these for your system as follows: +# -DNO_ARCHIVES To disable 'ar' archive support. +# -DNO_FLOAT To avoid using floating-point numbers. +# -DENUM_BITFIELDS If the compiler isn't GCC but groks enum foo:2. +# Some compilers apparently accept this +# without complaint but produce losing code, +# so beware. +# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline. +# See also 'config.h'. +defines = + +# Which flavor of remote job execution support to use. +# The code is found in 'remote-$(REMOTE).c'. +REMOTE = stub + +# If you are using the GNU C library, or have the GNU getopt functions in +# your C library, you can comment these out. +GETOPT = getopt.o getopt1.o +GETOPT_SRC = $(srcdir)getopt.c $(srcdir)getopt1.c $(srcdir)getopt.h + +# If you are using the GNU C library, or have the GNU glob functions in +# your C library, you can comment this out. GNU make uses special hooks +# into the glob functions to be more efficient (by using make's directory +# cache for globbing), so you must use the GNU functions even if your +# system's C library has the 1003.2 glob functions already. Also, the glob +# functions in the AIX and HPUX C libraries are said to be buggy. +GLOB = glob/glob.lib + +# If your system doesn't have alloca, or the one provided is bad, define this. +ALLOCA = alloca.o +ALLOCA_SRC = $(srcdir)alloca.c + +# If your system needs extra libraries loaded in, define them here. +# System V probably need -lPW for alloca. HP-UX 7.0's alloca in +# libPW.a is broken on HP9000s300 and HP9000s400 machines. Use +# alloca.c instead on those machines. +LOADLIBES = + +# Any extra object files your system needs. +extras = amiga.o + +# Common prefix for machine-independent installed files. +prefix = +# Common prefix for machine-dependent installed files. +exec_prefix = + +# Directory to install 'make' in. +bindir = sc:c +# Directory to find libraries in for '-lXXX'. +libdir = lib: +# Directory to search by default for included makefiles. +includedir = include: +# Directory to install the Info files in. +infodir = doc: +# Directory to install the man page in. +mandir = t: +# Number to put on the man page filename. +manext = 1 +# Prefix to put on installed 'make' binary file name. +binprefix = +# Prefix to put on installed 'make' man page file name. +manprefix = $(binprefix) + +# Whether or not make needs to be installed setgid. +# The value should be either 'true' or 'false'. +# On many systems, the getloadavg function (used to implement the '-l' +# switch) will not work unless make is installed setgid kmem. +install_setgid = false +# Install make setgid to this group so it can read /dev/kmem. +group = sys + +# Program to install 'make'. +INSTALL_PROGRAM = copy +# Program to install the man page. +INSTALL_DATA = copy +# Generic install program. +INSTALL = copy + +# Program to format Texinfo source into Info files. +MAKEINFO = makeinfo +# Program to format Texinfo source into DVI files. +TEXI2DVI = texi2dvi + +# Programs to make tags files. +ETAGS = etags -w +CTAGS = ctags -w + +#guile = guile.o + +objs = commands.o job.o dir.o file.o misc.o main.o read.o remake.o \ + rule.o implicit.o default.o variable.o expand.o function.o \ + vpath.o version.o ar.o arscan.o signame.o strcache.o hash.o \ + remote-$(REMOTE).o $(GETOPT) $(ALLOCA) $(extras) $(guile) + +srcs = $(srcdir)commands.c $(srcdir)job.c $(srcdir)dir.c \ + $(srcdir)file.c $(srcdir)getloadavg.c $(srcdir)misc.c \ + $(srcdir)main.c $(srcdir)read.c $(srcdir)remake.c \ + $(srcdir)rule.c $(srcdir)implicit.c $(srcdir)default.c \ + $(srcdir)variable.c $(srcdir)expand.c $(srcdir)function.c \ + $(srcdir)vpath.c $(srcdir)version.c $(srcdir)hash.c \ + $(srcdir)guile.c $(srcdir)remote-$(REMOTE).c \ + $(srcdir)ar.c $(srcdir)arscan.c $(srcdir)strcache.c \ + $(srcdir)signame.c $(srcdir)signame.h $(GETOPT_SRC) \ + $(srcdir)commands.h $(srcdir)dep.h $(srcdir)filedep.h \ + $(srcdir)job.h $(srcdir)makeint.h $(srcdir)rule.h \ + $(srcdir)variable.h $(ALLOCA_SRC) $(srcdir)config.h.in + + +.SUFFIXES: +.SUFFIXES: .o .c .h .ps .dvi .info .texinfo + +all: make +info: make.info +dvi: make.dvi +# Some makes apparently use .PHONY as the default goal if it is before 'all'. +.PHONY: all check info dvi + +make.info: make.texinfo + $(MAKEINFO) -I$(srcdir) $(srcdir)make.texinfo -o make.info + +make.dvi: make.texinfo + $(TEXI2DVI) $(srcdir)make.texinfo + +make.ps: make.dvi + dvi2ps make.dvi > make.ps + +make: $(objs) $(GLOB) + $(CC) Link $(LDFLAGS) $(objs) Lib $(GLOB) $(LOADLIBES) To make.new + -delete make + rename make.new make + +TMPFILE = t:Make$$ + +$(GLOB): + cd glob @@\ + $(MAKE) -$(MAKEFLAGS) -f Makefile + +# -I. is needed to find config.h in the build directory. +OUTPUT_OPTION = +.c.o: + $(CC) $(defines) IDir "" IDir glob \ + $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) + +# For some losing Unix makes. +SHELL = /bin/sh +#@SET_MAKE@ + +glob/libglob.a: FORCE config.h + cd glob; $(MAKE) libglob.a +FORCE: + +.PHONY: install installdirs +install: installdirs \ + $(bindir)$(binprefix)make $(infodir)make.info \ + $(mandir)$(manprefix)make.$(manext) + +installdirs: + $(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(infodir) $(mandir) + +$(bindir)$(binprefix)make: make + $(INSTALL_PROGRAM) make $@.new + @if $(install_setgid); then \ + if chgrp $(group) $@.new && chmod g+s $@.new; then \ + echo "chgrp $(group) $@.new && chmod g+s $@.new"; \ + else \ + echo "$@ needs to be owned by group $(group) and setgid;"; \ + echo "otherwise the '-l' option will probably not work."; \ + echo "You may need special privileges to install $@."; \ + fi; \ + else true; fi +# Some systems can't deal with renaming onto a running binary. + -$(RM) $@.old + -mv $@ $@.old + mv $@.new $@ + +$(infodir)make.info: make.info + if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \ + for file in $${dir}/make.info*; do \ + name="`basename $$file`"; \ + $(INSTALL_DATA) $$file \ + `echo $@ | sed "s,make.info\$$,$$name,"`; \ + done +# Run install-info only if it exists. +# Use 'if' instead of just prepending '-' to the +# line so we notice real errors from install-info. +# We use '$(SHELL) -c' because some shells do not +# fail gracefully when there is an unknown command. + if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ + if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \ + install-info --infodir=$(infodir) $$dir/make.info; \ + else true; fi + +$(mandir)$(manprefix)make.$(manext): make.man + $(INSTALL_DATA) $(srcdir)make.man $@ + + +loadavg: loadavg.c config.h + $(CC) $(defines) -DTEST -I. -I$(srcdir) $(CFLAGS) $(LDFLAGS) \ + loadavg.c $(LOADLIBES) -o $@ +# We copy getloadavg.c into a different file rather than compiling it +# directly because some compilers clobber getloadavg.o in the process. +loadavg.c: getloadavg.c + ln $(srcdir)getloadavg.c loadavg.c || \ + cp $(srcdir)getloadavg.c loadavg.c +check-loadavg: loadavg + @echo The system uptime program believes the load average to be: + -uptime + @echo The GNU load average checking code believes: + ./loadavg +check: check-loadavg + + +.PHONY: clean realclean distclean mostlyclean +clean: glob-clean + -$(RM) make loadavg "#?.o" core make.dvi + +distclean: clean glob-realclean + -$(RM) Makefile config.h config.status build.sh + -$(RM) config.log config.cache + -$(RM) TAGS tags + -$(RM) make.?? make.??s make.log make.toc make.*aux + -$(RM) loadavg.c + +realclean: distclean + -$(RM) make.info* +mostlyclean: clean + +.PHONY: glob-clean glob-realclean +glob-clean glob-realclean: + cd glob @@\ + $(MAKE) $@ + +# This tells versions [3.59,3.63) of GNU make not to export all variables. +.NOEXPORT: + +# The automatically generated dependencies below may omit config.h +# because it is included with '#include ' rather than +# '#include "config.h"'. So we add the explicit dependency to make sure. +$(objs): config.h + +# Automatically generated dependencies will be put at the end of the file. + +# Automatically generated dependencies. +commands.o: commands.c makeint.h dep.h filedef.h variable.h job.h \ + commands.h +job.o: job.c makeint.h job.h filedef.h commands.h variable.h +dir.o: dir.c makeint.h +file.o: file.c makeint.h dep.h filedef.h job.h commands.h variable.h +misc.o: misc.c makeint.h dep.h +main.o: main.c makeint.h dep.h filedef.h variable.h job.h commands.h \ + getopt.h +guile.o: guile.c makeint.h dep.h debug.h variable.h gmk-default.h +read.o: read.c makeint.h dep.h filedef.h job.h commands.h variable.h \ + glob/glob.h +remake.o: remake.c makeint.h filedef.h job.h commands.h dep.h +rule.o: rule.c makeint.h dep.h filedef.h job.h commands.h variable.h \ + rule.h +implicit.o: implicit.c makeint.h rule.h dep.h filedef.h +default.o: default.c makeint.h rule.h dep.h filedef.h job.h commands.h \ + variable.h +variable.o: variable.c makeint.h dep.h filedef.h job.h commands.h \ + variable.h +expand.o: expand.c makeint.h filedef.h job.h commands.h variable.h +function.o: function.c makeint.h filedef.h variable.h dep.h job.h \ + commands.h amiga.h +vpath.o: vpath.c makeint.h filedef.h variable.h +strcache.o: strcache.c makeint.h hash.h +version.o: version.c +ar.o: ar.c makeint.h filedef.h dep.h +arscan.o: arscan.c makeint.h +signame.o: signame.c signame.h +remote-stub.o: remote-stub.c makeint.h filedef.h job.h commands.h +getopt.o: getopt.c +getopt1.o : getopt1.c getopt.h +getloadavg.o: getloadavg.c +amiga.o: amiga.c makeint.h variable.h amiga.h diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..e2310fe --- /dev/null +++ b/Makefile.in @@ -0,0 +1,1280 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 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-2014 Free 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +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) +# Only process if target is MS-Windows +@WINDOWSENV_TRUE@am__append_1 = $(W32LIB) +# Only process if target is MS-Windows +@WINDOWSENV_TRUE@am__append_2 = $(W32INC) +check_PROGRAMS = loadavg$(EXEEXT) +subdir = . +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(srcdir)/config.h.in $(top_srcdir)/tests/config-flags.pm.in \ + getloadavg.c alloca.c $(top_srcdir)/config/depcomp \ + $(include_HEADERS) $(noinst_HEADERS) ABOUT-NLS AUTHORS COPYING \ + INSTALL NEWS README $(top_srcdir)/config/ar-lib \ + $(top_srcdir)/config/compile $(top_srcdir)/config/config.guess \ + $(top_srcdir)/config/config.rpath \ + $(top_srcdir)/config/config.sub \ + $(top_srcdir)/config/install-sh $(top_srcdir)/config/missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/intlmacosx.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = tests/config-flags.pm +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ + "$(DESTDIR)$(includedir)" +PROGRAMS = $(bin_PROGRAMS) +nodist_loadavg_OBJECTS = loadavg-getloadavg.$(OBJEXT) +loadavg_OBJECTS = $(nodist_loadavg_OBJECTS) +loadavg_DEPENDENCIES = +am__make_SOURCES_DIST = ar.c arscan.c commands.c default.c dir.c \ + expand.c file.c function.c getopt.c getopt1.c guile.c \ + implicit.c job.c load.c loadapi.c main.c misc.c output.c \ + read.c remake.c rule.c signame.c strcache.c variable.c \ + version.c vpath.c hash.c remote-stub.c remote-cstms.c +@USE_CUSTOMS_FALSE@am__objects_1 = remote-stub.$(OBJEXT) +@USE_CUSTOMS_TRUE@am__objects_1 = remote-cstms.$(OBJEXT) +am_make_OBJECTS = ar.$(OBJEXT) arscan.$(OBJEXT) commands.$(OBJEXT) \ + default.$(OBJEXT) dir.$(OBJEXT) expand.$(OBJEXT) \ + file.$(OBJEXT) function.$(OBJEXT) getopt.$(OBJEXT) \ + getopt1.$(OBJEXT) guile.$(OBJEXT) implicit.$(OBJEXT) \ + job.$(OBJEXT) load.$(OBJEXT) loadapi.$(OBJEXT) main.$(OBJEXT) \ + misc.$(OBJEXT) output.$(OBJEXT) read.$(OBJEXT) \ + remake.$(OBJEXT) rule.$(OBJEXT) signame.$(OBJEXT) \ + strcache.$(OBJEXT) variable.$(OBJEXT) version.$(OBJEXT) \ + vpath.$(OBJEXT) hash.$(OBJEXT) $(am__objects_1) +make_OBJECTS = $(am_make_OBJECTS) +am__DEPENDENCIES_1 = +@WINDOWSENV_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +make_DEPENDENCIES = @LIBOBJS@ @ALLOCA@ $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +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@ +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(nodist_loadavg_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) $(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 \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# 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 = glob config po doc w32 +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.bz2 +GZIP_ENV = --best +DIST_TARGETS = dist-bzip2 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@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = -DLOCALEDIR=\"$(localedir)\" -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLOBINC = @GLOBINC@ +GLOBLIB = @GLOBLIB@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GUILE_CFLAGS = @GUILE_CFLAGS@ +GUILE_LIBS = @GUILE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +KMEM_GROUP = @KMEM_GROUP@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_HOST = @MAKE_HOST@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEED_SETGID = @NEED_SETGID@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +REMOTE = @REMOTE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ + +# --------------- Internationalization Section +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@ +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.8 dist-bzip2 check-news +ACLOCAL_AMFLAGS = -I config + +# Only process if target is MS-Windows +@WINDOWSENV_TRUE@MAYBE_W32 = w32 +@WINDOWSENV_TRUE@W32INC = -I $(top_srcdir)/w32/include +@WINDOWSENV_TRUE@W32LIB = -Lw32 -lw32 +SUBDIRS = glob config po doc $(MAYBE_W32) +include_HEADERS = gnumake.h +@USE_CUSTOMS_FALSE@remote = remote-stub.c +@USE_CUSTOMS_TRUE@remote = remote-cstms.c +make_SOURCES = ar.c arscan.c commands.c default.c dir.c expand.c file.c \ + function.c getopt.c getopt1.c guile.c implicit.c job.c load.c \ + loadapi.c main.c misc.c output.c read.c remake.c rule.c \ + signame.c strcache.c variable.c version.c vpath.c hash.c \ + $(remote) + +EXTRA_make_SOURCES = vmsjobs.c remote-stub.c remote-cstms.c +noinst_HEADERS = commands.h dep.h filedef.h job.h makeint.h rule.h variable.h \ + debug.h getopt.h gettext.h hash.h output.h + +make_LDADD = @LIBOBJS@ @ALLOCA@ $(GLOBLIB) @GETLOADAVG_LIBS@ @LIBINTL@ \ + $(GUILE_LIBS) $(am__append_1) +man_MANS = make.1 +AM_CPPFLAGS = $(GLOBINC) $(am__append_2) +AM_CFLAGS = $(GUILE_CFLAGS) + +# Extra stuff to include in the distribution. +EXTRA_DIST = README build.sh.in $(man_MANS) \ + README.customs README.OS2 \ + SCOPTIONS SMakefile \ + README.Amiga Makefile.ami config.ami make.lnk amiga.c amiga.h \ + README.DOS Makefile.DOS configure.bat dosbuild.bat configh.dos\ + README.W32 NMakefile config.h.W32 build_w32.bat subproc.bat \ + make_msvc_net2003.sln make_msvc_net2003.vcproj \ + README.VMS makefile.vms makefile.com config.h-vms \ + vmsdir.h vmsfunctions.c vmsify.c \ + gmk-default.scm gmk-default.h + + +# This is built during configure, but behind configure's back +DISTCLEANFILES = build.sh + +# --------------- Local INSTALL Section + +# If necessary, change the gid of the app and turn on the setgid flag. +# + +# Whether or not make needs to be installed setgid. +# The value should be either 'true' or 'false'. +# On many systems, the getloadavg function (used to implement the '-l' +# switch) will not work unless make is installed setgid kmem. +# +inst_setgid = @NEED_SETGID@ + +# Install make setgid to this group so it can get the load average. +# +inst_group = @KMEM_GROUP@ +nodist_loadavg_SOURCES = getloadavg.c +loadavg_CPPFLAGS = -DTEST +loadavg_LDADD = @GETLOADAVG_LIBS@ + +# > check-regression +# +# 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: config.h + $(MAKE) $(AM_MAKEFLAGS) 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 +.PRECIOUS: 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__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + 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): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +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) + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) + +loadavg$(EXEEXT): $(loadavg_OBJECTS) $(loadavg_DEPENDENCIES) $(EXTRA_loadavg_DEPENDENCIES) + @rm -f loadavg$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(loadavg_OBJECTS) $(loadavg_LDADD) $(LIBS) + +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) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getloadavg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arscan.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commands.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expand.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/function.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/implicit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loadapi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loadavg-getloadavg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/output.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remake.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-cstms.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-stub.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rule.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signame.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strcache.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vmsjobs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vpath.Po@am__quote@ + +.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) '$<'` + +loadavg-getloadavg.o: getloadavg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loadavg-getloadavg.o -MD -MP -MF $(DEPDIR)/loadavg-getloadavg.Tpo -c -o loadavg-getloadavg.o `test -f 'getloadavg.c' || echo '$(srcdir)/'`getloadavg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loadavg-getloadavg.Tpo $(DEPDIR)/loadavg-getloadavg.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getloadavg.c' object='loadavg-getloadavg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loadavg-getloadavg.o `test -f 'getloadavg.c' || echo '$(srcdir)/'`getloadavg.c + +loadavg-getloadavg.obj: getloadavg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loadavg-getloadavg.obj -MD -MP -MF $(DEPDIR)/loadavg-getloadavg.Tpo -c -o loadavg-getloadavg.obj `if test -f 'getloadavg.c'; then $(CYGPATH_W) 'getloadavg.c'; else $(CYGPATH_W) '$(srcdir)/getloadavg.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/loadavg-getloadavg.Tpo $(DEPDIR)/loadavg-getloadavg.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getloadavg.c' object='loadavg-getloadavg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loadavg-getloadavg.obj `if test -f 'getloadavg.c'; then $(CYGPATH_W) 'getloadavg.c'; else $(CYGPATH_W) '$(srcdir)/getloadavg.c'; fi` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + 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: $(DISTFILES) + @case `sed 15q $(srcdir)/NEWS` in \ + *"$(VERSION)"*) : ;; \ + *) \ + echo "NEWS not updated; not releasing" 1>&2; \ + exit 1;; \ + esac + $(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) | GZIP=$(GZIP_ENV) gzip -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 shar distribution archives 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 distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(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*) \ + GZIP=$(GZIP_ENV) gzip -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*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(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 \ + && ../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_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-recursive +all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) config.h +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) + -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." +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(DEPDIR) ./$(DEPDIR) + -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-exec-local + +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: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf $(DEPDIR) ./$(DEPDIR) + -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) all check-am install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am check-local clean clean-binPROGRAMS \ + clean-checkPROGRAMS clean-cscope clean-generic cscope \ + 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-exec-local install-html \ + install-html-am install-includeHEADERS install-info \ + install-info-am install-man install-man1 install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-includeHEADERS uninstall-man uninstall-man1 + + +install-exec-local: + @if $(inst_setgid); then \ + app=$(DESTDIR)$(bindir)/`echo $(bin_PROGRAMS)|sed '$(transform)'`; \ + if chgrp $(inst_group) $$app && chmod g+s $$app; then \ + echo "chgrp $(inst_group) $$app && chmod g+s $$app"; \ + else \ + echo "$$app needs to be owned by group $(inst_group) and setgid;"; \ + echo "otherwise the '-l' option will probably not work."; \ + echo "You may need special privileges to complete the installation"; \ + echo "of $$app."; \ + fi; \ + else true; fi + +# --------------- Generate the Guile default module content + +guile.$(OBJEXT): gmk-default.h +gmk-default.h: $(srcdir)/gmk-default.scm + (echo 'static const char *const GUILE_module_defn = " '\\ \ + && sed -e 's/;.*//' -e '/^[ \t]*$$/d' -e 's/"/\\"/g' -e 's/$$/ \\/' \ + $(srcdir)/gmk-default.scm \ + && echo '";') > $@ + +# --------------- Local DIST Section + +# Install the w32 and tests subdirectories +# +dist-hook: + (cd $(srcdir); \ + sub=`find w32 tests -follow \( -name .git -o -name .deps -o -name work -o -name .gitignore -o -name \*.orig -o -name \*.rej -o -name \*~ -o -name Makefile \) -prune -o -type f -print`; \ + tar chf - $$sub) \ + | (cd $(distdir); tar xfBp -) + +# --------------- Local CHECK Section + +check-local: check-regression check-loadavg + @banner=" Regression PASSED: GNU Make $(VERSION) ($(MAKE_HOST)) built with $(CC) "; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + echo + +.PHONY: check-loadavg check-regression + +check-loadavg: loadavg$(EXEEXT) + @echo The system uptime program believes the load average to be: + -uptime + @echo The GNU load average checking code thinks: + -./loadavg$(EXEEXT) + +check-regression: tests/config-flags.pm + @if test -f '$(srcdir)/tests/run_make_tests'; then \ + if $(PERL) -v >/dev/null 2>&1; then \ + case `cd '$(srcdir)'; pwd` in `pwd`) : ;; \ + *) test -d tests || mkdir tests; \ + rm -f srctests; \ + if ln -s '$(srcdir)/tests' srctests; then \ + for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \ + rm -f tests/$$f; ln -s ../srctests/$$f tests; \ + done; fi ;; \ + esac; \ + echo "cd tests && $(PERL) ./run_make_tests.pl -srcdir $(abs_srcdir) -make ../make$(EXEEXT) $(MAKETESTFLAGS)"; \ + cd tests && $(PERL) ./run_make_tests.pl -srcdir '$(abs_srcdir)' -make '../make$(EXEEXT)' $(MAKETESTFLAGS); \ + else \ + echo "Can't find a working Perl ($(PERL)); the test suite requires Perl."; \ + fi; \ + else \ + echo "Can't find the GNU Make test suite ($(srcdir)/tests)."; \ + fi + +# --------------- Maintainer's Section + +# 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/NEWS b/NEWS new file mode 100644 index 0000000..7e11787 --- /dev/null +++ b/NEWS @@ -0,0 +1,1235 @@ +GNU make NEWS -*-indented-text-*- + History of user-visible changes. + 05 Oct 2014 + +See the end of this file for copyrights and conditions. + +All changes mentioned here are more fully described in the GNU make +manual, which is contained in this distribution as the file doc/make.texi. +See the README file and the GNU make manual for instructions for +reporting bugs. + +Version 4.1 (05 Oct 2014) + +A complete list of bugs fixed in this version is available here: + +http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=105&set=custom + +* 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 + + +Version 4.0 (09 Oct 2013) + +A complete list of bugs fixed in this version is available here: + +http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=101&set=custom + +* 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: + +http://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. + + +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 http://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: + + http://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. + +A complete list of bugs fixed in this version is available here: + + http://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=102 + + +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. + +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). + +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 . + +* John W. Eaton has updated the VMS port to support libraries and VPATH. + +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 + . + +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/NMakefile b/NMakefile new file mode 100644 index 0000000..6ed11a7 --- /dev/null +++ b/NMakefile @@ -0,0 +1,360 @@ +# -*-Makefile-*- to build GNU make with nmake +# +# NOTE: If you have no 'make' program at all to process this makefile, +# run 'build_w32.bat' instead. +# +# Copyright (C) 1996-2014 Free 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 . + +LINK = link +CC = cl +MAKE = nmake + +OUTDIR=. +MAKEFILE=NMakefile +SUBPROC_MAKEFILE=NMakefile + +CFLAGS_any = /nologo /MT /W4 /GX /Zi /YX /I . /I glob /I w32/include /D WIN32 /D WINDOWS32 /D _CONSOLE /D HAVE_CONFIG_H +CFLAGS_debug = $(CFLAGS_any) /Od /D DEBUG /D _DEBUG /FR.\WinDebug/ /Fp.\WinDebug/make.pch /Fo.\WinDebug/ /Fd.\WinDebug/make.pdb +CFLAGS_release = $(CFLAGS_any) /O2 /D NDEBUG /FR.\WinRel/ /Fp.\WinRel/make.pch /Fo.\WinRel/ + +LDFLAGS_debug = w32\subproc\WinDebug\subproc.lib /NOLOGO /SUBSYSTEM:console\ + /STACK:0x400000 /INCREMENTAL:no /PDB:WinDebug/make.pdb /OUT:WinDebug/make.exe /DEBUG +LDFLAGS_release = w32\subproc\WinRel\subproc.lib /NOLOGO /SUBSYSTEM:console\ + /STACK:0x400000 /INCREMENTAL:no /OUT:WinRel/make.exe + +all: config.h subproc Release Debug + +# +# Make sure we build the subproc library first. It has it's own +# makefile. To be portable to Windows 95, we put the instructions +# on how to build the library into a batch file. On NT, we could +# simply have done foo && bar && dog, but this doesn't port. +# +subproc: w32/subproc/WinDebug/subproc.lib w32/subproc/WinRel/subproc.lib + +w32/subproc/WinDebug/subproc.lib w32/subproc/WinRel/subproc.lib: w32/subproc/misc.c w32/subproc/sub_proc.c w32/subproc/w32err.c + subproc.bat $(SUBPROC_MAKEFILE) $(MAKE) + if exist WinDebug\make.exe erase WinDebug\make.exe + if exist WinRel\make.exe erase WinRel\make.exe + +config.h: config.h.W32 + copy $? $@ + +Release: + $(MAKE) /f $(MAKEFILE) LDFLAGS="$(LDFLAGS_release)" CFLAGS="$(CFLAGS_release)" OUTDIR=WinRel WinRel/make.exe +Debug: + $(MAKE) /f $(MAKEFILE) LDFLAGS="$(LDFLAGS_debug)" CFLAGS="$(CFLAGS_debug)" OUTDIR=WinDebug WinDebug/make.exe + +clean: + if exist WinDebug\nul rmdir /s /q WinDebug + if exist WinRel\nul rmdir /s /q WinRel + if exist w32\subproc\WinDebug\nul rmdir /s /q w32\subproc\WinDebug + if exist w32\subproc\WinRel\nul rmdir /s /q w32\subproc\WinRel + if exist config.h erase config.h + erase *.pdb + +$(OUTDIR): + if not exist .\$@\nul mkdir .\$@ + +LIBS = kernel32.lib user32.lib advapi32.lib + +guile = $(OUTDIR)/guile.obj + +OBJS = \ + $(OUTDIR)/ar.obj \ + $(OUTDIR)/arscan.obj \ + $(OUTDIR)/commands.obj \ + $(OUTDIR)/default.obj \ + $(OUTDIR)/dir.obj \ + $(OUTDIR)/expand.obj \ + $(OUTDIR)/file.obj \ + $(OUTDIR)/function.obj \ + $(OUTDIR)/getloadavg.obj \ + $(OUTDIR)/getopt.obj \ + $(OUTDIR)/getopt1.obj \ + $(OUTDIR)/hash.obj \ + $(OUTDIR)/implicit.obj \ + $(OUTDIR)/job.obj \ + $(OUTDIR)/load.obj \ + $(OUTDIR)/main.obj \ + $(OUTDIR)/misc.obj \ + $(OUTDIR)/output.obj \ + $(OUTDIR)/read.obj \ + $(OUTDIR)/remake.obj \ + $(OUTDIR)/remote-stub.obj \ + $(OUTDIR)/rule.obj \ + $(OUTDIR)/signame.obj \ + $(OUTDIR)/strcache.obj \ + $(OUTDIR)/variable.obj \ + $(OUTDIR)/version.obj \ + $(OUTDIR)/vpath.obj \ + $(OUTDIR)/glob.obj \ + $(OUTDIR)/fnmatch.obj \ + $(OUTDIR)/dirent.obj \ + $(OUTDIR)/pathstuff.obj \ + $(OUTDIR)/posixfcn.obj \ + $(guile) + +$(OUTDIR)/make.exe: $(OUTDIR) $(OBJS) + $(LINK) @<< + $(LDFLAGS) $(LIBS) $(OBJS) +<< + +.c{$(OUTDIR)}.obj: + $(CC) $(CFLAGS) /c $< + +$(OUTDIR)/glob.obj : glob/glob.c + $(CC) $(CFLAGS) /c $? +$(OUTDIR)/fnmatch.obj : glob/fnmatch.c + $(CC) $(CFLAGS) /c $? +$(OUTDIR)/dirent.obj : w32/compat/dirent.c + $(CC) $(CFLAGS) /c $? +$(OUTDIR)/posixfcn.obj : w32/compat/posixfcn.c + $(CC) $(CFLAGS) /c $? +$(OUTDIR)/pathstuff.obj : w32/pathstuff.c + $(CC) $(CFLAGS) /c $? + +# --------------- DEPENDENCIES +# + +# .deps/alloca.Po +# dummy + +# .deps/ar.Po +$(OUTDIR)/ar.obj: ar.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + +# .deps/arscan.Po +$(OUTDIR)/arscan.obj: arscan.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + +# .deps/commands.Po +$(OUTDIR)/commands.obj: commands.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + variable.h job.h output.h \ + commands.h + +# .deps/default.Po +$(OUTDIR)/default.obj: default.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h rule.h dep.h job.h output.h \ + commands.h + +# .deps/dir.Po +$(OUTDIR)/dir.obj: dir.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + hash.h filedef.h dep.h \ + +# .deps/expand.Po +$(OUTDIR)/expand.obj: expand.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h output.h \ + commands.h variable.h rule.h + +# .deps/file.Po +$(OUTDIR)/file.obj: file.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h \ + debug.h + +# .deps/function.Po +$(OUTDIR)/function.obj: function.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + variable.h dep.h job.h output.h \ + commands.h debug.h + +# .deps/getloadavg.Po +# dummy + +# .deps/getopt.Po +$(OUTDIR)/getopt.obj: getopt.c config.h \ + +# .deps/getopt1.Po +$(OUTDIR)/getopt1.obj: getopt1.c config.h getopt.h \ + +# .deps/guile.Po +$(OUTDIR)/guile.obj: guile.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + debug.h filedef.h hash.h \ + dep.h variable.h \ + gmk-default.h + +# .deps/hash.Po +$(OUTDIR)/hash.obj: hash.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/implicit.Po +$(OUTDIR)/implicit.obj: implicit.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h rule.h \ + dep.h debug.h variable.h job.h output.h \ + commands.h + +# .deps/job.Po +$(OUTDIR)/job.obj: job.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + job.h output.h \ + debug.h filedef.h hash.h \ + commands.h variable.h + +# .deps/load.Po +$(OUTDIR)/load.obj: load.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + debug.h filedef.h hash.h \ + variable.h + +# .deps/loadapi.Po +$(OUTDIR)/loadapi.obj: loadapi.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + variable.h dep.h + +# .deps/loadavg-getloadavg.Po +# dummy + +# .deps/main.Po +$(OUTDIR)/main.obj: main.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + variable.h job.h output.h \ + commands.h rule.h debug.h \ + getopt.h + +# .deps/misc.Po +$(OUTDIR)/misc.obj: misc.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + debug.h \ + +# .deps/output.Po +$(OUTDIR)/output.obj: output.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + job.h output.h \ + +# .deps/read.Po +$(OUTDIR)/read.obj: read.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h rule.h \ + debug.h + +# .deps/remake.Po +$(OUTDIR)/remake.obj: remake.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + output.h \ + commands.h dep.h variable.h \ + debug.h + +# .deps/remote-cstms.Po +# dummy + +# .deps/remote-stub.Po +$(OUTDIR)/remote-stub.obj: remote-stub.c makeint.h \ + config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + output.h \ + commands.h + +# .deps/rule.Po +$(OUTDIR)/rule.obj: rule.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h rule.h + +# .deps/signame.Po +$(OUTDIR)/signame.obj: signame.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + +# .deps/strcache.Po +$(OUTDIR)/strcache.obj: strcache.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/variable.Po +$(OUTDIR)/variable.obj: variable.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h rule.h + +# .deps/version.Po +$(OUTDIR)/version.obj: version.c config.h + +# .deps/vmsjobs.Po +# dummy + +# .deps/vpath.Po +$(OUTDIR)/vpath.obj: vpath.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + variable.h diff --git a/README b/README new file mode 100644 index 0000000..9ed662a --- /dev/null +++ b/README @@ -0,0 +1,178 @@ +This directory contains the 4.1 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. + +For general 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 are broken and cannot process the Makefile for +GNU Make. If you get errors from your system's Make when building GNU +Make, try using 'build.sh' instead. + + +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 hints on +how to build GNU make once these tools are available. We make no +guarantees about the contents or quality of the latest code in the Git +repository: it is not unheard of for code that is known to be broken to +be checked in. Use at your own risk. + + +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. + +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-2014 Free 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/README.Amiga b/README.Amiga new file mode 100644 index 0000000..f9be348 --- /dev/null +++ b/README.Amiga @@ -0,0 +1,77 @@ +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. make itself is not necessary, there +is an smakefile. + +1. Copy config.ami to config.h +2. If you use make to compile, copy Makefile.ami to Makefile and + glob/Makefile.ami to glob/Makefile. Copy make into the current + directory. + +3. Run smake/make + +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-2014 Free 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/README.DOS b/README.DOS new file mode 100644 index 0000000..335661c --- /dev/null +++ b/README.DOS @@ -0,0 +1,340 @@ +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 "install:" and "clean:" 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. Invoke the 'configure.bat' batch file. + + If you are building Make in-place, i.e. in the same directory + where its sources are kept, just type "configure.bat" and press + [Enter]. Otherwise, you need to supply the path to the source + directory as an argument to the batch file, like this: + + c:\djgpp\gnu\make-4.1\configure.bat c:/djgpp/gnu/make-4.1 + + Note the forward slashes in the source path argument: you MUST + use them here. + + 3. If configure.bat doesn't find a working Make, it will suggest to + use the 'dosbuild.bat' batch file to build Make. Either do as it + suggests or install another Make program (a pre-compiled binary + should be available from the usual DJGPP sites) and rerun + configure.bat. + + 4. If you will need to run Make on machines without an FPU, you + might consider building a version of Make which doesn't issue + floating-point instructions (they don't help much on MSDOS + anyway). To this end, edit the Makefile created by + configure.bat and add -DNO_FLOAT to the value of CPPFLAGS. + + 5. Invoke Make. + + If you are building from outside of the source directory, you + need to tell Make where the sources are, like this: + + make srcdir=c:/djgpp/gnu/make-4.1 + + (configure.bat will tell you this when it finishes). You MUST + use a full, not relative, name of the source directory here, or + else Make might fail. + + 6. After Make finishes, if you have a Unix-style shell installed, + you can use the 'install' target to install the package. You + will also need GNU Fileutils and GNU Sed for this (they should + be available from the DJGPP sites). + + By default, GNU make will install into your DJGPP installation + area. If you wish to use a different directory, override the + DESTDIR variable when invoking "make install", like this: + + make install DESTDIR=c:/other/dir + + This causes the make executable to be placed in c:/other/dir/bin, + the man pages in c:/other/dir/man, etc. + + Without a Unix-style shell, you will have to install programs + and the docs manually. Copy make.exe to a directory on your + PATH, make.i* info files to your Info directory, and update the + file 'dir' in your Info directory by adding the following item + to the main menu: + + * Make: (make.info). The GNU make utility. + + If you have the 'install-info' program (from the GNU Texinfo + package), it will do that for you if you invoke it like this: + + install-info --info-dir=c:/djgpp/info c:/djgpp/info/make.info + + (If your Info directory is other than C:\DJGPP\INFO, change this + command accordingly.) + + 7. The 'clean' targets also require Unix-style shell, and GNU Sed + and 'rm' programs (the latter from Fileutils). + + 8. To run the test suite, type "make check". This requires a Unix + shell (I used the DJGPP port of Bash 2.03), Perl, Sed, Fileutils + and Sh-utils. + + +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-2014 Free 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/README.OS2 b/README.OS2 new file mode 100644 index 0000000..9e2045e --- /dev/null +++ b/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-2014 Free 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/README.VMS b/README.VMS new file mode 100644 index 0000000..2ff553c --- /dev/null +++ b/README.VMS @@ -0,0 +1,284 @@ +This version of GNU make has been tested on +OpenVMS V8.3 (Alpha) and V8.4 (Integrity). + +Build instructions +------------------ +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 + $ mc sys$disk:[]1st-make clean ! ignore any file not found messages + $ mc sys$disk:[]1st-make + Verify your 2nd version + $ copy make.exe 2nd-make.exe + $ mc sys$disk:[]2nd-make clean + $ mc sys$disk:[]2nd-make + 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. + +Changes since GNU make 3.82 +--------------------------- + +Fix build problems. + +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 VMS does not support running multiple commands simultaneously. + +Changes for GNU make 3.82 + +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. + +Changes for GNU make 3.80 + +. 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 Kämpf , 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. + + +New in 3.78.1: + +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. + +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 Kämpf + +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. + +New for 3.77: + +/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. + + +New for 3.76: + +John W. Eaton has updated the VMS port to support libraries and VPATH. + + +To build Make, simply type @makefile. This should compile all the +necessary files and link Make. There is also a file called +makefile.vms. If you already have GNU Make built you can just use +Make with this makefile to rebuild. + +Here are some notes about GNU Make for VMS: + +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 \@. + + +VMS changes made for 3.74.3 + +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. + +------------------------------------------------------------------------------- +Copyright (C) 1996-2014 Free 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/README.W32 b/README.W32 new file mode 100644 index 0000000..e52e406 --- /dev/null +++ b/README.W32 @@ -0,0 +1,309 @@ +This version of GNU make has been tested on +Microsoft Windows 2000/XP/2003/Vista/7/2008. +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). + +It also builds with MSVC 2.x, 4.x, 5.x, 6.x, and 2003 as well as +with .NET 7.x and .NET 2003. + +As of version 4.0, a build with Guile is supported (tested with Guile +2.0.3). To build with Guile, you will need, in addition to Guile +itself, its dependency libraries and the pkg-config program. The +latter is used to figure out which compilation and link switches and +libraries need to be mentioned on the compiler command lines to +correctly link with Guile. A Windows port of pkg-config can be found +on the Windows download page of the GTK+ project: + + http://www.gtk.org/download/win32.php + +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. + +The Windows 32-bit port of GNU make is maintained jointly by various +people. It was originally made by Rob Tulloh. + + +Do this first, regardless of the build method you choose: +--------------------------------------------------------- + + 1. At the Windows command prompt run: + + if not exist NMakefile copy NMakefile.template NMakefile + if not exist config.h copy config.h.W32 config.h + + Then edit config.h 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'). + + +Using make_msvc_net2003.vcproj +------------------------------ + + 2. Open make_msvc_net2003.vcproj in MSVS71 or MSVC71 or any compatible IDE, + then build this project as usual. There's also a solution file for + Studio 2003. + + +Building with (MinGW-)GCC using build_w32.bat +--------------------------------------------- + + 2. Open a W32 command prompt for your installed (MinGW-)GCC, setup a + correct PATH and other environment variables for it, then execute ... + + build_w32.bat gcc + + This produces gnumake.exe in the current 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 or NMakefile +---------------------------------------------------------- + + 2. Open a W32 command prompt for your installed (MSVC++-)cl, setup a + correct PATH and other environment variables for it (usually via + executing vcvars32.bat or vsvars32.bat from the cl-installation, + e.g. "%VS71COMNTOOLS%vsvars32.bat"; or using a corresponding start + menue entry from the cl-installation), then execute EITHER ... + + build_w32.bat + + (this produces WinDebug/gnumake.exe and WinRel/gnumake.exe) + + ... OR ... + + nmake /f NMakefile + + (this produces WinDebug/make.exe and WinRel/make.exe). + + The batch file will probe for Guile installation, and will build + gnumake.exe with Guile if it finds it. If you have Guile + installed, but want to build Make without Guile support, type + + build_w32.bat --without-guile + +------------------- +-- 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, with 1 + limitation: The number of concurrent processes has a hard + limit of 64, due to the way this port implements waiting for + its subprocesses. + +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. + +GNU make test suite: + + I verified all functionality with a slightly modified version + of make-test-4.1 (modifications to get test suite to run + on Windows NT). All tests pass in an environment that includes + sh.exe. Tests were performed on both Windows NT and Windows 95. + +Pathnames and white space: + + Unlike Unix, Windows 95/NT systems encourage pathnames which + 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-2014 Free 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/README.customs b/README.customs new file mode 100644 index 0000000..30d98ac --- /dev/null +++ b/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-2014 Free 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/SCOPTIONS b/SCOPTIONS new file mode 100644 index 0000000..f89daae --- /dev/null +++ b/SCOPTIONS @@ -0,0 +1,13 @@ +ERRORREXX +OPTIMIZE +NOVERSION +OPTIMIZERTIME +OPTIMIZERALIAS +DEFINE INCLUDEDIR="include:" +DEFINE LIBDIR="lib:" +DEFINE NO_ALLOCA +DEFINE NO_FLOAT +DEFINE NO_ARCHIVES +IGNORE=161 +IGNORE=100 +STARTUP=cres diff --git a/SMakefile b/SMakefile new file mode 100644 index 0000000..2b55f22 --- /dev/null +++ b/SMakefile @@ -0,0 +1,449 @@ +# -*-Makefile-*- for building GNU make with smake +# +# NOTE: If you have no 'make' program at all to process this makefile, +# run 'build.sh' instead. +# +# Copyright (C) 1995-2014 Free 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 . + +# +# Makefile for GNU Make +# + +# Ultrix 2.2 make doesn't expand the value of VPATH. +VPATH = /make-4.1/ +# This must repeat the value, because configure will remove 'VPATH = .'. +srcdir = /make-4.1/ + +CC = sc +RM = delete +MAKE = smake + +CFLAGS = +CPPFLAGS = +LDFLAGS = + +# Define these for your system as follows: +# -DNO_ARCHIVES To disable 'ar' archive support. +# -DNO_FLOAT To avoid using floating-point numbers. +# -DENUM_BITFIELDS If the compiler isn't GCC but groks enum foo:2. +# Some compilers apparently accept this +# without complaint but produce losing code, +# so beware. +# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline. +# See also 'config.h'. +defines = + +# Which flavor of remote job execution support to use. +# The code is found in 'remote-$(REMOTE).c'. +REMOTE = stub + +# If you are using the GNU C library, or have the GNU getopt functions in +# your C library, you can comment these out. +GETOPT = getopt.o getopt1.o +GETOPT_SRC = $(srcdir)getopt.c $(srcdir)getopt1.c $(srcdir)getopt.h + +# If you are using the GNU C library, or have the GNU glob functions in +# your C library, you can comment this out. GNU make uses special hooks +# into the glob functions to be more efficient (by using make's directory +# cache for globbing), so you must use the GNU functions even if your +# system's C library has the 1003.2 glob functions already. Also, the glob +# functions in the AIX and HPUX C libraries are said to be buggy. +GLOB = Lib glob/glob.lib + +# If your system doesn't have alloca, or the one provided is bad, define this. +ALLOCA = alloca.o +ALLOCA_SRC = $(srcdir)alloca.c + +# If your system needs extra libraries loaded in, define them here. +# System V probably need -lPW for alloca. HP-UX 7.0's alloca in +# libPW.a is broken on HP9000s300 and HP9000s400 machines. Use +# alloca.c instead on those machines. +LOADLIBES = + +# Any extra object files your system needs. +extras = amiga.o + +# Common prefix for machine-independent installed files. +prefix = +# Common prefix for machine-dependent installed files. +exec_prefix = + +# Directory to install 'make' in. +bindir = sc:c +# Directory to find libraries in for '-lXXX'. +libdir = lib: +# Directory to search by default for included makefiles. +includedir = include: +# Directory to install the Info files in. +infodir = doc: +# Directory to install the man page in. +mandir = t: +# Number to put on the man page filename. +manext = 1 +# Prefix to put on installed 'make' binary file name. +binprefix = +# Prefix to put on installed 'make' man page file name. +manprefix = $(binprefix) + +# Whether or not make needs to be installed setgid. +# The value should be either 'true' or 'false'. +# On many systems, the getloadavg function (used to implement the '-l' +# switch) will not work unless make is installed setgid kmem. +install_setgid = false +# Install make setgid to this group so it can read /dev/kmem. +group = sys + +# Program to install 'make'. +INSTALL_PROGRAM = copy +# Program to install the man page. +INSTALL_DATA = copy +# Generic install program. +INSTALL = copy + +# Program to format Texinfo source into Info files. +MAKEINFO = makeinfo +# Program to format Texinfo source into DVI files. +TEXI2DVI = texi2dvi + +# Programs to make tags files. +ETAGS = etags -w +CTAGS = ctags -w + +#guile = guile.o + +objs = commands.o job.o dir.o file.o misc.o main.o read.o remake.o \ + rule.o implicit.o default.o variable.o expand.o function.o \ + vpath.o version.o ar.o arscan.o signame.o strcache.o hash.o \ + output.o remote-$(REMOTE).o $(GLOB) $(GETOPT) $(ALLOCA) \ + $(extras) $(guile) + +srcs = $(srcdir)commands.c $(srcdir)job.c $(srcdir)dir.c \ + $(srcdir)file.c $(srcdir)getloadavg.c $(srcdir)misc.c \ + $(srcdir)main.c $(srcdir)read.c $(srcdir)remake.c \ + $(srcdir)rule.c $(srcdir)implicit.c $(srcdir)default.c \ + $(srcdir)variable.c $(srcdir)expand.c $(srcdir)function.c \ + $(srcdir)vpath.c $(srcdir)version.c $(srcdir)hash.c \ + $(srcdir)guile.c $(srcdir)remote-$(REMOTE).c \ + $(srcdir)ar.c $(srcdir)arscan.c $(srcdir)strcache.c \ + $(srcdir)signame.c $(srcdir)signame.h $(GETOPT_SRC) \ + $(srcdir)commands.h $(srcdir)dep.h $(srcdir)file.h \ + $(srcdir)job.h $(srcdir)makeint.h $(srcdir)rule.h \ + $(srcdir)output.c $(srcdir)output.h \ + $(srcdir)variable.h $(ALLOCA_SRC) $(srcdir)config.h.in + + +.SUFFIXES: +.SUFFIXES: .o .c .h .ps .dvi .info .texinfo + +all: make +info: make.info +dvi: make.dvi +# Some makes apparently use .PHONY as the default goal if it is before 'all'. +.PHONY: all check info dvi + +make.info: make.texinfo + $(MAKEINFO) -I$(srcdir) $(srcdir)make.texinfo -o make.info + +make.dvi: make.texinfo + $(TEXI2DVI) $(srcdir)make.texinfo + +make.ps: make.dvi + dvi2ps make.dvi > make.ps + +make: $(objs) glob/glob.lib + $(CC) Link $(LDFLAGS) $(objs) $(LOADLIBES) To make.new + -delete quiet make + rename make.new make + +# -I. is needed to find config.h in the build directory. +.c.o: + $(CC) $(defines) IDir "" IDir $(srcdir)glob \ + $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) + +glob/glob.lib: + execute << + cd glob + smake +< + +tagsrcs = $(srcs) $(srcdir)remote-*.c +TAGS: $(tagsrcs) + $(ETAGS) $(tagsrcs) +tags: $(tagsrcs) + $(CTAGS) $(tagsrcs) + +.PHONY: install installdirs +install: + copy make sc:c + +loadavg: loadavg.c config.h + $(CC) $(defines) -DTEST -I. -I$(srcdir) $(CFLAGS) $(LDFLAGS) \ + loadavg.c $(LOADLIBES) -o $@ + +clean: glob-clean + -$(RM) -f make loadavg *.o core make.dvi + +distclean: clean glob-realclean + -$(RM) -f Makefile config.h config.status build.sh + -$(RM) -f config.log config.cache + -$(RM) -f TAGS tags + -$(RM) -f make.?? make.??s make.log make.toc make.*aux + -$(RM) -f loadavg.c + +realclean: distclean + -$(RM) -f make.info* + +mostlyclean: clean + +.PHONY: glob-clean glob-realclean + +glob-clean glob-realclean: + execute << + cd glob + smake $@ +< + +# --------------- DEPENDENCIES +# + +# .deps/alloca.Po +# dummy + +# .deps/ar.Po +ar.o: ar.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + +# .deps/arscan.Po +arscan.o: arscan.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + +# .deps/commands.Po +commands.o: commands.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + variable.h job.h output.h \ + commands.h + +# .deps/default.Po +default.o: default.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h rule.h dep.h job.h output.h \ + commands.h + +# .deps/dir.Po +dir.o: dir.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + hash.h filedef.h dep.h \ + +# .deps/expand.Po +expand.o: expand.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h output.h \ + commands.h variable.h rule.h + +# .deps/file.Po +file.o: file.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h \ + debug.h + +# .deps/function.Po +function.o: function.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + variable.h dep.h job.h output.h \ + commands.h debug.h + +# .deps/getloadavg.Po +# dummy + +# .deps/getopt.Po +getopt.o: getopt.c config.h \ + +# .deps/getopt1.Po +getopt1.o: getopt1.c config.h getopt.h \ + +# .deps/guile.Po +guile.o: guile.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + debug.h filedef.h hash.h \ + dep.h variable.h \ + gmk-default.h + +# .deps/hash.Po +hash.o: hash.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/implicit.Po +implicit.o: implicit.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h rule.h \ + dep.h debug.h variable.h job.h output.h \ + commands.h + +# .deps/job.Po +job.o: job.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + job.h output.h \ + debug.h filedef.h hash.h \ + commands.h variable.h + +# .deps/load.Po +load.o: load.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + debug.h filedef.h hash.h \ + variable.h + +# .deps/loadapi.Po +loadapi.o: loadapi.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + variable.h dep.h + +# .deps/loadavg-getloadavg.Po +# dummy + +# .deps/main.Po +main.o: main.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + variable.h job.h output.h \ + commands.h rule.h debug.h \ + getopt.h + +# .deps/misc.Po +misc.o: misc.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + debug.h \ + +# .deps/output.Po +output.o: output.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + job.h output.h \ + +# .deps/read.Po +read.o: read.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h rule.h \ + debug.h + +# .deps/remake.Po +remake.o: remake.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + output.h \ + commands.h dep.h variable.h \ + debug.h + +# .deps/remote-cstms.Po +# dummy + +# .deps/remote-stub.Po +remote-stub.o: remote-stub.c makeint.h \ + config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + output.h \ + commands.h + +# .deps/rule.Po +rule.o: rule.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h rule.h + +# .deps/signame.Po +signame.o: signame.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + +# .deps/strcache.Po +strcache.o: strcache.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/variable.Po +variable.o: variable.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h job.h output.h \ + commands.h variable.h rule.h + +# .deps/version.Po +version.o: version.c config.h + +# .deps/vmsjobs.Po +# dummy + +# .deps/vpath.Po +vpath.o: vpath.c makeint.h config.h \ + gnumake.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + variable.h diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..53d7ef1 --- /dev/null +++ b/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-2014 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/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..98f09b6 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1435 @@ +# generated automatically by aclocal 1.14.1 -*- Autoconf -*- + +# Copyright (C) 1996-2013 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'.])]) + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) +# +# Copyright © 2004 Scott James Remnant . +# +# 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 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# 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. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +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 +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# 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]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +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 +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +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 +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# 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 +])# PKG_CHECK_MODULES + +# Copyright (C) 2002-2013 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.14' +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.14.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.14.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [AC_LANG_PUSH([C]) + am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + AC_LANG_POP([C])]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2013 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], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2013 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-2013 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-2013 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. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _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. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + + +# Copyright (C) 1996-2013 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-2013 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. 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 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-2013 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}" != 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-2013 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-2013 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 to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2013 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 +]) + +# Copyright (C) 2003-2013 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_MKDIR_P +# --------------- +# Check for 'mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl FIXME we are no longer going to remove this! adjust warning +dnl FIXME message accordingly. +AC_DIAGNOSE([obsolete], +[$0: this macro is deprecated, and will soon be removed. +You should use the Autoconf-provided 'AC][_PROG_MKDIR_P' macro instead, +and use '$(MKDIR_P)' instead of '$(mkdir_p)'in your Makefile.am files.]) +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2013 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-2013 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-2013 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-2013 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-2013 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-2013 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-2013 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-2013 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([config/dospaths.m4]) +m4_include([config/gettext.m4]) +m4_include([config/iconv.m4]) +m4_include([config/intlmacosx.m4]) +m4_include([config/lib-ld.m4]) +m4_include([config/lib-link.m4]) +m4_include([config/lib-prefix.m4]) +m4_include([config/nls.m4]) +m4_include([config/po.m4]) +m4_include([config/progtest.m4]) +m4_include([acinclude.m4]) diff --git a/alloca.c b/alloca.c new file mode 100644 index 0000000..02ac921 --- /dev/null +++ b/alloca.c @@ -0,0 +1,503 @@ +/* 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. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +#ifdef emacs +#include "blockinput.h" +#endif + +/* If compiling with GCC 2, this file's not needed. */ +#if !defined (__GNUC__) || __GNUC__ < 2 + +/* If someone has defined alloca as a macro, + there must be some other way alloca is supposed to work. */ +#ifndef alloca + +#ifdef emacs +#ifdef static +/* actually, only want this if static is defined as "" + -- this is for usg, in which emacs must undefine static + in order to make unexec workable + */ +#ifndef STACK_DIRECTION +you +lose +-- must know STACK_DIRECTION at compile-time +#endif /* STACK_DIRECTION undefined */ +#endif /* static */ +#endif /* emacs */ + +/* If your stack is a linked list of frames, you have to + provide an "address metric" ADDRESS_FUNCTION macro. */ + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) +long i00afunc (); +#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) +#else +#define ADDRESS_FUNCTION(arg) &(arg) +#endif + +#if __STDC__ +typedef void *pointer; +#else +typedef char *pointer; +#endif + +#ifndef NULL +#define NULL 0 +#endif + +/* Different portions of Emacs need to call different versions of + malloc. The Emacs executable needs alloca to call xmalloc, because + ordinary malloc isn't protected from input signals. On the other + hand, the utilities in lib-src need alloca to call malloc; some of + them are very simple, and don't have an xmalloc routine. + + Non-Emacs programs expect this to call use xmalloc. + + Callers below should use malloc. */ + +#ifndef emacs +#define malloc xmalloc +#endif +extern pointer malloc (); + +/* Define STACK_DIRECTION if you know the direction of stack + growth for your system; otherwise it will be automatically + deduced at run-time. + + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ + +#ifndef STACK_DIRECTION +#define STACK_DIRECTION 0 /* Direction unknown. */ +#endif + +#if STACK_DIRECTION != 0 + +#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ + +#else /* STACK_DIRECTION == 0; need run-time code. */ + +static int stack_dir; /* 1 or -1 once known. */ +#define STACK_DIR stack_dir + +static void +find_stack_direction (void) +{ + static char *addr = NULL; /* Address of first 'dummy', once known. */ + auto char dummy; /* To get stack address. */ + + if (addr == NULL) + { /* Initial entry. */ + addr = ADDRESS_FUNCTION (dummy); + + find_stack_direction (); /* Recurse once. */ + } + else + { + /* Second entry. */ + if (ADDRESS_FUNCTION (dummy) > addr) + stack_dir = 1; /* Stack grew upward. */ + else + stack_dir = -1; /* Stack grew downward. */ + } +} + +#endif /* STACK_DIRECTION == 0 */ + +/* An "alloca header" is used to: + (a) chain together all alloca'ed blocks; + (b) keep track of stack depth. + + It is very important that sizeof(header) agree with malloc + alignment chunk size. The following default should work okay. */ + +#ifndef ALIGN_SIZE +#define ALIGN_SIZE sizeof(double) +#endif + +typedef union hdr +{ + char align[ALIGN_SIZE]; /* To force sizeof(header). */ + struct + { + union hdr *next; /* For chaining headers. */ + char *deep; /* For stack depth measure. */ + } h; +} header; + +static header *last_alloca_header = NULL; /* -> last alloca header. */ + +/* Return a pointer to at least SIZE bytes of storage, + which will be automatically reclaimed upon exit from + the procedure that called alloca. Originally, this space + was supposed to be taken from the current stack frame of the + caller, but that method cannot be made to work for some + implementations of C, for example under Gould's UTX/32. */ + +pointer +alloca (unsigned size) +{ + auto char probe; /* Probes stack depth: */ + register char *depth = ADDRESS_FUNCTION (probe); + +#if STACK_DIRECTION == 0 + if (STACK_DIR == 0) /* Unknown growth direction. */ + find_stack_direction (); +#endif + + /* Reclaim garbage, defined as all alloca'd storage that + was allocated from deeper in the stack than currently. */ + + { + register header *hp; /* Traverses linked list. */ + +#ifdef emacs + BLOCK_INPUT; +#endif + + for (hp = last_alloca_header; hp != NULL;) + if ((STACK_DIR > 0 && hp->h.deep > depth) + || (STACK_DIR < 0 && hp->h.deep < depth)) + { + register header *np = hp->h.next; + + free ((pointer) hp); /* Collect garbage. */ + + hp = np; /* -> next header. */ + } + else + break; /* Rest are not deeper. */ + + last_alloca_header = hp; /* -> last valid storage. */ + +#ifdef emacs + UNBLOCK_INPUT; +#endif + } + + if (size == 0) + return NULL; /* No allocation required. */ + + /* Allocate combined header + user data storage. */ + + { + register pointer new = malloc (sizeof (header) + size); + /* Address of header. */ + + if (new == 0) + abort(); + + ((header *) new)->h.next = last_alloca_header; + ((header *) new)->h.deep = depth; + + last_alloca_header = (header *) new; + + /* User storage begins just after header. */ + + return (pointer) ((char *) new + sizeof (header)); + } +} + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) + +#ifdef DEBUG_I00AFUNC +#include +#endif + +#ifndef CRAY_STACK +#define CRAY_STACK +#ifndef CRAY2 +/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ +struct stack_control_header + { + long shgrow:32; /* Number of times stack has grown. */ + long shaseg:32; /* Size of increments to stack. */ + long shhwm:32; /* High water mark of stack. */ + long shsize:32; /* Current size of stack (all segments). */ + }; + +/* The stack segment linkage control information occurs at + the high-address end of a stack segment. (The stack + grows from low addresses to high addresses.) The initial + part of the stack segment linkage control information is + 0200 (octal) words. This provides for register storage + for the routine which overflows the stack. */ + +struct stack_segment_linkage + { + long ss[0200]; /* 0200 overflow words. */ + long sssize:32; /* Number of words in this segment. */ + long ssbase:32; /* Offset to stack base. */ + long:32; + long sspseg:32; /* Offset to linkage control of previous + segment of stack. */ + long:32; + long sstcpt:32; /* Pointer to task common address block. */ + long sscsnm; /* Private control structure number for + microtasking. */ + long ssusr1; /* Reserved for user. */ + long ssusr2; /* Reserved for user. */ + long sstpid; /* Process ID for pid based multi-tasking. */ + long ssgvup; /* Pointer to multitasking thread giveup. */ + long sscray[7]; /* Reserved for Cray Research. */ + long ssa0; + long ssa1; + long ssa2; + long ssa3; + long ssa4; + long ssa5; + long ssa6; + long ssa7; + long sss0; + long sss1; + long sss2; + long sss3; + long sss4; + long sss5; + long sss6; + long sss7; + }; + +#else /* CRAY2 */ +/* The following structure defines the vector of words + returned by the STKSTAT library routine. */ +struct stk_stat + { + long now; /* Current total stack size. */ + long maxc; /* Amount of contiguous space which would + be required to satisfy the maximum + stack demand to date. */ + long high_water; /* Stack high-water mark. */ + long overflows; /* Number of stack overflow ($STKOFEN) calls. */ + long hits; /* Number of internal buffer hits. */ + long extends; /* Number of block extensions. */ + long stko_mallocs; /* Block allocations by $STKOFEN. */ + long underflows; /* Number of stack underflow calls ($STKRETN). */ + long stko_free; /* Number of deallocations by $STKRETN. */ + long stkm_free; /* Number of deallocations by $STKMRET. */ + long segments; /* Current number of stack segments. */ + long maxs; /* Maximum number of stack segments so far. */ + long pad_size; /* Stack pad size. */ + long current_address; /* Current stack segment address. */ + long current_size; /* Current stack segment size. This + number is actually corrupted by STKSTAT to + include the fifteen word trailer area. */ + long initial_address; /* Address of initial segment. */ + long initial_size; /* Size of initial segment. */ + }; + +/* The following structure describes the data structure which trails + any stack segment. I think that the description in 'asdef' is + out of date. I only describe the parts that I am sure about. */ + +struct stk_trailer + { + long this_address; /* Address of this block. */ + long this_size; /* Size of this block (does not include + this trailer). */ + long unknown2; + long unknown3; + long link; /* Address of trailer block of previous + segment. */ + long unknown5; + long unknown6; + long unknown7; + long unknown8; + long unknown9; + long unknown10; + long unknown11; + long unknown12; + long unknown13; + long unknown14; + }; + +#endif /* CRAY2 */ +#endif /* not CRAY_STACK */ + +#ifdef CRAY2 +/* Determine a "stack measure" for an arbitrary ADDRESS. + I doubt that "lint" will like this much. */ + +static long +i00afunc (long *address) +{ + struct stk_stat status; + struct stk_trailer *trailer; + long *block, size; + long result = 0; + + /* We want to iterate through all of the segments. The first + step is to get the stack status structure. We could do this + more quickly and more directly, perhaps, by referencing the + $LM00 common block, but I know that this works. */ + + STKSTAT (&status); + + /* Set up the iteration. */ + + trailer = (struct stk_trailer *) (status.current_address + + status.current_size + - 15); + + /* There must be at least one stack segment. Therefore it is + a fatal error if "trailer" is null. */ + + if (trailer == 0) + abort (); + + /* Discard segments that do not contain our argument address. */ + + while (trailer != 0) + { + block = (long *) trailer->this_address; + size = trailer->this_size; + if (block == 0 || size == 0) + abort (); + trailer = (struct stk_trailer *) trailer->link; + if ((block <= address) && (address < (block + size))) + break; + } + + /* Set the result to the offset in this segment and add the sizes + of all predecessor segments. */ + + result = address - block; + + if (trailer == 0) + { + return result; + } + + do + { + if (trailer->this_size <= 0) + abort (); + result += trailer->this_size; + trailer = (struct stk_trailer *) trailer->link; + } + while (trailer != 0); + + /* We are done. Note that if you present a bogus address (one + not in any segment), you will get a different number back, formed + from subtracting the address of the first block. This is probably + not what you want. */ + + return (result); +} + +#else /* not CRAY2 */ +/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. + Determine the number of the cell within the stack, + given the address of the cell. The purpose of this + routine is to linearize, in some sense, stack addresses + for alloca. */ + +static long +i00afunc (long address) +{ + long stkl = 0; + + long size, pseg, this_segment, stack; + long result = 0; + + struct stack_segment_linkage *ssptr; + + /* Register B67 contains the address of the end of the + current stack segment. If you (as a subprogram) store + your registers on the stack and find that you are past + the contents of B67, you have overflowed the segment. + + B67 also points to the stack segment linkage control + area, which is what we are really interested in. */ + + stkl = CRAY_STACKSEG_END (); + ssptr = (struct stack_segment_linkage *) stkl; + + /* If one subtracts 'size' from the end of the segment, + one has the address of the first word of the segment. + + If this is not the first segment, 'pseg' will be + nonzero. */ + + pseg = ssptr->sspseg; + size = ssptr->sssize; + + this_segment = stkl - size; + + /* It is possible that calling this routine itself caused + a stack overflow. Discard stack segments which do not + contain the target address. */ + + while (!(this_segment <= address && address <= stkl)) + { +#ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); +#endif + if (pseg == 0) + break; + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + this_segment = stkl - size; + } + + result = address - this_segment; + + /* If you subtract pseg from the current end of the stack, + you get the address of the previous stack segment's end. + This seems a little convoluted to me, but I'll bet you save + a cycle somewhere. */ + + while (pseg != 0) + { +#ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o\n", pseg, size); +#endif + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + result += size; + } + return (result); +} + +#endif /* not CRAY2 */ +#endif /* CRAY */ + +#endif /* no alloca */ +#endif /* not GCC version 2 */ diff --git a/amiga.c b/amiga.c new file mode 100644 index 0000000..1ef949c --- /dev/null +++ b/amiga.c @@ -0,0 +1,117 @@ +/* Running commands on Amiga +Copyright (C) 1995-2014 Free 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/amiga.h b/amiga.h new file mode 100644 index 0000000..00bca4f --- /dev/null +++ b/amiga.h @@ -0,0 +1,18 @@ +/* Definitions for amiga specific things +Copyright (C) 1995-2014 Free 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/ar.c b/ar.c new file mode 100644 index 0000000..675572a --- /dev/null +++ b/ar.c @@ -0,0 +1,328 @@ +/* Interface to 'ar' archives for GNU Make. +Copyright (C) 1988-2014 Free 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, 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 + unsigned int size; + struct nameseq *chain; + unsigned int n; + }; + +/* This function is called by 'ar_scan' to match one archive + element against the pattern in STATE. */ + +static long int +ar_glob_match (int desc UNUSED, const char *mem, int truncated UNUSED, + long int hdrpos UNUSED, long int datapos UNUSED, + long int size UNUSED, long int date UNUSED, int uid UNUSED, + int gid UNUSED, 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 +glob_pattern_p (const char *pattern, int quote) +{ + const char *p; + int opened = 0; + + for (p = pattern; *p != '\0'; ++p) + switch (*p) + { + case '?': + case '*': + return 1; + + case '\\': + if (quote) + ++p; + break; + + case '[': + opened = 1; + break; + + case ']': + if (opened) + return 1; + break; + } + + return 0; +} + +/* Glob for MEMBER_PATTERN in archive ARNAME. + Return a malloc'd chain of matching elements (or nil if none). */ + +struct nameseq * +ar_glob (const char *arname, const char *member_pattern, unsigned int size) +{ + struct ar_glob_state state; + struct nameseq *n; + const char **names; + unsigned int i; +#ifdef VMS + char *vms_member_pattern; +#endif + if (! glob_pattern_p (member_pattern, 1)) + return 0; + + /* Scan the archive for matches. + ar_glob_match will accumulate them in STATE.chain. */ + state.arname = arname; + state.pattern = member_pattern; +#ifdef VMS + { + /* In a copy of the pattern, find the suffix, save it and remove it from + the pattern */ + char *lastdot; + vms_member_pattern = xstrdup(member_pattern); + lastdot = strrchr(vms_member_pattern, '.'); + state.suffix = lastdot; + if (lastdot) + { + state.suffix = xstrdup(lastdot); + *lastdot = 0; + } + state.pattern = vms_member_pattern; + } +#endif + state.size = size; + state.chain = 0; + state.n = 0; + ar_scan (arname, ar_glob_match, &state); + +#ifdef VMS + /* Deallocate any duplicated string */ + free(vms_member_pattern); + if (state.suffix) + { + free(state.suffix); + } +#endif + + if (state.chain == 0) + return 0; + + /* Now put the names into a vector for sorting. */ + names = alloca (state.n * sizeof (const char *)); + i = 0; + for (n = state.chain; n != 0; n = n->next) + names[i++] = n->name; + + /* Sort them alphabetically. */ + /* MSVC erroneously warns without a cast here. */ + qsort ((void *)names, i, sizeof (*names), alpha_compare); + + /* Put them back into the chain in the sorted order. */ + i = 0; + for (n = state.chain; n != 0; n = n->next) + n->name = names[i++]; + + return state.chain; +} + +#endif /* Not NO_ARCHIVES. */ diff --git a/arscan.c b/arscan.c new file mode 100644 index 0000000..24286fd --- /dev/null +++ b/arscan.c @@ -0,0 +1,961 @@ +/* Library function for scanning an archive file. +Copyright (C) 1987-2014 Free 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 +globalvalue unsigned int LBR$_HDRTRUNC; + +#if __DECC +#include +#include +#endif +const char * +vmsify (const char *name, int type); + +/* Time conversion from VMS to Unix + Conversion from local time (stored in library) to GMT (needed for gmake) + Note: The tm_gmtoff element is a VMS extension to the ANSI standard. */ +static time_t +vms_time_to_unix(void *vms_time) +{ + struct tm *tmp; + time_t unix_time; + + unix_time = decc$fix_time(vms_time); + tmp = localtime(&unix_time); + unix_time -= tmp->tm_gmtoff; + + return unix_time; +} + + +/* VMS library routines need static variables for callback */ +static void *VMS_lib_idx; + +static const void *VMS_saved_arg; + +static long int (*VMS_function) (); + +static long int VMS_function_ret; + + +/* This is a callback procedure for lib$get_index */ +static int +VMS_get_member_info(struct dsc$descriptor_s *module, unsigned long *rfa) +{ + int status, i; + const int truncated = 0; /* Member name may be truncated */ + time_t member_date; /* Member date */ + char *filename; + unsigned int buffer_length; /* Actual buffer length */ + + /* Unused constants - Make does not actually use most of these */ + const int file_desc = -1; /* archive file descriptor for reading the data */ + const int header_position = 0; /* Header position */ + const int data_position = 0; /* Data position in file */ + const int data_size = 0; /* Data size */ + const int uid = 0; /* member gid */ + const int gid = 0; /* member gid */ + const int mode = 0; /* member protection mode */ + /* End of unused constants */ + + static struct dsc$descriptor_s bufdesc = + { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL }; + + /* Only need the module definition */ + struct mhddef *mhd; + + /* If a previous callback is non-zero, just return that status */ + if (VMS_function_ret) + { + return SS$_NORMAL; + } + + /* lbr_set_module returns more than just the module header. So allocate + a buffer which is big enough: the maximum LBR$C_MAXHDRSIZ. That's at + least bigger than the size of struct mhddef. + If the request is too small, a buffer truncated warning is issued so + it can be reissued with a larger buffer. + We do not care if the buffer is truncated, so that is still a success. */ + mhd = xmalloc(LBR$C_MAXHDRSIZ); + bufdesc.dsc$a_pointer = (char *) mhd; + bufdesc.dsc$w_length = LBR$C_MAXHDRSIZ; + + status = lbr$set_module(&VMS_lib_idx, rfa, &bufdesc, &buffer_length, 0); + + if ((status != LBR$_HDRTRUNC) && !$VMS_STATUS_SUCCESS(status)) + { + ON(error, NILF, + _("lbr$set_module() failed to extract module info, status = %d"), + status); + + lbr$close(&VMS_lib_idx); + + return status; + } + +#ifdef TEST + /* When testing this code, it is useful to know the length returned */ + printf("Input length = %d, actual = %d\n", + bufdesc.dsc$w_length, buffer_length); +#endif + + /* Conversion from VMS time to C time. + VMS defectlet - mhddef is sub-optimal, for the time, it has a 32 bit + longword, mhd$l_datim, and a 32 bit fill instead of two longwords, or + equivalent. */ + member_date = vms_time_to_unix(&mhd->mhd$l_datim); + free(mhd); + + /* Here we have a problem. The module name on VMS does not have + a file type, but the filename pattern in the "VMS_saved_arg" + may have one. + But only the method being called knows how to interpret the + filename pattern. + There are currently two different formats being used. + This means that we need a VMS specific code in those methods + to handle it. */ + filename = xmalloc(module->dsc$w_length + 1); + + /* TODO: We may need an option to preserve the case of the module + For now force the module name to lower case */ + for (i = 0; i < module->dsc$w_length; i++) + filename[i] = _tolower((unsigned char )module->dsc$a_pointer[i]); + + filename[i] = '\0'; + + VMS_function_ret = (*VMS_function)(file_desc, filename, truncated, + header_position, data_position, data_size, member_date, uid, gid, mode, + VMS_saved_arg); + + free(filename); + return SS$_NORMAL; +} + + +/* Takes three arguments ARCHIVE, FUNCTION and ARG. + + Open the archive named ARCHIVE, find its members one by one, + and for each one call FUNCTION with the following arguments: + archive file descriptor for reading the data, + member name, + member name might be truncated flag, + member header position in file, + member data position in file, + member data size, + member date, + member uid, + member gid, + member protection mode, + ARG. + + NOTE: on VMS systems, only name, date, and arg are meaningful! + + The descriptor is poised to read the data of the member + when FUNCTION is called. It does not matter how much + data FUNCTION reads. + + If FUNCTION returns nonzero, we immediately return + what FUNCTION returned. + + Returns -1 if archive does not exist, + Returns -2 if archive has invalid format. + Returns 0 if have scanned successfully. */ + +long int +ar_scan (const char *archive, ar_member_func_t function, const void *varg) +{ + char *vms_archive; + + static struct dsc$descriptor_s libdesc = + { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL }; + + const unsigned long func = LBR$C_READ; + const unsigned long type = LBR$C_TYP_UNK; + const unsigned long index = 1; + unsigned long lib_idx; + int status; + + VMS_saved_arg = varg; + + /* Null archive string can show up in test and cause an access violation */ + if (archive == NULL) + { + /* Null filenames do not exist */ + return -1; + } + + /* archive path name must be in VMS format */ + vms_archive = (char *) vmsify(archive, 0); + + status = lbr$ini_control(&VMS_lib_idx, &func, &type, 0); + + if (!$VMS_STATUS_SUCCESS(status)) + { + ON(error, NILF, _("lbr$ini_control() failed with status = %d"), status); + return -2; + } + + libdesc.dsc$a_pointer = vms_archive; + libdesc.dsc$w_length = strlen(vms_archive); + + status = lbr$open(&VMS_lib_idx, &libdesc, 0, NULL, 0, NULL, 0); + + if (!$VMS_STATUS_SUCCESS(status)) + { + + /* TODO: A library format failure could mean that this is a file + generated by the GNU AR utility and in that case, we need to + take the UNIX codepath. This will also take a change to the + GNV AR wrapper program. */ + + switch (status) + { + case RMS$_FNF: + /* Archive does not exist */ + return -1; + default: +#ifndef TEST + OSN(error, NILF, + _("unable to open library '%s' to lookup member status %d"), + archive, status); +#endif + /* For library format errors, specification says to return -2 */ + return -2; + } + } + + VMS_function = function; + + /* Clear the return status, as we are supposed to stop calling the + callback function if it becomes non-zero, and this is a static + variable. */ + VMS_function_ret = 0; + + status = lbr$get_index(&VMS_lib_idx, &index, VMS_get_member_info, NULL, 0); + + lbr$close(&VMS_lib_idx); + + /* Unless a failure occurred in the lbr$ routines, return the + the status from the 'function' routine. */ + if ($VMS_STATUS_SUCCESS(status)) + { + return VMS_function_ret; + } + + /* This must be something wrong with the library and an error + message should already have been printed. */ + return -2; +} + +#else /* !VMS */ + +/* SCO Unix's compiler defines both of these. */ +#ifdef M_UNIX +#undef M_XENIX +#endif + +/* On the sun386i and in System V rel 3, ar.h defines two different archive + formats depending upon whether you have defined PORTAR (normal) or PORT5AR + (System V Release 1). There is no default, one or the other must be defined + to have a nonzero value. */ + +#if (!defined (PORTAR) || PORTAR == 0) && (!defined (PORT5AR) || PORT5AR == 0) +#undef PORTAR +#ifdef M_XENIX +/* According to Jim Sievert , 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 + +/* Takes three arguments ARCHIVE, FUNCTION and ARG. + + Open the archive named ARCHIVE, find its members one by one, + and for each one call FUNCTION with the following arguments: + archive file descriptor for reading the data, + member name, + member name might be truncated flag, + member header position in file, + member data position in file, + member data size, + member date, + member uid, + member gid, + member protection mode, + ARG. + + The descriptor is poised to read the data of the member + when FUNCTION is called. It does not matter how much + data FUNCTION reads. + + If FUNCTION returns nonzero, we immediately return + what FUNCTION returned. + + Returns -1 if archive does not exist, + Returns -2 if archive has invalid format. + Returns 0 if have scanned successfully. */ + +long int +ar_scan (const char *archive, ar_member_func_t function, const void *arg) +{ +#ifdef AIAMAG + FL_HDR fl_header; +# ifdef AIAMAGBIG + int big_archive = 0; + FL_HDR_BIG fl_header_big; +# endif +#endif + char *namemap = 0; + int desc = open (archive, O_RDONLY, 0); + if (desc < 0) + return -1; +#ifdef SARMAG + { + char buf[SARMAG]; + register int nread = read (desc, buf, SARMAG); + if (nread != SARMAG || memcmp (buf, ARMAG, SARMAG)) + { + (void) close (desc); + return -2; + } + } +#else +#ifdef AIAMAG + { + register int nread = read (desc, &fl_header, FL_HSZ); + + if (nread != FL_HSZ) + { + (void) close (desc); + return -2; + } +#ifdef AIAMAGBIG + /* If this is a "big" archive, then set the flag and + re-read the header into the "big" structure. */ + if (!memcmp (fl_header.fl_magic, AIAMAGBIG, SAIAMAG)) + { + big_archive = 1; + + /* seek back to beginning of archive */ + if (lseek (desc, 0, 0) < 0) + { + (void) close (desc); + return -2; + } + + /* re-read the header into the "big" structure */ + nread = read (desc, &fl_header_big, FL_HSZ_BIG); + if (nread != FL_HSZ_BIG) + { + (void) close (desc); + return -2; + } + } + else +#endif + /* Check to make sure this is a "normal" archive. */ + if (memcmp (fl_header.fl_magic, AIAMAG, SAIAMAG)) + { + (void) close (desc); + return -2; + } + } +#else + { +#ifndef M_XENIX + int buf; +#else + unsigned short int buf; +#endif + register int nread = read (desc, &buf, sizeof (buf)); + if (nread != sizeof (buf) || buf != ARMAG) + { + (void) close (desc); + return -2; + } + } +#endif +#endif + + /* Now find the members one by one. */ + { +#ifdef SARMAG + register long int member_offset = SARMAG; +#else +#ifdef AIAMAG + long int member_offset; + long int last_member_offset; + +#ifdef AIAMAGBIG + if ( big_archive ) + { + sscanf (fl_header_big.fl_fstmoff, "%20ld", &member_offset); + sscanf (fl_header_big.fl_lstmoff, "%20ld", &last_member_offset); + } + else +#endif + { + sscanf (fl_header.fl_fstmoff, "%12ld", &member_offset); + sscanf (fl_header.fl_lstmoff, "%12ld", &last_member_offset); + } + + if (member_offset == 0) + { + /* Empty archive. */ + close (desc); + return 0; + } +#else +#ifndef M_XENIX + register long int member_offset = sizeof (int); +#else /* Xenix. */ + register long int member_offset = sizeof (unsigned short int); +#endif /* Not Xenix. */ +#endif +#endif + + while (1) + { + register int nread; + struct ar_hdr member_header; +#ifdef AIAMAGBIG + struct ar_hdr_big member_header_big; +#endif +#ifdef AIAMAG + char name[256]; + int name_len; + long int dateval; + int uidval, gidval; + long int data_offset; +#else + char namebuf[sizeof member_header.ar_name + 1]; + char *name; + int is_namemap; /* Nonzero if this entry maps long names. */ + int long_name = 0; +#endif + long int eltsize; + int eltmode; + long int fnval; + + if (lseek (desc, member_offset, 0) < 0) + { + (void) close (desc); + return -2; + } + +#ifdef AIAMAG +#define AR_MEMHDR_SZ(x) (sizeof(x) - sizeof (x._ar_name)) + +#ifdef AIAMAGBIG + if (big_archive) + { + nread = read (desc, &member_header_big, + AR_MEMHDR_SZ(member_header_big) ); + + if (nread != AR_MEMHDR_SZ(member_header_big)) + { + (void) close (desc); + return -2; + } + + sscanf (member_header_big.ar_namlen, "%4d", &name_len); + nread = read (desc, name, name_len); + + if (nread != name_len) + { + (void) close (desc); + return -2; + } + + name[name_len] = 0; + + sscanf (member_header_big.ar_date, "%12ld", &dateval); + sscanf (member_header_big.ar_uid, "%12d", &uidval); + sscanf (member_header_big.ar_gid, "%12d", &gidval); + sscanf (member_header_big.ar_mode, "%12o", &eltmode); + sscanf (member_header_big.ar_size, "%20ld", &eltsize); + + data_offset = (member_offset + AR_MEMHDR_SZ(member_header_big) + + name_len + 2); + } + else +#endif + { + nread = read (desc, &member_header, + AR_MEMHDR_SZ(member_header) ); + + if (nread != AR_MEMHDR_SZ(member_header)) + { + (void) close (desc); + return -2; + } + + sscanf (member_header.ar_namlen, "%4d", &name_len); + nread = read (desc, name, name_len); + + if (nread != name_len) + { + (void) close (desc); + return -2; + } + + name[name_len] = 0; + + sscanf (member_header.ar_date, "%12ld", &dateval); + sscanf (member_header.ar_uid, "%12d", &uidval); + sscanf (member_header.ar_gid, "%12d", &gidval); + sscanf (member_header.ar_mode, "%12o", &eltmode); + sscanf (member_header.ar_size, "%12ld", &eltsize); + + data_offset = (member_offset + AR_MEMHDR_SZ(member_header) + + name_len + 2); + } + data_offset += data_offset % 2; + + fnval = + (*function) (desc, name, 0, + member_offset, data_offset, eltsize, + dateval, uidval, gidval, + eltmode, arg); + +#else /* Not AIAMAG. */ + nread = read (desc, &member_header, AR_HDR_SIZE); + if (nread == 0) + /* No data left means end of file; that is OK. */ + break; + + if (nread != AR_HDR_SIZE +#if defined(ARFMAG) || defined(ARFZMAG) + || ( +# ifdef ARFMAG + memcmp (member_header.ar_fmag, ARFMAG, 2) +# else + 1 +# endif + && +# ifdef ARFZMAG + memcmp (member_header.ar_fmag, ARFZMAG, 2) +# else + 1 +# endif + ) +#endif + ) + { + (void) close (desc); + return -2; + } + + name = namebuf; + memcpy (name, member_header.ar_name, sizeof member_header.ar_name); + { + register char *p = name + sizeof member_header.ar_name; + do + *p = '\0'; + while (p > name && *--p == ' '); + +#ifndef AIAMAG + /* If the member name is "//" or "ARFILENAMES/" this may be + a list of file name mappings. The maximum file name + length supported by the standard archive format is 14 + characters. This member will actually always be the + first or second entry in the archive, but we don't check + that. */ + is_namemap = (!strcmp (name, "//") + || !strcmp (name, "ARFILENAMES/")); +#endif /* Not AIAMAG. */ + /* On some systems, there is a slash after each member name. */ + if (*p == '/') + *p = '\0'; + +#ifndef AIAMAG + /* If the member name starts with a space or a slash, this + is an index into the file name mappings (used by GNU ar). + Otherwise if the member name looks like #1/NUMBER the + real member name appears in the element data (used by + 4.4BSD). */ + if (! is_namemap + && (name[0] == ' ' || name[0] == '/') + && namemap != 0) + { + name = namemap + atoi (name + 1); + long_name = 1; + } + else if (name[0] == '#' + && name[1] == '1' + && name[2] == '/') + { + int namesize = atoi (name + 3); + + name = alloca (namesize + 1); + nread = read (desc, name, namesize); + if (nread != namesize) + { + close (desc); + return -2; + } + name[namesize] = '\0'; + + long_name = 1; + } +#endif /* Not AIAMAG. */ + } + +#ifndef M_XENIX + sscanf (TOCHAR (member_header.ar_mode), "%o", &eltmode); + eltsize = atol (TOCHAR (member_header.ar_size)); +#else /* Xenix. */ + eltmode = (unsigned short int) member_header.ar_mode; + eltsize = member_header.ar_size; +#endif /* Not Xenix. */ + + fnval = + (*function) (desc, name, ! long_name, member_offset, + member_offset + AR_HDR_SIZE, eltsize, +#ifndef M_XENIX + atol (TOCHAR (member_header.ar_date)), + atoi (TOCHAR (member_header.ar_uid)), + atoi (TOCHAR (member_header.ar_gid)), +#else /* Xenix. */ + member_header.ar_date, + member_header.ar_uid, + member_header.ar_gid, +#endif /* Not Xenix. */ + eltmode, arg); + +#endif /* AIAMAG. */ + + if (fnval) + { + (void) close (desc); + return fnval; + } + +#ifdef AIAMAG + if (member_offset == last_member_offset) + /* End of the chain. */ + break; + +#ifdef AIAMAGBIG + if (big_archive) + sscanf (member_header_big.ar_nxtmem, "%20ld", &member_offset); + else +#endif + sscanf (member_header.ar_nxtmem, "%12ld", &member_offset); + + if (lseek (desc, member_offset, 0) != member_offset) + { + (void) close (desc); + return -2; + } +#else + + /* If this member maps archive names, we must read it in. The + name map will always precede any members whose names must + be mapped. */ + if (is_namemap) + { + char *clear; + char *limit; + + namemap = alloca (eltsize); + nread = read (desc, namemap, eltsize); + if (nread != eltsize) + { + (void) close (desc); + return -2; + } + + /* The names are separated by newlines. Some formats have + a trailing slash. Null terminate the strings for + convenience. */ + limit = namemap + eltsize; + for (clear = namemap; clear < limit; clear++) + { + if (*clear == '\n') + { + *clear = '\0'; + if (clear[-1] == '/') + clear[-1] = '\0'; + } + } + + is_namemap = 0; + } + + member_offset += AR_HDR_SIZE + eltsize; + if (member_offset % 2 != 0) + member_offset++; +#endif + } + } + + close (desc); + return 0; +} +#endif /* !VMS */ + +/* 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, + 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; + int i; + unsigned int ui; + struct stat statbuf; + + if (pos < 0) + return (int) pos; + if (!pos) + return 1; + + fd = open (arname, O_RDWR, 0666); + if (fd < 0) + return -3; + /* Read in this member's header */ + if (lseek (fd, pos, 0) < 0) + goto lose; + if (AR_HDR_SIZE != read (fd, &ar_hdr, AR_HDR_SIZE)) + goto lose; + /* Write back the header, thus touching the archive file. */ + if (lseek (fd, pos, 0) < 0) + goto lose; + if (AR_HDR_SIZE != write (fd, &ar_hdr, AR_HDR_SIZE)) + goto lose; + /* The file's mtime is the time we we want. */ + EINTRLOOP (i, fstat (fd, &statbuf)); + if (i < 0) + goto lose; +#if defined(ARFMAG) || defined(ARFZMAG) || defined(AIAMAG) || defined(WINDOWS32) + /* Advance member's time to that time */ + for (ui = 0; ui < sizeof ar_hdr.ar_date; ui++) + ar_hdr.ar_date[ui] = ' '; + sprintf (TOCHAR (ar_hdr.ar_date), "%ld", (long int) statbuf.st_mtime); +#ifdef AIAMAG + ar_hdr.ar_date[strlen (ar_hdr.ar_date)] = ' '; +#endif +#else + ar_hdr.ar_date = statbuf.st_mtime; +#endif + /* Write back this member's header */ + if (lseek (fd, pos, 0) < 0) + goto lose; + if (AR_HDR_SIZE != write (fd, &ar_hdr, AR_HDR_SIZE)) + goto lose; + close (fd); + return 0; + + lose: + i = errno; + close (fd); + errno = i; + 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, int mode, const void *arg) +{ + extern char *ctime (); + + printf (_("Member '%s'%s: %ld bytes at %ld (%ld).\n"), + name, truncated ? _(" (name might be truncated)") : "", + size, hdrpos, datapos); + printf (_(" Date %s"), ctime (&date)); + printf (_(" uid = %d, gid = %d, mode = 0%o.\n"), uid, gid, mode); + + return 0; +} + +int +main (int argc, char **argv) +{ + ar_scan (argv[1], describe_member, NULL); + return 0; +} + +#endif /* TEST. */ +#endif /* NO_ARCHIVES. */ diff --git a/build.sh.in b/build.sh.in new file mode 100755 index 0000000..ea5865d --- /dev/null +++ b/build.sh.in @@ -0,0 +1,81 @@ +#!/bin/sh +# Shell script to build GNU Make in the absence of any 'make' program. +# @configure_input@ + +# Copyright (C) 1993-2014 Free 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. + +srcdir='@srcdir@' +CC='@CC@' +CFLAGS='@CFLAGS@ @GUILE_CFLAGS@' +CPPFLAGS='@CPPFLAGS@' +LDFLAGS='@AM_LDFLAGS@ @LDFLAGS@' +ALLOCA='@ALLOCA@' +LOADLIBES='@LIBS@ @GUILE_LIBS@ @LIBINTL@' +eval extras=\'@LIBOBJS@\' +REMOTE='@REMOTE@' +GLOBLIB='@GLOBLIB@' +PATH_SEPARATOR='@PATH_SEPARATOR@' +OBJEXT='@OBJEXT@' +EXEEXT='@EXEEXT@' + +# Common prefix for machine-independent installed files. +prefix='@prefix@' +# Common prefix for machine-dependent installed files. +exec_prefix=`eval echo @exec_prefix@` +# Directory to find libraries in for '-lXXX'. +libdir=${exec_prefix}/lib +# Directory to search by default for included makefiles. +includedir=${prefix}/include + +localedir=${prefix}/share/locale +aliaspath=${localedir}${PATH_SEPARATOR}. + +defines="-DLOCALEDIR=\"${localedir}\" -DLIBDIR=\"${libdir}\" -DINCLUDEDIR=\"${includedir}\""' @DEFS@' + +# Exit as soon as any command fails. +set -e + +# These are all the objects we need to link together. +objs="ar.${OBJEXT} arscan.${OBJEXT} commands.${OBJEXT} default.${OBJEXT} dir.${OBJEXT} expand.${OBJEXT} file.${OBJEXT} function.${OBJEXT} getopt.${OBJEXT} getopt1.${OBJEXT} guile.${OBJEXT} implicit.${OBJEXT} job.${OBJEXT} load.${OBJEXT} loadapi.${OBJEXT} main.${OBJEXT} misc.${OBJEXT} output.${OBJEXT} read.${OBJEXT} remake.${OBJEXT} rule.${OBJEXT} signame.${OBJEXT} strcache.${OBJEXT} variable.${OBJEXT} version.${OBJEXT} vpath.${OBJEXT} hash.${OBJEXT} remote-${REMOTE}.${OBJEXT} ${extras} ${ALLOCA}" + +if [ x"$GLOBLIB" != x ]; then + objs="$objs glob/fnmatch.${OBJEXT} glob/glob.${OBJEXT}" + globinc=-I${srcdir}/glob +fi + +# Compile the source files into those objects. +for file in `echo ${objs} | sed 's/\.'${OBJEXT}'/.c/g'`; do + echo compiling ${file}... + $CC $defines $CPPFLAGS $CFLAGS \ + -c -I. -I${srcdir} ${globinc} ${srcdir}/$file +done + +# The object files were actually all put in the current directory. +# Remove the source directory names from the list. +srcobjs="$objs" +objs= +for obj in $srcobjs; do + objs="$objs `basename $obj`" +done + +# Link all the objects together. +echo linking make... +$CC $CFLAGS $LDFLAGS $objs $LOADLIBES -o makenew${EXEEXT} +echo done +mv -f makenew${EXEEXT} make${EXEEXT} diff --git a/build_w32.bat b/build_w32.bat new file mode 100644 index 0000000..00632a7 --- /dev/null +++ b/build_w32.bat @@ -0,0 +1,310 @@ +@echo off +rem Copyright (C) 1996-2014 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 . + +if "%1" == "-h" GoTo Usage +if "%1" == "--help" GoTo Usage +if not exist config.h.W32.template GoTo NotSCM +sed -n "s/^AC_INIT(\[GNU make\],\[\([^]]\+\)\].*/s,%%VERSION%%,\1,g/p" configure.ac > config.h.W32.sed +echo s,%%PACKAGE%%,make,g >> config.h.W32.sed +sed -f config.h.W32.sed config.h.W32.template > config.h.W32 +echo static const char *const GUILE_module_defn = ^" \> gmk-default.h +sed -e "s/;.*//" -e "/^[ \t]*$/d" -e "s/\"/\\\\\"/g" -e "s/$/ \\/" gmk-default.scm >> gmk-default.h +echo ^";>> gmk-default.h +:NotSCM +copy config.h.W32 config.h + +rem Guile configuration +set GUILECFLAGS= +set GUILELIBS= +set NOGUILE= +set OPT=-O2 +set COMPILER= +set PKGMSC= +:ParseSW +if "%1" == "--debug" GoTo SetOpt +if "%1" == "--without-guile" GoTo NoGuile +if "%1" == "gcc" GoTo SetCC +if "%1" == "" GoTo ChkGuile +:SetOpt +set OPT=-O0 +shift +GoTo ParseSW +:NoGuile +set NOGUILE=Y +echo "Building without Guile" +shift +GoTo ParseSW +:SetCC +set COMPILER=gcc +echo "Building with GCC" +shift +GoTo ParseSW +rem Build with Guile is supported only on NT and later versions +:ChkGuile +if "%NOGUILE%" == "Y" GoTo GuileDone +if not "%OS%" == "Windows_NT" GoTo NoGuile +pkg-config --help > 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" > guile.tmp +if not ERRORLEVEL 1 set /P GUILECFLAGS= < guile.tmp +pkg-config --libs --static --short-errors %PKGMSC% "guile-2.0" > guile.tmp +if not ERRORLEVEL 1 set /P GUILELIBS= < guile.tmp +if not "%GUILECFLAGS%" == "" GoTo GuileDone +echo "Checking for Guile 1.8" +pkg-config --cflags --short-errors "guile-1.8" > guile.tmp +if not ERRORLEVEL 1 set /P GUILECFLAGS= < guile.tmp +pkg-config --libs --static --short-errors %PKGMSC% "guile-1.8" > guile.tmp +if not ERRORLEVEL 1 set /P GUILELIBS= < 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 not "%GUILECFLAGS%" == "" echo "Guile found, building with Guile" +if not "%GUILECFLAGS%" == "" set GUILECFLAGS=%GUILECFLAGS% -DHAVE_GUILE +if "%COMPILER%" == "gcc" if "%OPT%" == "-O0" echo "Building without compiler optimizations" +cd w32\subproc +echo. +echo "Creating the subproc library" +%ComSpec% /c build.bat +cd ..\.. + +if exist link.dbg del link.dbg +if exist link.rel del link.rel +echo. +echo "Creating GNU Make for Windows 9X/NT/2K/XP/Vista/7/8" +if "%COMPILER%" == "gcc" GoTo GCCBuild +set make=gnumake +echo on +if not exist .\WinDebug\nul mkdir .\WinDebug +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D TIVOLI /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c variable.c +echo WinDebug\variable.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c rule.c +echo WinDebug\rule.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c remote-stub.c +echo WinDebug\remote-stub.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c commands.c +echo WinDebug\commands.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c file.c +echo WinDebug\file.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c getloadavg.c +echo WinDebug\getloadavg.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c default.c +echo WinDebug\default.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c signame.c +echo WinDebug\signame.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c expand.c +echo WinDebug\expand.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c dir.c +echo WinDebug\dir.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od %GUILECFLAGS% /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c main.c +echo WinDebug\main.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c getopt1.c +echo WinDebug\getopt1.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c job.c +echo WinDebug\job.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c output.c +echo WinDebug\output.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c read.c +echo WinDebug\read.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c version.c +echo WinDebug\version.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c getopt.c +echo WinDebug\getopt.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c arscan.c +echo WinDebug\arscan.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c hash.c +echo WinDebug\hash.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c strcache.c +echo WinDebug\strcache.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c remake.c +echo WinDebug\remake.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c misc.c +echo WinDebug\misc.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c ar.c +echo WinDebug\ar.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c function.c +echo WinDebug\function.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c vpath.c +echo WinDebug\vpath.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c implicit.c +echo WinDebug\implicit.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c loadapi.c +echo WinDebug\loadapi.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c load.c +echo WinDebug\load.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\w32\compat\dirent.c +echo WinDebug\dirent.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\w32\compat\posixfcn.c +echo WinDebug\posixfcn.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\glob\glob.c +echo WinDebug\glob.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\glob\fnmatch.c +echo WinDebug\fnmatch.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\w32\pathstuff.c +echo WinDebug\pathstuff.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od %GUILECFLAGS% /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c guile.c +echo WinDebug\guile.obj >>link.dbg +:LinkDbg +echo off +echo "Linking WinDebug/%make%.exe" +rem link.exe %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 w32\subproc\windebug\subproc.lib /NOLOGO /SUBSYSTEM:console /INCREMENTAL:yes /PDB:.\WinDebug/%make%.pdb /DEBUG /OUT:.\WinDebug/%make%.exe .\WinDebug/variable.obj .\WinDebug/rule.obj .\WinDebug/remote-stub.obj .\WinDebug/commands.obj .\WinDebug/file.obj .\WinDebug/getloadavg.obj .\WinDebug/default.obj .\WinDebug/signame.obj .\WinDebug/expand.obj .\WinDebug/dir.obj .\WinDebug/main.obj .\WinDebug/getopt1.obj .\WinDebug/job.obj .\WinDebug/output.obj .\WinDebug/read.obj .\WinDebug/version.obj .\WinDebug/getopt.obj .\WinDebug/arscan.obj .\WinDebug/remake.obj .\WinDebug/hash.obj .\WinDebug/strcache.obj .\WinDebug/misc.obj .\WinDebug/ar.obj .\WinDebug/function.obj .\WinDebug/vpath.obj .\WinDebug/implicit.obj .\WinDebug/dirent.obj .\WinDebug/glob.obj .\WinDebug/fnmatch.obj .\WinDebug/pathstuff.obj +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 w32\subproc\windebug\subproc.lib >>link.dbg +link.exe /NOLOGO /SUBSYSTEM:console /INCREMENTAL:yes /PDB:.\WinDebug/%make%.pdb /DEBUG /OUT:.\WinDebug/%make%.exe @link.dbg +if not exist .\WinDebug/%make%.exe echo "WinDebug build failed" +if exist .\WinDebug/%make%.exe echo "WinDebug build succeeded!" +if not exist .\WinRel\nul mkdir .\WinRel +echo on +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D TIVOLI /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c variable.c +echo WinRel\variable.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c rule.c +echo WinRel\rule.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c remote-stub.c +echo WinRel\remote-stub.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c commands.c +echo WinRel\commands.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c file.c +echo WinRel\file.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c getloadavg.c +echo WinRel\getloadavg.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c default.c +echo WinRel\default.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c signame.c +echo WinRel\signame.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c expand.c +echo WinRel\expand.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c dir.c +echo WinRel\dir.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 %GUILECFLAGS% /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c main.c +echo WinRel\main.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c getopt1.c +echo WinRel\getopt1.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c job.c +echo WinRel\job.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c output.c +echo WinRel\output.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c read.c +echo WinRel\read.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c version.c +echo WinRel\version.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c getopt.c +echo WinRel\getopt.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c arscan.c +echo WinRel\arscan.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c remake.c +echo WinRel\remake.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c hash.c +echo WinRel\hash.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c strcache.c +echo WinRel\strcache.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c misc.c +echo WinRel\misc.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c ar.c +echo WinRel\ar.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c function.c +echo WinRel\function.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c vpath.c +echo WinRel\vpath.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c implicit.c +echo WinRel\implicit.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c loadapi.c +echo WinRel\loadapi.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c load.c +echo WinRel\load.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\w32\compat\dirent.c +echo WinRel\dirent.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\w32\compat\posixfcn.c +echo WinRel\posixfcn.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\glob\glob.c +echo WinRel\glob.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\glob\fnmatch.c +echo WinRel\fnmatch.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\w32\pathstuff.c +echo WinRel\pathstuff.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 %GUILECFLAGS% /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c guile.c +echo WinRel\guile.obj >>link.rel +:LinkRel +echo off +echo "Linking WinRel/%make%.exe" +rem link.exe %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 w32\subproc\winrel\subproc.lib /NOLOGO /SUBSYSTEM:console /INCREMENTAL:no /PDB:.\WinRel/%make%.pdb /OUT:.\WinRel/%make%.exe .\WinRel/variable.obj .\WinRel/rule.obj .\WinRel/remote-stub.obj .\WinRel/commands.obj .\WinRel/file.obj .\WinRel/getloadavg.obj .\WinRel/default.obj .\WinRel/signame.obj .\WinRel/expand.obj .\WinRel/dir.obj .\WinRel/main.obj .\WinRel/getopt1.obj .\WinRel/job.obj .\WinRel/output.obj .\WinRel/read.obj .\WinRel/version.obj .\WinRel/getopt.obj .\WinRel/arscan.obj .\WinRel/remake.obj .\WinRel/misc.obj .\WinRel/hash.obj .\WinRel/strcache.obj .\WinRel/ar.obj .\WinRel/function.obj .\WinRel/vpath.obj .\WinRel/implicit.obj .\WinRel/dirent.obj .\WinRel/glob.obj .\WinRel/fnmatch.obj .\WinRel/pathstuff.obj +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 w32\subproc\winrel\subproc.lib >>link.rel +link.exe /NOLOGO /SUBSYSTEM:console /INCREMENTAL:no /PDB:.\WinRel/%make%.pdb /OUT:.\WinRel/%make%.exe @link.rel +if not exist .\WinRel/%make%.exe echo "WinRel build failed" +if exist .\WinRel/%make%.exe echo "WinRel build succeeded!" +set make= +GoTo BuildEnd +:GCCBuild +echo on +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c variable.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c rule.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c remote-stub.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c commands.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c file.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c getloadavg.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c default.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c signame.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c expand.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c dir.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H %GUILECFLAGS% -c main.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c getopt1.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c job.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c output.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c read.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c version.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c getopt.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c arscan.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c remake.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c hash.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c strcache.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c misc.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c ar.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c function.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c vpath.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c implicit.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c loadapi.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c load.c +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c ./glob/glob.c -o glob.o +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c ./glob/fnmatch.c -o fnmatch.o +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c ./w32/pathstuff.c -o pathstuff.o +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c ./w32/compat/posixfcn.c -o posixfcn.o +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% %GUILECFLAGS% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c guile.c +:LinkGCC +@echo off +Rem The version NN of libgnumake-NN.dll.a should be bumped whenever +Rem the API changes in binary-incompatible manner. +@echo on +gcc -mthreads -gdwarf-2 -g3 -o gnumake.exe variable.o rule.o remote-stub.o commands.o file.o getloadavg.o default.o signame.o expand.o dir.o main.o getopt1.o guile.o job.o output.o read.o version.o getopt.o arscan.o remake.o misc.o hash.o strcache.o ar.o function.o vpath.o implicit.o loadapi.o load.o glob.o fnmatch.o pathstuff.o posixfcn.o w32_misc.o sub_proc.o w32err.o %GUILELIBS% -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -Wl,--out-implib=libgnumake-1.dll.a +@GoTo BuildEnd +:Usage +echo Usage: %0 [options] [gcc] +echo Options: +echo. --debug For GCC only, make a debug build +echo. (MSVC build always makes both debug and release) +echo. --without-guile Do not compile Guile support even if found +echo. --help Display these instructions and exit +:BuildEnd +@echo off +set GUILELIBS= +set GUILECFLAGS= +set PKGMSC= +set OPT= +set COMPILER= +set NOGUILE= +echo on diff --git a/commands.c b/commands.c new file mode 100644 index 0000000..7123021 --- /dev/null +++ b/commands.c @@ -0,0 +1,712 @@ +/* Command processing for GNU Make. +Copyright (C) 1988-2014 Free 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 ',' +#else +# define FILE_LIST_SEPARATOR ' ' +#endif + +int remote_kill (int id, int sig); + +#ifndef HAVE_UNISTD_H +int 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)) + { + unsigned int len; + const char *cp; + char *p; + + cp = strchr (file->name, '('); + p = alloca (cp - file->name + 1); + memcpy (p, file->name, cp - file->name); + p[cp - file->name] = '\0'; + at = p; + len = strlen (cp + 1); + p = alloca (len); + memcpy (p, cp + 1, len - 1); + p[len - 1] = '\0'; + percent = p; + } + else +#endif /* NO_ARCHIVES. */ + { + at = file->name; + percent = ""; + } + + /* $* is the stem from an implicit or static pattern rule. */ + if (file->stem == 0) + { + /* In Unix make, $* is set to the target name with + any suffix in the .SUFFIXES list stripped off for + explicit rules. We store this in the 'stem' member. */ + const char *name; + unsigned int len; + +#ifndef NO_ARCHIVES + if (ar_name (file->name)) + { + name = strchr (file->name, '(') + 1; + len = strlen (name) - 1; + } + else +#endif + { + name = file->name; + len = strlen (name); + } + + for (d = enter_file (strcache_add (".SUFFIXES"))->deps; d ; d = d->next) + { + unsigned int slen = strlen (dep_name (d)); + if (len > slen && strneq (dep_name (d), name + (len - slen), slen)) + { + file->stem = strcache_add_len (name, len - slen); + break; + } + } + if (d == 0) + file->stem = ""; + } + star = file->stem; + + /* $< is the first not order-only dependency. */ + less = ""; + for (d = file->deps; d != 0; d = d->next) + if (!d->ignore_mtime) + { + if (!d->need_2nd_expansion) + less = dep_name (d); + break; + } + + if (file->cmds == default_file->cmds) + /* This file got its commands from .DEFAULT. + In this case $< is the same as $@. */ + less = at; + +#define DEFINE_VARIABLE(name, len, value) \ + (void) define_variable_for_file (name,len,value,o_automatic,0,file) + + /* Define the variables. */ + + DEFINE_VARIABLE ("<", 1, less); + DEFINE_VARIABLE ("*", 1, star); + DEFINE_VARIABLE ("@", 1, at); + DEFINE_VARIABLE ("%", 1, percent); + + /* Compute the values for $^, $+, $?, and $|. */ + + { + static char *plus_value=0, *bar_value=0, *qmark_value=0; + static unsigned int plus_max=0, bar_max=0, qmark_max=0; + + unsigned int qmark_len, plus_len, bar_len; + char *cp; + char *caret_value; + char *qp; + char *bp; + unsigned int len; + + struct hash_table dep_hash; + void **slot; + + /* Compute first the value for $+, which is supposed to contain + duplicate dependencies as they were listed in the makefile. */ + + plus_len = 0; + bar_len = 0; + for (d = file->deps; d != 0; d = d->next) + { + if (!d->need_2nd_expansion) + { + if (d->ignore_mtime) + bar_len += strlen (dep_name (d)) + 1; + else + plus_len += strlen (dep_name (d)) + 1; + } + } + + if (bar_len == 0) + bar_len++; + + if (plus_len == 0) + plus_len++; + + if (plus_len > plus_max) + plus_value = xrealloc (plus_value, plus_max = plus_len); + + cp = plus_value; + + qmark_len = plus_len + 1; /* Will be this or less. */ + for (d = file->deps; d != 0; d = d->next) + if (! d->ignore_mtime && ! d->need_2nd_expansion) + { + const char *c = dep_name (d); + +#ifndef NO_ARCHIVES + if (ar_name (c)) + { + c = strchr (c, '(') + 1; + len = strlen (c) - 1; + } + else +#endif + len = strlen (c); + + memcpy (cp, c, len); + cp += len; + *cp++ = FILE_LIST_SEPARATOR; + if (! (d->changed || always_make_flag)) + qmark_len -= len + 1; /* Don't space in $? for this one. */ + } + + /* Kill the last space and define the variable. */ + + cp[cp > plus_value ? -1 : 0] = '\0'; + DEFINE_VARIABLE ("+", 1, plus_value); + + /* Compute the values for $^, $?, and $|. */ + + cp = caret_value = plus_value; /* Reuse the buffer; it's big enough. */ + + if (qmark_len > qmark_max) + qmark_value = xrealloc (qmark_value, qmark_max = qmark_len); + qp = qmark_value; + + if (bar_len > bar_max) + bar_value = xrealloc (bar_value, bar_max = bar_len); + bp = bar_value; + + /* Make sure that no dependencies are repeated in $^, $?, and $|. It + would be natural to combine the next two loops but we can't do it + because of a situation where we have two dep entries, the first + is order-only and the second is normal (see below). */ + + hash_init (&dep_hash, 500, dep_hash_1, dep_hash_2, dep_hash_cmp); + + for (d = file->deps; d != 0; d = d->next) + { + if (d->need_2nd_expansion) + continue; + + slot = hash_find_slot (&dep_hash, d); + if (HASH_VACANT (*slot)) + hash_insert_at (&dep_hash, d, slot); + else + { + /* Check if the two prerequisites have different ignore_mtime. + If so then we need to "upgrade" one that is order-only. */ + + struct dep* hd = (struct dep*) *slot; + + if (d->ignore_mtime != hd->ignore_mtime) + d->ignore_mtime = hd->ignore_mtime = 0; + } + } + + for (d = file->deps; d != 0; d = d->next) + { + const char *c; + + if (d->need_2nd_expansion || hash_find_item (&dep_hash, d) != d) + continue; + + c = dep_name (d); +#ifndef NO_ARCHIVES + if (ar_name (c)) + { + c = strchr (c, '(') + 1; + len = strlen (c) - 1; + } + else +#endif + len = strlen (c); + + if (d->ignore_mtime) + { + memcpy (bp, c, len); + bp += len; + *bp++ = FILE_LIST_SEPARATOR; + } + else + { + memcpy (cp, c, len); + cp += len; + *cp++ = FILE_LIST_SEPARATOR; + if (d->changed || always_make_flag) + { + memcpy (qp, c, len); + qp += len; + *qp++ = FILE_LIST_SEPARATOR; + } + } + } + + hash_free (&dep_hash, 0); + + /* Kill the last spaces and define the variables. */ + + cp[cp > caret_value ? -1 : 0] = '\0'; + DEFINE_VARIABLE ("^", 1, caret_value); + + qp[qp > qmark_value ? -1 : 0] = '\0'; + DEFINE_VARIABLE ("?", 1, qmark_value); + + bp[bp > bar_value ? -1 : 0] = '\0'; + DEFINE_VARIABLE ("|", 1, bar_value); + } + +#undef DEFINE_VARIABLE +} + +/* Chop CMDS up into individual command lines if necessary. + Also set the 'lines_flags' and 'any_recurse' members. */ + +void +chop_commands (struct commands *cmds) +{ + unsigned int nlines, idx; + char **lines; + + /* If we don't have any commands, + or we already parsed them, never mind. */ + + if (!cmds || cmds->command_lines != 0) + return; + + /* Chop CMDS->commands up into lines in CMDS->command_lines. */ + + if (one_shell) + { + int l = strlen (cmds->commands); + + nlines = 1; + lines = xmalloc (nlines * sizeof (char *)); + lines[0] = xstrdup (cmds->commands); + + /* Strip the trailing newline. */ + if (l > 0 && lines[0][l-1] == '\n') + lines[0][l-1] = '\0'; + } + else + { + const char *p; + + nlines = 5; + lines = xmalloc (nlines * sizeof (char *)); + idx = 0; + p = cmds->commands; + while (*p != '\0') + { + const char *end = p; + find_end:; + end = strchr (end, '\n'); + if (end == 0) + end = p + strlen (p); + else if (end > p && end[-1] == '\\') + { + int backslash = 1; + const char *b; + for (b = end - 2; b >= p && *b == '\\'; --b) + backslash = !backslash; + if (backslash) + { + ++end; + goto find_end; + } + } + + if (idx == nlines) + { + nlines += 2; + lines = xrealloc (lines, nlines * sizeof (char *)); + } + lines[idx++] = xstrndup (p, end - p); + p = end; + if (*p != '\0') + ++p; + } + + if (idx != nlines) + { + nlines = idx; + lines = xrealloc (lines, nlines * sizeof (char *)); + } + } + + /* Finally, set the corresponding CMDS->lines_flags elements and the + CMDS->any_recurse flag. */ + + if (nlines > USHRT_MAX) + ON (fatal, &cmds->fileinfo, _("Recipe has too many lines (%ud)"), nlines); + + cmds->ncommand_lines = nlines; + cmds->command_lines = lines; + + cmds->any_recurse = 0; + cmds->lines_flags = xmalloc (nlines); + + for (idx = 0; idx < nlines; ++idx) + { + int 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 ((unsigned char)*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) + (void) kill (c->pid, SIGTERM); + } + + /* If we got a signal that means the user + wanted to kill make, remove pending targets. */ + + if (sig == SIGTERM || sig == SIGINT +#ifdef SIGHUP + || sig == SIGHUP +#endif +#ifdef SIGQUIT + || sig == SIGQUIT +#endif + ) + { + struct child *c; + + /* Remote children won't automatically get signals sent + to the process group, so we must send them. */ + for (c = children; c != 0; c = c->next) + if (c->remote) + (void) remote_kill (c->pid, sig); + + for (c = children; c != 0; c = c->next) + delete_child_targets (c); + + /* Clean up the children. We don't just use the call below because + we don't want to print the "Waiting for children" message. */ + while (job_slots_used > 0) + reap_children (1, 0); + } + else + /* Wait for our children to die. */ + while (job_slots_used > 0) + reap_children (1, 1); + + /* Delete any non-precious intermediate files that were made. */ + + remove_intermediates (1); + +#ifdef SIGQUIT + if (sig == SIGQUIT) + /* We don't want to send ourselves SIGQUIT, because it will + cause a core dump. Just exit instead. */ + exit (MAKE_TROUBLE); +#endif + +#ifdef WINDOWS32 + if (main_thread) + CloseHandle (main_thread); + /* Cannot call W32_kill with a pid (it needs a handle). The exit + status of 130 emulates what happens in Bash. */ + exit (130); +#else + /* Signal the same code; this time it will really be fatal. The signal + will be unblocked when we return and arrive then to kill us. */ + if (kill (getpid (), sig) < 0) + pfatal_with_name ("kill"); +#endif /* not WINDOWS32 */ +#endif /* not Amiga */ +#endif /* not __MSDOS__ */ +} + +/* Delete FILE unless it's precious or not actually a file (phony), + and it has changed on disk since we last stat'd it. */ + +static void +delete_target (struct file *file, const char *on_behalf_of) +{ + struct stat st; + int e; + + if (file->precious || file->phony) + return; + +#ifndef NO_ARCHIVES + if (ar_name (file->name)) + { + time_t file_date = (file->last_mtime == NONEXISTENT_MTIME + ? (time_t) -1 + : (time_t) FILE_TIMESTAMP_S (file->last_mtime)); + if (ar_member_date (file->name) != file_date) + { + if (on_behalf_of) + OSS (error, NILF, + _("*** [%s] Archive member '%s' may be bogus; not deleted"), + on_behalf_of, file->name); + else + OS (error, NILF, + _("*** Archive member '%s' may be bogus; not deleted"), + file->name); + } + return; + } +#endif + + EINTRLOOP (e, stat (file->name, &st)); + if (e == 0 + && S_ISREG (st.st_mode) + && FILE_TIMESTAMP_STAT_MODTIME (file->name, st) != file->last_mtime) + { + if (on_behalf_of) + OSS (error, NILF, + _("*** [%s] Deleting file '%s'"), on_behalf_of, file->name); + else + OS (error, NILF, _("*** Deleting file '%s'"), file->name); + if (unlink (file->name) < 0 + && errno != ENOENT) /* It disappeared; so what. */ + perror_with_name ("unlink: ", file->name); + } +} + + +/* Delete all non-precious targets of CHILD unless they were already deleted. + Set the flag in CHILD to say they've been deleted. */ + +void +delete_child_targets (struct child *child) +{ + struct dep *d; + + if (child->deleted) + return; + + /* Delete the target file if it changed. */ + delete_target (child->file, NULL); + + /* Also remove any non-precious targets listed in the 'also_make' member. */ + for (d = child->file->also_make; d != 0; d = d->next) + delete_target (d->file, child->file->name); + + child->deleted = 1; +} + +/* Print out the commands in CMDS. */ + +void +print_commands (const struct commands *cmds) +{ + const char *s; + + fputs (_("# recipe to execute"), stdout); + + if (cmds->fileinfo.filenm == 0) + puts (_(" (built-in):")); + else + printf (_(" (from '%s', line %lu):\n"), + cmds->fileinfo.filenm, cmds->fileinfo.lineno); + + s = cmds->commands; + while (*s != '\0') + { + const char *end; + int bs; + + /* Print one full logical recipe line: find a non-escaped newline. */ + for (end = s, bs = 0; *end != '\0'; ++end) + { + if (*end == '\n' && !bs) + break; + + bs = *end == '\\' ? !bs : 0; + } + + printf ("%c%.*s\n", cmd_prefix, (int) (end - s), s); + + s = end + (end[0] == '\n'); + } +} diff --git a/commands.h b/commands.h new file mode 100644 index 0000000..0d58f22 --- /dev/null +++ b/commands.h @@ -0,0 +1,41 @@ +/* Definition of data structures describing shell commands for GNU Make. +Copyright (C) 1988-2014 Free 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 + { + gmk_floc fileinfo; /* Where commands were defined. */ + char *commands; /* Commands text. */ + char **command_lines; /* Commands chopped up into lines. */ + 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: -. */ + +void execute_file_commands (struct file *file); +void print_commands (const struct commands *cmds); +void delete_child_targets (struct child *child); +void chop_commands (struct commands *cmds); +void set_file_variables (struct file *file); diff --git a/config.ami b/config.ami new file mode 100644 index 0000000..e3d6ee8 --- /dev/null +++ b/config.ami @@ -0,0 +1,337 @@ +/* config.h -- hand-massaged for Amiga -*-C-*- +Copyright (C) 1995-2014 Free 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.1" + +/* 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 strerror function. */ +#define HAVE_STRERROR 1 + +/* Define if you have the strsignal function. */ +/* #undef HAVE_STRSIGNAL */ + +/* Define if you have the wait3 function. */ +/* #undef HAVE_WAIT3 */ + +/* Define if you have the waitpid function. */ +/* #undef HAVE_WAITPID */ + +/* Define if you have the 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" diff --git a/config.h-vms b/config.h-vms new file mode 100644 index 0000000..d20953e --- /dev/null +++ b/config.h-vms @@ -0,0 +1,432 @@ +/* config.h-vms. Generated by hand by Klaus Kämpf -*-C-*- + +Copyright (C) 1996-2014 Free 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.1" + +/* 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 strerror function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the strsignal function. */ +/* #undef HAVE_STRSIGNAL */ + +/* Define to 1 if you have the wait3 function. */ +/* #undef HAVE_WAIT3 */ + +/* Define to 1 if you have the waitpid function. */ +/* #undef HAVE_WAITPID */ + +/* Define to 1 if you have the 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 + +/* Output sync sypport */ +#define NO_OUTPUT_SYNC + +/* Define to 1 to write even short single-line actions into a VMS/DCL command + file; this also enables exporting make environment variables into the + (sub-)process, which executes the action. + The usual make rules apply whether a shell variable - here a DCL symbol or + VMS logical [see CRTL getenv()] - is added to the make environment and + is exported. */ +#define USE_DCL_COM_FILE 1 + +/* Build host information. */ +#define MAKE_HOST "VMS" diff --git a/config.h.W32 b/config.h.W32 new file mode 100644 index 0000000..a525520 --- /dev/null +++ b/config.h.W32 @@ -0,0 +1,532 @@ +/* config.h.W32 -- hand-massaged config.h file for Windows builds -*-C-*- + +Copyright (C) 1996-2014 Free 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 'strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the 'stricmp' function. */ +#define HAVE_STRICMP 1 + +/* Define to 1 if you have the 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. */ +#ifdef __MINGW32__ +#define HAVE_STRNCASECMP 1 +#endif + +/* Define to 1 if you have the 'strncmpi' function. */ +/* #undef HAVE_STRNCMPI */ + +/* Define to 1 if you have the 'strndup' function. */ +/* #undef HAVE_STRNDUP */ + +/* Define to 1 if you have the 'strnicmp' function. */ +#ifdef __MINGW32__ +#define HAVE_STRNICMP 1 +#endif + +/* Define to 1 if you have the 'strsignal' function. */ +/* #undef HAVE_STRSIGNAL */ + +/* Define to 1 if you have the `isatty' function. */ +#define HAVE_ISATTY 1 + +/* Define to 1 if you have the `ttyname' function. */ +#define HAVE_TTYNAME 1 +char *ttyname (int); + +/* Define to 1 if 'n_un.n_name' is a member of 'struct nlist'. */ +/* #undef HAVE_STRUCT_NLIST_N_UN_N_NAME */ + +/* Define to 1 if you have the 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.1" + +/* Define to the character that separates directories in PATH. */ +#define PATH_SEPARATOR_CHAR ';' + +/* Define as the return type of signal handlers ('int' or 'void'). */ +#define RETSIGTYPE void + +/* Define to the name of the SCCS 'get' command. */ +#define SCCS_GET "echo no sccs get" + +/* Define this if the SCCS 'get' command understands the '-G' 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.1" + +/* Define if using the dmalloc debugging malloc package */ +/* #undef WITH_DMALLOC */ + +/* Define to 1 if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* # undef _ALL_SOURCE */ +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define to 1 if on MINIX. */ +/* #undef _MINIX */ + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define to 1 if you need to in order for 'stat' and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define to empty if 'const' does not conform to ANSI C. */ +/* #undef const */ + +#include + +/* 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 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/config.h.in b/config.h.in new file mode 100644 index 0000000..664fbc2 --- /dev/null +++ b/config.h.in @@ -0,0 +1,469 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if the `closedir' function returns void instead of `int'. */ +#undef CLOSEDIR_VOID + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to 1 if using `getloadavg.c'. */ +#undef C_GETLOADAVG + +/* Define to 1 for DGUX with . */ +#undef DGUX + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* Use high resolution file timestamps if nonzero. */ +#undef FILE_TIMESTAMP_HI_RES + +/* Define to 1 if the `getloadavg' function needs to be run setuid or setgid. + */ +#undef GETLOADAVG_PRIVILEGED + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have 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 MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +#undef HAVE_CFLOCALECOPYCURRENT + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +#undef HAVE_CFPREFERENCESCOPYAPPVALUE + +/* Define to 1 if you have the clock_gettime function. */ +#undef HAVE_CLOCK_GETTIME + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* Define to 1 if you have the declaration of `bsd_signal', and to 0 if you + don't. */ +#undef HAVE_DECL_BSD_SIGNAL + +/* Define to 1 if you have the declaration of `dlerror', and to 0 if you + don't. */ +#undef HAVE_DECL_DLERROR + +/* Define to 1 if you have the declaration of `dlopen', and to 0 if you don't. + */ +#undef HAVE_DECL_DLOPEN + +/* Define to 1 if you have the declaration of `dlsym', and to 0 if you don't. + */ +#undef HAVE_DECL_DLSYM + +/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you + don't. */ +#undef HAVE_DECL_SYS_SIGLIST + +/* Define to 1 if you have the declaration of `_sys_siglist', and to 0 if you + don't. */ +#undef HAVE_DECL__SYS_SIGLIST + +/* Define to 1 if you have the declaration of `__sys_siglist', and to 0 if you + don't. */ +#undef HAVE_DECL___SYS_SIGLIST + +/* Define to 1 if you have the 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 header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `fdopen' function. */ +#undef HAVE_FDOPEN + +/* Define to 1 if you have the `fileno' function. */ +#undef HAVE_FILENO + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `getgroups' function. */ +#undef HAVE_GETGROUPS + +/* Define to 1 if you have the `gethostbyname' function. */ +#undef HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the `gethostname' function. */ +#undef HAVE_GETHOSTNAME + +/* Define to 1 if you have the `getloadavg' function. */ +#undef HAVE_GETLOADAVG + +/* Define to 1 if you have the `getrlimit' function. */ +#undef HAVE_GETRLIMIT + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define to 1 if you have a standard gettimeofday function */ +#undef HAVE_GETTIMEOFDAY + +/* Embed GNU Guile support */ +#undef HAVE_GUILE + +/* Define if you have the iconv() function and it works. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the 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 header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the `lstat' function. */ +#undef HAVE_LSTAT + +/* Define to 1 if you have the 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 `mkstemp' function. */ +#undef HAVE_MKSTEMP + +/* Define to 1 if you have the `mktemp' function. */ +#undef HAVE_MKTEMP + +/* 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. */ +#undef HAVE_SETLOCALE + +/* Define to 1 if you have the `setregid' function. */ +#undef HAVE_SETREGID + +/* Define to 1 if you have the `setreuid' function. */ +#undef HAVE_SETREUID + +/* Define to 1 if you have the `setrlimit' function. */ +#undef HAVE_SETRLIMIT + +/* Define to 1 if you have the `setvbuf' function. */ +#undef HAVE_SETVBUF + +/* Define to 1 if you have the `sigaction' function. */ +#undef HAVE_SIGACTION + +/* Define to 1 if you have the `sigsetmask' function. */ +#undef HAVE_SIGSETMASK + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + +/* Define to 1 if you have the 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 `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strcmpi' function. */ +#undef HAVE_STRCMPI + +/* Define to 1 if you have the `strcoll' function and it is properly defined. + */ +#undef HAVE_STRCOLL + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the `stricmp' function. */ +#undef HAVE_STRICMP + +/* Define to 1 if you have the 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 `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. */ +#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_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 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 you have the `wait3' function. */ +#undef HAVE_WAIT3 + +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + +/* Build host information. */ +#undef MAKE_HOST + +/* Define to 1 to enable job server support in GNU make. */ +#undef MAKE_JOBSERVER + +/* Define to 1 to enable 'load' support in GNU make. */ +#undef MAKE_LOAD + +/* Define to 1 to enable symbolic link timestamp checking. */ +#undef MAKE_SYMLINKS + +/* Define to 1 if your `struct nlist' has an `n_un' member. Obsolete, depend + on `HAVE_STRUCT_NLIST_N_UN_N_NAME */ +#undef NLIST_NAME_UNION + +/* Define to 1 if struct nlist.n_name is a pointer rather than an array. */ +#undef NLIST_STRUCT + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to the character that separates directories in PATH. */ +#undef PATH_SEPARATOR_CHAR + +/* Define as the return type of signal handlers (`int' or `void'). */ +#undef RETSIGTYPE + +/* Define to the name of the SCCS 'get' command. */ +#undef SCCS_GET + +/* Define to 1 if the SCCS 'get' command understands the '-G' option. */ +#undef SCCS_GET_MINUS_G + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if the `S_IS*' macros in do not work properly. */ +#undef STAT_MACROS_BROKEN + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if struct stat contains a nanoseconds field */ +#undef ST_MTIM_NSEC + +/* Define to 1 on System V Release 4. */ +#undef SVR4 + +/* Define to 1 if you can safely include both 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 + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Version number of package */ +#undef VERSION + +/* Use platform specific coding */ +#undef WINDOWS32 + +/* Define if using the dmalloc debugging malloc package */ +#undef WITH_DMALLOC + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `int' if doesn't define. */ +#undef gid_t + +/* Define to `int' if does not define. */ +#undef pid_t + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to `int' if doesn't define. */ +#undef uid_t + +/* Define uintmax_t if not defined in or . */ +#undef uintmax_t diff --git a/config/Makefile.am b/config/Makefile.am new file mode 100644 index 0000000..396c234 --- /dev/null +++ b/config/Makefile.am @@ -0,0 +1,18 @@ +# -*-Makefile-*-, or close enough +# Copyright (C) 2002-2014 Free 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 . + +# Autoconf / automake know how to handle this directory. diff --git a/config/Makefile.in b/config/Makefile.in new file mode 100644 index 0000000..8ebc4fd --- /dev/null +++ b/config/Makefile.in @@ -0,0 +1,455 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# -*-Makefile-*-, or close enough +# Copyright (C) 2002-2014 Free 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = config +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ar-lib \ + compile config.guess config.rpath config.sub depcomp \ + install-sh missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/intlmacosx.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLOBINC = @GLOBINC@ +GLOBLIB = @GLOBLIB@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GUILE_CFLAGS = @GUILE_CFLAGS@ +GUILE_LIBS = @GUILE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +KMEM_GROUP = @KMEM_GROUP@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_HOST = @MAKE_HOST@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEED_SETGID = @NEED_SETGID@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +REMOTE = @REMOTE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign config/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign config/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic cscopelist-am \ + ctags-am distclean distclean-generic distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags-am uninstall uninstall-am + + +# Autoconf / automake know how to handle this directory. + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/config/ar-lib b/config/ar-lib new file mode 100755 index 0000000..fe2301e --- /dev/null +++ b/config/ar-lib @@ -0,0 +1,270 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2012-03-01.08; # UTC + +# Copyright (C) 2010-2013 Free Software Foundation, Inc. +# Written by Peter Rosin . +# +# 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 +# . + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat <. +# +# 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 ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config/config.guess b/config/config.guess new file mode 100644 index 0000000..1f5c50c --- /dev/null +++ b/config/config.guess @@ -0,0 +1,1420 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2014 Free Software Foundation, Inc. + +timestamp='2014-03-23' + +# 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. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2014 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/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 ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # 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/[-_].*/\./'` + ;; + 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}" + 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 ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + 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/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #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 + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + *:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + 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 ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /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 configury 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 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config/config.rpath b/config/config.rpath new file mode 100755 index 0000000..17298f2 --- /dev/null +++ b/config/config.rpath @@ -0,0 +1,672 @@ +#! /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-2010 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,' + ;; + darwin*) + case $cc_basename in + xlc*) + wl='-Wl,' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + ecc*) + wl='-Wl,' + ;; + icc* | ifort*) + wl='-Wl,' + ;; + lf95*) + wl='-Wl,' + ;; + pgcc | pgf77 | pgf90) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + rdos*) + ;; + solaris*) + wl='-Wl,' + ;; + 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*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we cannot use + # them. + ld_shlibs=no + ;; + 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 + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | k*bsd*-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*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + 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 test "$GCC" = yes ; then + : + else + case $cc_basename in + xlc*) + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + 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=: + ;; + 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*) + library_names_spec='$libname.a' + ;; + 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' + ;; + freebsd1*) + ;; + freebsd* | dragonfly*) + case "$host_os" in + freebsd[123]*) + library_names_spec='$libname$shrext$versuffix' ;; + *) + library_names_spec='$libname$shrext' ;; + esac + ;; + gnu*) + 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) + 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' + ;; + 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 with a ChangeLog entry to config-patches@gnu.org. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# 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 + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2014 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config/depcomp b/config/depcomp new file mode 100755 index 0000000..4ebd5b3 --- /dev/null +++ b/config/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2013-05-30.07; # UTC + +# Copyright (C) 1999-2013 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 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config/dospaths.m4 b/config/dospaths.m4 new file mode 100644 index 0000000..92fb540 --- /dev/null +++ b/config/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-2014 Free 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/config/gettext.m4 b/config/gettext.m4 new file mode 100644 index 0000000..f84e6a5 --- /dev/null +++ b/config/gettext.m4 @@ -0,0 +1,383 @@ +# gettext.m4 serial 63 (gettext-0.18) +dnl Copyright (C) 1995-2010 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 MacOS 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_TRY_LINK([#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_TRY_LINK([#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_TRY_LINK([#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/config/iconv.m4 b/config/iconv.m4 new file mode 100644 index 0000000..e2041b9 --- /dev/null +++ b/config/iconv.m4 @@ -0,0 +1,214 @@ +# iconv.m4 serial 11 (gettext-0.18.1) +dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#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_TRY_LINK([#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, HP-UX 11.11, Solaris 10. + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + AC_TRY_RUN([ +#include +#include +int main () +{ + /* 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 const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + 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, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } + /* 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 const char input[] = "\263"; + char buf[10]; + 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, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#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 const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + 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, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#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)) + return 1; + return 0; +}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], + [case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac]) + 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])]], + [[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_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || 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.]) + fi +]) diff --git a/config/install-sh b/config/install-sh new file mode 100755 index 0000000..377bb86 --- /dev/null +++ b/config/install-sh @@ -0,0 +1,527 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2011-11-20.07; # 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. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# 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_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +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 +no_target_directory= + +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 + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +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 + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/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. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 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 + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config/intlmacosx.m4 b/config/intlmacosx.m4 new file mode 100644 index 0000000..dd91025 --- /dev/null +++ b/config/intlmacosx.m4 @@ -0,0 +1,51 @@ +# intlmacosx.m4 serial 3 (gettext-0.18) +dnl Copyright (C) 2004-2010 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 MacOS X. +dnl Defines INTL_MACOSX_LIBS. +AC_DEFUN([gt_INTL_MACOSX], +[ + dnl Check for API introduced in MacOS X 10.2. + AC_CACHE_CHECK([for CFPreferencesCopyAppValue], + [gt_cv_func_CFPreferencesCopyAppValue], + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_TRY_LINK([#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 MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) + fi + dnl Check for API introduced in MacOS X 10.3. + AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_TRY_LINK([#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 MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + AC_SUBST([INTL_MACOSX_LIBS]) +]) diff --git a/config/lib-ld.m4 b/config/lib-ld.m4 new file mode 100644 index 0000000..ebb3052 --- /dev/null +++ b/config/lib-ld.m4 @@ -0,0 +1,110 @@ +# lib-ld.m4 serial 4 (gettext-0.18) +dnl Copyright (C) 1996-2003, 2009-2010 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/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.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 ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +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 GCC]) + 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. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path 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 + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + 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 GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT([$LD]) +else + AC_MSG_RESULT([no]) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/config/lib-link.m4 b/config/lib-link.m4 new file mode 100644 index 0000000..c73bd8e --- /dev/null +++ b/config/lib-link.m4 @@ -0,0 +1,774 @@ +# lib-link.m4 serial 21 (gettext-0.18) +dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ([2.54]) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + pushdef([Name],[translit([$1],[./-], [___])]) + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + popdef([NAME]) + popdef([Name]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. The missing-message +dnl defaults to 'no' and may contain additional hints for the user. +dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} +dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + pushdef([Name],[translit([$1],[./-], [___])]) + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, + dnl because these -l options might require -L options that are present in + dnl LIBS. -l options benefit only from the -L options listed before it. + dnl Otherwise, add it to the front of LIBS, because it may be a static + dnl library that depends on another static library that is present in LIBS. + dnl Static libraries benefit only from the static libraries listed after + dnl it. + case " $LIB[]NAME" in + *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; + *) LIBS="$LIB[]NAME $LIBS" ;; + esac + AC_TRY_LINK([$3], [$4], + [ac_cv_lib[]Name=yes], + [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + LIB[]NAME[]_PREFIX= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + popdef([NAME]) + popdef([Name]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl acl_libext, +dnl acl_shlibext, +dnl acl_hardcode_libdir_flag_spec, +dnl acl_hardcode_libdir_separator, +dnl acl_hardcode_direct, +dnl acl_hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE([rpath], + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_FROMPACKAGE(name, package) +dnl declares that libname comes from the given package. The configure file +dnl will then not have a --with-libname-prefix option but a +dnl --with-package-prefix option. Several libraries can come from the same +dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar +dnl macro call that searches for libname. +AC_DEFUN([AC_LIB_FROMPACKAGE], +[ + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + define([acl_frompackage_]NAME, [$2]) + popdef([NAME]) + pushdef([PACK],[$2]) + pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + define([acl_libsinpackage_]PACKUP, + m4_ifdef([acl_libsinpackage_]PACKUP, [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],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) + pushdef([PACKUP],[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],[translit(PACK,[.],[_])],PACK)]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH(P_A_C_K[-prefix], +[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib + --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + if test "$acl_libdirstem2" != "$acl_libdirstem" \ + && ! test -d "$withval/$acl_libdirstem"; then + additional_libdir="$withval/$acl_libdirstem2" + fi + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + LIB[]NAME[]_PREFIX= + dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been + dnl computed. So it has to be reset here. + HAVE_LIB[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + dnl The same code as in the loop below: + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no \ + || test "X$found_dir" = "X/usr/$acl_libdirstem" \ + || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$acl_hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + if test "$name" = '$1'; then + LIB[]NAME[]_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + */$acl_libdirstem2 | */$acl_libdirstem2/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` + if test "$name" = '$1'; then + LIB[]NAME[]_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ + && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ + || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi + popdef([P_A_C_K]) + popdef([PACKLIBS]) + popdef([PACKUP]) + popdef([PACK]) + popdef([NAME]) +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +dnl For those cases where a variable contains several -L and -l options +dnl referring to unknown libraries and directories, this macro determines the +dnl necessary additional linker options for the runtime path. +dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) +dnl sets LDADDVAR to linker options needed together with LIBSVALUE. +dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, +dnl otherwise linking without libtool is assumed. +AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], +[ + AC_REQUIRE([AC_LIB_RPATH]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + $1= + if test "$enable_rpath" != no; then + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode directories into the resulting + dnl binary. + rpathdirs= + next= + for opt in $2; do + if test -n "$next"; then + dir="$next" + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem" \ + && test "X$dir" != "X/usr/$acl_libdirstem2"; then + rpathdirs="$rpathdirs $dir" + fi + next= + else + case $opt in + -L) next=yes ;; + -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem" \ + && test "X$dir" != "X/usr/$acl_libdirstem2"; then + rpathdirs="$rpathdirs $dir" + fi + next= ;; + *) next= ;; + esac + fi + done + if test "X$rpathdirs" != "X"; then + if test -n ""$3""; then + dnl libtool is used for linking. Use -R options. + for dir in $rpathdirs; do + $1="${$1}${$1:+ }-R$dir" + done + else + dnl The linker is used for linking directly. + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user + dnl must pass all path elements in one option. + alldirs= + for dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="$flag" + else + dnl The -rpath options are cumulative. + for dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="${$1}${$1:+ }$flag" + done + fi + fi + fi + fi + fi + AC_SUBST([$1]) +]) diff --git a/config/lib-prefix.m4 b/config/lib-prefix.m4 new file mode 100644 index 0000000..1601cea --- /dev/null +++ b/config/lib-prefix.m4 @@ -0,0 +1,224 @@ +# lib-prefix.m4 serial 7 (gettext-0.18) +dnl Copyright (C) 2001-2005, 2008-2010 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/config/mdate-sh b/config/mdate-sh new file mode 100755 index 0000000..b3719cf --- /dev/null +++ b/config/mdate-sh @@ -0,0 +1,224 @@ +#!/bin/sh +# Get modification time of a file or directory and pretty-print it. + +scriptversion=2010-08-21.06; # UTC + +# Copyright (C) 1995-2013 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 + +# GNU ls changes its time format in response to the TIME_STYLE +# variable. Since we cannot assume 'unset' works, revert this +# variable to its documented default. +if test "${TIME_STYLE+set}" = set; then + TIME_STYLE=posix-long-iso + export TIME_STYLE +fi + +save_arg1=$1 + +# Find out how to get the extended ls output of a file or directory. +if ls -L /dev/null 1>/dev/null 2>&1; then + ls_command='ls -L -l -d' +else + ls_command='ls -l -d' +fi +# Avoid user/group names that might have spaces, when possible. +if ls -n /dev/null 1>/dev/null 2>&1; then + ls_command="$ls_command -n" +fi + +# A 'ls -l' line looks as follows on OS/2. +# drwxrwx--- 0 Aug 11 2001 foo +# This differs from Unix, which adds ownership information. +# drwxrwx--- 2 root root 4096 Aug 11 2001 foo +# +# To find the date, we split the line on spaces and iterate on words +# until we find a month. This cannot work with files whose owner is a +# user named "Jan", or "Feb", etc. However, it's unlikely that '/' +# will be owned by a user whose name is a month. So we first look at +# the extended ls output of the root directory to decide how many +# words should be skipped to get the date. + +# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. +set x`$ls_command /` + +# Find which argument is the month. +month= +command= +until test $month +do + test $# -gt 0 || error "failed parsing '$ls_command /' output" + shift + # Add another shift to the command. + command="$command shift;" + case $1 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; + May) month=May; nummonth=5;; + Jun) month=June; nummonth=6;; + Jul) month=July; nummonth=7;; + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; + esac +done + +test -n "$month" || error "failed parsing '$ls_command /' output" + +# Get the extended ls output of the file or directory. +set dummy x`eval "$ls_command \"\\\$save_arg1\""` + +# Remove all preceding arguments +eval $command + +# Because of the dummy argument above, month is in $2. +# +# On a POSIX system, we should have +# +# $# = 5 +# $1 = file size +# $2 = month +# $3 = day +# $4 = year or time +# $5 = filename +# +# On Darwin 7.7.0 and 7.6.0, we have +# +# $# = 4 +# $1 = day +# $2 = month +# $3 = year or time +# $4 = filename + +# Get the month. +case $2 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; + May) month=May; nummonth=5;; + Jun) month=June; nummonth=6;; + Jul) month=July; nummonth=7;; + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; +esac + +case $3 in + ???*) day=$1;; + *) day=$3; shift;; +esac + +# Here we have to deal with the problem that the ls output gives either +# the time of day or the year. +case $3 in + *:*) set `date`; eval year=\$$# + case $2 in + Jan) nummonthtod=1;; + Feb) nummonthtod=2;; + Mar) nummonthtod=3;; + Apr) nummonthtod=4;; + May) nummonthtod=5;; + Jun) nummonthtod=6;; + Jul) nummonthtod=7;; + Aug) nummonthtod=8;; + Sep) nummonthtod=9;; + Oct) nummonthtod=10;; + Nov) nummonthtod=11;; + Dec) nummonthtod=12;; + esac + # For the first six month of the year the time notation can also + # be used for files modified in the last year. + if (expr $nummonth \> $nummonthtod) > /dev/null; + then + year=`expr $year - 1` + fi;; + *) year=$3;; +esac + +# The result. +echo $day $month $year + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config/missing b/config/missing new file mode 100755 index 0000000..db98974 --- /dev/null +++ b/config/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2013 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=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config/nls.m4 b/config/nls.m4 new file mode 100644 index 0000000..003704c --- /dev/null +++ b/config/nls.m4 @@ -0,0 +1,32 @@ +# nls.m4 serial 5 (gettext-0.18) +dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 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/config/po.m4 b/config/po.m4 new file mode 100644 index 0000000..47f36a4 --- /dev/null +++ b/config/po.m4 @@ -0,0 +1,449 @@ +# po.m4 serial 17 (gettext-0.18) +dnl Copyright (C) 1995-2010 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.50]) + +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([AM_PROG_MKDIR_P])dnl defined by automake + 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.18]) + + 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" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/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 assigment 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 assigment 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" + 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 + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL([ac_cv_path_$1], +[case "[$]$1" in + [[\\/]]* | ?:[[\\/]]*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in ifelse([$5], , $PATH, [$5]); do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$][$1]) +else + AC_MSG_RESULT([no]) +fi +AC_SUBST([$1])dnl +]) diff --git a/config/texinfo.tex b/config/texinfo.tex new file mode 100644 index 0000000..6312dad --- /dev/null +++ b/config/texinfo.tex @@ -0,0 +1,10174 @@ +% 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{2014-05-20.16} +% +% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +% 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 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: +% http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or +% http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or +% http://www.gnu.org/software/texinfo/ (the Texinfo home page) +% The texinfo.tex in any given distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. +% +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. + + +\message{Loading texinfo [version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}% + \catcode`+=\active \catcode`\_=\active} + +\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\ptexstar=\* +\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 + +% Since the category of space is not known, we have to be careful. +\chardef\spacecat = 10 +\def\spaceisspace{\catcode`\ =\spacecat} + +% sometimes characters are active, so we need control sequences. +\chardef\ampChar = `\& +\chardef\colonChar = `\: +\chardef\commaChar = `\, +\chardef\dashChar = `\- +\chardef\dotChar = `\. +\chardef\exclamChar= `\! +\chardef\hashChar = `\# +\chardef\lquoteChar= `\` +\chardef\questChar = `\? +\chardef\rquoteChar= `\' +\chardef\semiChar = `\; +\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 +} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% 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 } + +% 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} + +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Output a mark which sets \thischapter, \thissection and \thiscolor. +% We dump everything together because we only have one kind of mark. +% This works because we only use \botmark / \topmark, not \firstmark. +% +% A mark contains a subexpression of the \ifcase ... \fi construct. +% \get*marks macros below extract the needed part using \ifcase. +% +% Another complication is to let the user choose whether \thischapter +% (\thissection) refers to the chapter (section) in effect at the top +% of a page, or that at the bottom of a page. The solution is +% described on page 260 of The TeXbook. It involves outputting two +% marks for the sectioning macros, one before the section break, and +% one after. I won't pretend I can describe this better than DEK... +\def\domark{% + \toks0=\expandafter{\lastchapterdefs}% + \toks2=\expandafter{\lastsectiondefs}% + \toks4=\expandafter{\prevchapterdefs}% + \toks6=\expandafter{\prevsectiondefs}% + \toks8=\expandafter{\lastcolordefs}% + \mark{% + \the\toks0 \the\toks2 % 0: top marks (\last...) + \noexpand\or \the\toks4 \the\toks6 % 1: bottom marks (default, \prev...) + \noexpand\else \the\toks8 % 2: color marks + }% +} +% \topmark doesn't work for the very first chapter (after the title +% page or the contents), so we use \firstmark there -- this gets us +% the mark with the chapter defs, unless the user sneaks in, e.g., +% @setcolor (or @url, or @link, etc.) between @contents and the very +% first @chapter. +\def\gettopheadingmarks{% + \ifcase0\topmark\fi + \ifx\thischapter\empty \ifcase0\firstmark\fi \fi +} +\def\getbottomheadingmarks{\ifcase1\botmark\fi} +\def\getcolormarks{\ifcase2\topmark\fi} + +% Avoid "undefined control sequence" errors. +\def\lastchapterdefs{} +\def\lastsectiondefs{} +\def\prevchapterdefs{} +\def\prevsectiondefs{} +\def\lastcolordefs{} + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % 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=\pagewidth \texinfochars} + % + \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi + \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}% + % + \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi + \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + % We don't want .vr (or whatever) entries like this: + % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} + % "\acronym" won't work when it's read back in; + % it needs to be + % {\code {{\tt \backslashcurfont }acronym} + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingyyy.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 24pt + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \indexdummies + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1\relax \unvbox#1\relax +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% 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. +% +\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. +\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\foo{...} +% is roughly equivalent to +% \def\foo{\parsearg\Xfoo} +% \def\Xfoo#1{...} +% +% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my +% favourite TeX trick. --kasal, 16nov03 + +\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. + % \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 = \pageheight \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\pageheight + \page + \fi + \fi + \box\groupbox + \prevdepth = \dimen1 + \checkinserts +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +\parseargdef\need{% + % Ensure vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % If the @need value is less than one line space, it's useless. + \dimen0 = #1\mil + \dimen2 = \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak + \fi +} + +% @br forces paragraph break (and is undocumented). + +\let\br = \par + +% @page forces the start of a new page. +% +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% This defn is used inside fill environments such as @defun. +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} + +% This defn is used inside nofill environments such as @example. +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount + \leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. Not documented, written for gawk manual. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). This command +% is not documented, not supported, and doesn't work. +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% @include FILE -- \input text of FILE. +% +\def\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% + \makevalueexpandable % we want to expand any @value in FILE. + \turnoffactive % and allow special characters in the expansion + \indexnofonts % Allow `@@' and other weird things in file names. + \wlog{texinfo.tex: doing @include of #1^^J}% + \edef\temp{\noexpand\input #1 }% + % + % This trickery is to read FILE outside of a group, in case it makes + % definitions, etc. + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \catcode`-=\other + \catcode`\`=\other + \catcode`\'=\other +} + +\def\pushthisfilestack{% + \expandafter\pushthisfilestackX\popthisfilestack\StackTerm +} +\def\pushthisfilestackX{% + \expandafter\pushthisfilestackY\thisfile\StackTerm +} +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% + \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% +} + +\def\popthisfilestack{\errthisfilestackempty} +\def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} +% +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\parseargdef\center{% + \ifhmode + \let\centersub\centerH + \else + \let\centersub\centerV + \fi + \centersub{\hfil \ignorespaces#1\unskip \hfil}% + \let\centersub\relax % don't let the definition persist, just in case +} +\def\centerH#1{{% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break +}} +% +\newcount\centerpenalty +\def\centerV#1{% + % The idea here is the same as in \startdefun, \cartouche, etc.: if + % @center is the first thing after a section heading, we need to wipe + % out the negative parskip inserted by \sectionheading, but still + % prevent a page break here. + \centerpenalty = \lastpenalty + \ifnum\centerpenalty>10000 \vskip\parskip \fi + \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi + \line{\kern\leftskip #1\kern\rightskip}% +} + +% @sp n outputs n lines of vertical space +% +\parseargdef\sp{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment +% +\def\comment{\begingroup \catcode`\^^M=\other% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\commentxxx} +{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} +% +\let\c=\comment + +% @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 + +% 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 (before @setfilename). +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=\jobname.aux + \fi % \openindices needs to do some work in any case. + \openindices + \let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + \openin 1 texinfo.cnf + \ifeof 1 \else \input texinfo.cnf \fi + \closein 1 + % + \comment % Ignore the actual filename. +} + +% Called from \setfilename. +% +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% @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 +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 +% can be set). So we test for \relax and 0 as well as being undefined. +\ifx\pdfoutput\thisisundefined +\else + \ifx\pdfoutput\relax + \else + \ifcase\pdfoutput + \else + \pdftrue + \fi + \fi +\fi + +% PDF uses PostScript string constants for the names of xref targets, +% for display in the outlines, and in other places. Thus, we have to +% double any backslashes. Otherwise, a name like "\node" will be +% interpreted as a newline (\n), followed by o, d, e. Not good. +% +% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and +% related messages. The final outcome is that it is up to the TeX user +% to double the backslashes and otherwise make the string valid, so +% that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to +% do this reliably, so we use it. + +% #1 is a control sequence in which to do the replacements, +% which we \xdef. +\def\txiescapepdf#1{% + \ifx\pdfescapestring\thisisundefined + % No primitive available; should we give a warning or log? + % Many times it won't matter. + \else + % The expandable \pdfescapestring primitive escapes parentheses, + % backslashes, and other special chars. + \xdef#1{\pdfescapestring{#1}}% + \fi +} + +\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images +with PDF output, and none of those formats could be found. (.eps cannot +be supported due to the design of the PDF format; use regular TeX (DVI +output) for that.)} + +\ifpdf + % + % Color manipulation macros using ideas from pdfcolor.tex, + % except using rgb instead of cmyk; the latter is said to render as a + % very dark gray on-screen and a very dark halftone in print, instead + % of actual black. The dark red here is dark enough to print on paper as + % nearly black, but still distinguishable for online viewing. We use + % black by default, though. + \def\rgbDarkRed{0.50 0.09 0.12} + \def\rgbBlack{0 0 0} + % + % k sets the color for filling (usual text, etc.); + % K sets the color for stroking (thin rules, e.g., normal _'s). + \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} + % + % Set color, and create a mark which defines \thiscolor accordingly, + % so that \makeheadline knows which color to restore. + \def\setcolor#1{% + \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% + \domark + \pdfsetcolor{#1}% + } + % + \def\maincolor{\rgbBlack} + \pdfsetcolor{\maincolor} + \edef\thiscolor{\maincolor} + \def\lastcolordefs{} + % + \def\makefootline{% + \baselineskip24pt + \line{\pdfsetcolor{\maincolor}\the\footline}% + } + % + \def\makeheadline{% + \vbox to 0pt{% + \vskip-22.5pt + \line{% + \vbox to8.5pt{}% + % Extract \thiscolor definition from the marks. + \getcolormarks + % Typeset the headline with \maincolor, then restore the color. + \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% + }% + \vss + }% + \nointerlineskip + } + % + % + \pdfcatalog{/PageMode /UseOutlines} + % + % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). + \def\dopdfimage#1#2#3{% + \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% + \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% + % + % pdftex (and the PDF format) support .pdf, .png, .jpg (among + % others). Let's try in that order, PDF first since if + % someone has a scalable image, presumably better to use that than a + % bitmap. + \let\pdfimgext=\empty + \begingroup + \openin 1 #1.pdf \ifeof 1 + \openin 1 #1.PDF \ifeof 1 + \openin 1 #1.png \ifeof 1 + \openin 1 #1.jpg \ifeof 1 + \openin 1 #1.jpeg \ifeof 1 + \openin 1 #1.JPG \ifeof 1 + \errhelp = \nopdfimagehelp + \errmessage{Could not find image file #1 for pdf}% + \else \gdef\pdfimgext{JPG}% + \fi + \else \gdef\pdfimgext{jpeg}% + \fi + \else \gdef\pdfimgext{jpg}% + \fi + \else \gdef\pdfimgext{png}% + \fi + \else \gdef\pdfimgext{PDF}% + \fi + \else \gdef\pdfimgext{pdf}% + \fi + \closein 1 + \endgroup + % + % without \immediate, ancient pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifdim \wd0 >0pt width \pdfimagewidth \fi + \ifdim \wd2 >0pt height \pdfimageheight \fi + \ifnum\pdftexversion<13 + #1.\pdfimgext + \else + {#1.\pdfimgext}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + % + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code, and characters + % such as \, aren't expanded when present in a section title. + \indexnofonts + \turnoffactive + \makevalueexpandable + \def\pdfdestname{#1}% + \txiescapepdf\pdfdestname + \safewhatsit{\pdfdest name{\pdfdestname} xyz}% + }} + % + % used to mark target names; must be expandable. + \def\pdfmkpgn#1{#1} + % + % by default, use black for everything. + \def\urlcolor{\rgbBlack} + \def\linkcolor{\rgbBlack} + \def\endlink{\setcolor{\maincolor}\pdfendlink} + % + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text, which is what will be displayed in the + % outline by the pdf viewer. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node text, + % which might be empty if this toc entry had no corresponding node. + % #4 is the page number + % + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worth the trouble, since most documents are normally structured. + \edef\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty + \def\pdfoutlinedest{#4}% + \else + \txiescapepdf\pdfoutlinedest + \fi + % + % Also escape PDF chars in the display string. + \edef\pdfoutlinetext{#1}% + \txiescapepdf\pdfoutlinetext + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% + } + % + \def\pdfmakeoutlines{% + \begingroup + % Read toc silently, to get counts of subentries for \pdfoutline. + \def\partentry##1##2##3##4{}% ignore parts in the outlines + \def\numchapentry##1##2##3##4{% + \def\thischapnum{##2}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + }% + \def\numsecentry##1##2##3##4{% + \advancenumber{chap\thischapnum}% + \def\thissecnum{##2}% + \def\thissubsecnum{0}% + }% + \def\numsubsecentry##1##2##3##4{% + \advancenumber{sec\thissecnum}% + \def\thissubsecnum{##2}% + }% + \def\numsubsubsecentry##1##2##3##4{% + \advancenumber{subsec\thissubsecnum}% + }% + \def\thischapnum{0}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + % + % use \def rather than \let here because we redefine \chapentry et + % al. a second time, below. + \def\appentry{\numchapentry}% + \def\appsecentry{\numsecentry}% + \def\appsubsecentry{\numsubsecentry}% + \def\appsubsubsecentry{\numsubsubsecentry}% + \def\unnchapentry{\numchapentry}% + \def\unnsecentry{\numsecentry}% + \def\unnsubsecentry{\numsubsecentry}% + \def\unnsubsubsecentry{\numsubsubsecentry}% + \readdatafile{toc}% + % + % Read toc second time, this time actually producing the outlines. + % The `-' means take the \expnumber as the absolute number of + % subentries, which we calculated on our first read of the .toc above. + % + % We use the node names as the destinations. + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% count is always zero + \dopdfoutline{##1}{}{##3}{##4}}% + % + % PDF outlines are displayed using system fonts, instead of + % document fonts. Therefore we cannot use special characters, + % since the encoding is unknown. For example, the eogonek from + % Latin 2 (0xea) gets translated to a | character. Info from + % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. + % + % TODO this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Too + % much work for too little return. Just use the ASCII equivalents + % we use for the index sort strings. + % + \indexnofonts + \setupdatafile + % We can have normal brace characters in the PDF outlines, unlike + % Texinfo index files. So set that up. + \def\{{\lbracecharliteral}% + \def\}{\rbracecharliteral}% + \catcode`\\=\active \otherbackslash + \input \tocreadfilename + \endgroup + } + {\catcode`[=1 \catcode`]=2 + \catcode`{=\other \catcode`}=\other + \gdef\lbracecharliteral[{]% + \gdef\rbracecharliteral[}]% + ] + % + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \nextsp} + \def\getfilename#1{% + \filenamelength=0 + % If we don't expand the argument now, \skipspaces will get + % snagged on things like "@value{foo}". + \edef\temp{#1}% + \expandafter\skipspaces\temp|\relax + } + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + % make a live url in pdf output. + \def\pdfurl#1{% + \begingroup + % it seems we really need yet another set of dummies; have not + % tried to figure out what each command should do in the context + % of @url. for now, just make @/ a no-op, that's the only one + % people have actually reported a problem with. + % + \normalturnoffactive + \def\@{@}% + \let\/=\empty + \makevalueexpandable + % do we want to go so far as to use \indexnofonts instead of just + % special-casing \var here? + \def\var##1{##1}% + % + \leavevmode\setcolor{\urlcolor}% + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \setcolor{\linkcolor}#1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\else + % non-pdf mode + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\setcolor = \gobble + \let\pdfsetcolor = \gobble + \let\pdfmakeoutlines = \relax +\fi % \ifx\pdfoutput + + +\message{fonts,} + +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +% +\def\setfontstyle#1{% + \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. + \csname ten#1\endcsname % change the current font +} + +% Select #1 fonts with the current style. +% +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} + +\def\rm{\fam=0 \setfontstyle{rm}} +\def\it{\fam=\itfam \setfontstyle{it}} +\def\sl{\fam=\slfam \setfontstyle{sl}} +\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} +\def\tt{\fam=\ttfam \setfontstyle{tt}} + +% Unfortunately, we have to override this for titles and the like, since +% in those cases "rm" is bold. Sigh. +\def\rmisbold{\rm\def\curfontstyle{bf}} + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf. +\newfam\sffam +\def\sf{\fam=\sffam \setfontstyle{sf}} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} + + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +% can get a sort of poor man's double spacing by redefining this. +\def\baselinefactor{1} +% +\newdimen\textleading +\def\setleading#1{% + \dimen0 = #1\relax + \normalbaselineskip = \baselinefactor\dimen0 + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% PDF CMaps. See also LaTeX's t1.cmap. +% +% do nothing with this by default. +\expandafter\let\csname cmapOT1\endcsname\gobble +\expandafter\let\csname cmapOT1IT\endcsname\gobble +\expandafter\let\csname cmapOT1TT\endcsname\gobble + +% if we are producing pdf, and we have \pdffontattr, then define cmaps. +% (\pdffontattr was introduced many years ago, but people still run +% older pdftex's; it's easy to conditionalize, so we do.) +\ifpdf \ifx\pdffontattr\thisisundefined \else + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1-0) +%%Title: (TeX-OT1-0 TeX OT1 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1) +/Supplement 0 +>> def +/CMapName /TeX-OT1-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<23> <26> <0023> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +40 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1IT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1IT-0) +%%Title: (TeX-OT1IT-0 TeX OT1IT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1IT) +/Supplement 0 +>> def +/CMapName /TeX-OT1IT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<25> <26> <0025> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +42 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<23> <0023> +<24> <00A3> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1IT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1TT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1TT-0) +%%Title: (TeX-OT1TT-0 TeX OT1TT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1TT) +/Supplement 0 +>> def +/CMapName /TeX-OT1TT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +5 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<21> <26> <0021> +<28> <5F> <0028> +<61> <7E> <0061> +endbfrange +32 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <2191> +<0C> <2193> +<0D> <0027> +<0E> <00A1> +<0F> <00BF> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<20> <2423> +<27> <2019> +<60> <2018> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1TT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +\fi\fi + + +% Set the font macro #1 to the font named \fontprefix#2. +% #3 is the font's design size, #4 is a scale factor, #5 is the CMap +% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). +% Example: +% #1 = \textrm +% #2 = \rmshape +% #3 = 10 +% #4 = \mainmagstep +% #5 = OT1 +% +\def\setfont#1#2#3#4#5{% + \font#1=\fontprefix#2#3 scaled #4 + \csname cmap#5\endcsname#1% +} +% This is what gets called when #5 of \setfont is empty. +\let\cmap\gobble +% +% (end of cmaps) + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\thisisundefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} % where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +% Definitions for a main text size of 11pt. (The default in Texinfo.) +% +\def\definetextfontsizexi{% +% Text fonts (11.2pt, magstep1). +\def\textnominalsize{11pt} +\edef\mainmagstep{\magstephalf} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1095} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstep1}{OT1} +\setfont\deftt\ttshape{10}{\magstep1}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\titleecsize{2074} + +% Chapter (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\secit\itbshape{10}{\magstep2}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep2}{OT1} +\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\secsf\sfbshape{12}{\magstep1}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2}{OT1} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 +\def\sececsize{1440} + +% Subsection fonts (13.15pt). +\def\ssecnominalsize{13pt} +\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} +\setfont\ssecit\itbshape{10}{1315}{OT1IT} +\setfont\ssecsl\slbshape{10}{1315}{OT1} +\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} +\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1315}{OT1} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 +\def\ssececsize{1200} + +% Reduced fonts for @acro in text (10pt). +\def\reducednominalsize{10pt} +\setfont\reducedrm\rmshape{10}{1000}{OT1} +\setfont\reducedtt\ttshape{10}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{1000}{OT1} +\setfont\reducedit\itshape{10}{1000}{OT1IT} +\setfont\reducedsl\slshape{10}{1000}{OT1} +\setfont\reducedsf\sfshape{10}{1000}{OT1} +\setfont\reducedsc\scshape{10}{1000}{OT1} +\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} +\font\reducedi=cmmi10 +\font\reducedsy=cmsy10 +\def\reducedecsize{1000} + +\textleading = 13.2pt % line spacing for 11pt CM +\textfonts % reset the current fonts +\rm +} % end of 11pt text font size definitions, \definetextfontsizexi + + +% Definitions to make the main text be 10pt Computer Modern, with +% section, chapter, etc., sizes following suit. This is for the GNU +% Press printing of the Emacs 22 manual. Maybe other manuals in the +% future. Used with @smallbook, which sets the leading to 12pt. +% +\def\definetextfontsizex{% +% Text fonts (10pt). +\def\textnominalsize{10pt} +\edef\mainmagstep{1000} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1000} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstephalf}{OT1} +\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\titleecsize{2074} + +% Chapter fonts (14.4pt). +\def\chapnominalsize{14pt} +\setfont\chaprm\rmbshape{12}{\magstep1}{OT1} +\setfont\chapit\itbshape{10}{\magstep2}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep2}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\chapsf\sfbshape{12}{\magstep1}{OT1} +\let\chapbf\chaprm +\setfont\chapsc\scbshape{10}{\magstep2}{OT1} +\font\chapi=cmmi12 scaled \magstep1 +\font\chapsy=cmsy10 scaled \magstep2 +\def\chapecsize{1440} + +% Section fonts (12pt). +\def\secnominalsize{12pt} +\setfont\secrm\rmbshape{12}{1000}{OT1} +\setfont\secit\itbshape{10}{\magstep1}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep1}{OT1} +\setfont\sectt\ttbshape{12}{1000}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} +\setfont\secsf\sfbshape{12}{1000}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep1}{OT1} +\font\seci=cmmi12 +\font\secsy=cmsy10 scaled \magstep1 +\def\sececsize{1200} + +% Subsection fonts (10pt). +\def\ssecnominalsize{10pt} +\setfont\ssecrm\rmbshape{10}{1000}{OT1} +\setfont\ssecit\itbshape{10}{1000}{OT1IT} +\setfont\ssecsl\slbshape{10}{1000}{OT1} +\setfont\ssectt\ttbshape{10}{1000}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} +\setfont\ssecsf\sfbshape{10}{1000}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1000}{OT1} +\font\sseci=cmmi10 +\font\ssecsy=cmsy10 +\def\ssececsize{1000} + +% Reduced fonts for @acro in text (9pt). +\def\reducednominalsize{9pt} +\setfont\reducedrm\rmshape{9}{1000}{OT1} +\setfont\reducedtt\ttshape{9}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{900}{OT1} +\setfont\reducedit\itshape{9}{1000}{OT1IT} +\setfont\reducedsl\slshape{9}{1000}{OT1} +\setfont\reducedsf\sfshape{9}{1000}{OT1} +\setfont\reducedsc\scshape{10}{900}{OT1} +\setfont\reducedttsl\ttslshape{10}{900}{OT1TT} +\font\reducedi=cmmi9 +\font\reducedsy=cmsy9 +\def\reducedecsize{0900} + +\divide\parskip by 2 % reduce space between paragraphs +\textleading = 12pt % line spacing for 10pt CM +\textfonts % reset the current fonts +\rm +} % end of 10pt text font size definitions, \definetextfontsizex + + +% We provide the user-level command +% @fonttextsize 10 +% (or 11) to redefine the text font size. pt is assumed. +% +\def\xiword{11} +\def\xword{10} +\def\xwordpt{10pt} +% +\parseargdef\fonttextsize{% + \def\textsizearg{#1}% + %\wlog{doing @fonttextsize \textsizearg}% + % + % Set \globaldefs so that documents can use this inside @tex, since + % makeinfo 4.8 does not support it, but we need it nonetheless. + % + \begingroup \globaldefs=1 + \ifx\textsizearg\xword \definetextfontsizex + \else \ifx\textsizearg\xiword \definetextfontsizexi + \else + \errhelp=\EMsimple + \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} + \fi\fi + \endgroup +} + + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts except +% in the main text, we don't bother to reset \scriptfont and +% \scriptscriptfont (which would also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy + \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf + \textfont\ttfam=\tentt \textfont\sffam=\tensf +} + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this because \STYLE needs to also set the +% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire +% \tenSTYLE to set the current font. +% +% Each font-changing command also sets the names \lsize (one size lower) +% and \lllsize (three sizes lower). These relative commands are used in +% the LaTeX logo and acronyms. +% +% This all needs generalizing, badly. +% +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy + \let\tenttsl=\textttsl + \def\curfontsize{text}% + \def\lsize{reduced}\def\lllsize{smaller}% + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \def\curfontsize{title}% + \def\lsize{chap}\def\lllsize{subsec}% + \resetmathfonts \setleading{27pt}} +\def\titlefont#1{{\titlefonts\rmisbold #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy + \let\tenttsl=\chapttsl + \def\curfontsize{chap}% + \def\lsize{sec}\def\lllsize{text}% + \resetmathfonts \setleading{19pt}} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy + \let\tenttsl=\secttsl + \def\curfontsize{sec}% + \def\lsize{subsec}\def\lllsize{reduced}% + \resetmathfonts \setleading{17pt}} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy + \let\tenttsl=\ssecttsl + \def\curfontsize{ssec}% + \def\lsize{text}\def\lllsize{small}% + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts +\def\reducedfonts{% + \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl + \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc + \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy + \let\tenttsl=\reducedttsl + \def\curfontsize{reduced}% + \def\lsize{small}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallfonts{% + \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl + \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc + \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy + \let\tenttsl=\smallttsl + \def\curfontsize{small}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl + \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc + \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy + \let\tenttsl=\smallerttsl + \def\curfontsize{smaller}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{9.5pt}} + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000}{OT1} +\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 +\setfont\shortcontsl\slshape{12}{1000}{OT1} +\setfont\shortconttt\ttshape{12}{1000}{OT1TT} + +% Define these just so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts = \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=86 smallbook=72 a4=90 a5=69 +% If we use \scriptfonts (8pt), then we can fit this many characters: +% 8.5x11=90+ smallbook=80 a4=90+ a5=77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=71 smallbook=60 a4=75 a5=58 +% --karl, 24jan03. + +% Set up the default fonts, so we can use them for creating boxes. +% +\definetextfontsizexi + + +\message{markup,} + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will +% define and register \INITMACRO to be called on markup style changes. +% \INITMACRO can check \currentmarkupstyle for the innermost +% style and the set of \ifmarkupSTYLE switches for all styles +% currently in effect. +\newif\ifmarkupvar +\newif\ifmarkupsamp +\newif\ifmarkupkey +%\newif\ifmarkupfile % @file == @samp. +%\newif\ifmarkupoption % @option == @samp. +\newif\ifmarkupcode +\newif\ifmarkupkbd +%\newif\ifmarkupenv % @env == @code. +%\newif\ifmarkupcommand % @command == @code. +\newif\ifmarkuptex % @tex (and part of @math, for now). +\newif\ifmarkupexample +\newif\ifmarkupverb +\newif\ifmarkupverbatim + +\let\currentmarkupstyle\empty + +\def\setupmarkupstyle#1{% + \csname markup#1true\endcsname + \def\currentmarkupstyle{#1}% + \markupstylesetup +} + +\let\markupstylesetup\empty + +\def\defmarkupstylesetup#1{% + \expandafter\def\expandafter\markupstylesetup + \expandafter{\markupstylesetup #1}% + \def#1% +} + +% Markup style setup for left and right quotes. +\defmarkupstylesetup\markupsetuplq{% + \expandafter\let\expandafter \temp + \csname markupsetuplq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuplqdefault \else \temp \fi +} + +\defmarkupstylesetup\markupsetuprq{% + \expandafter\let\expandafter \temp + \csname markupsetuprq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuprqdefault \else \temp \fi +} + +{ +\catcode`\'=\active +\catcode`\`=\active + +\gdef\markupsetuplqdefault{\let`\lq} +\gdef\markupsetuprqdefault{\let'\rq} + +\gdef\markupsetcodequoteleft{\let`\codequoteleft} +\gdef\markupsetcodequoteright{\let'\codequoteright} +} + +\let\markupsetuplqcode \markupsetcodequoteleft +\let\markupsetuprqcode \markupsetcodequoteright +% +\let\markupsetuplqexample \markupsetcodequoteleft +\let\markupsetuprqexample \markupsetcodequoteright +% +\let\markupsetuplqkbd \markupsetcodequoteleft +\let\markupsetuprqkbd \markupsetcodequoteright +% +\let\markupsetuplqsamp \markupsetcodequoteleft +\let\markupsetuprqsamp \markupsetcodequoteright +% +\let\markupsetuplqverb \markupsetcodequoteleft +\let\markupsetuprqverb \markupsetcodequoteright +% +\let\markupsetuplqverbatim \markupsetcodequoteleft +\let\markupsetuprqverbatim \markupsetcodequoteright + +% Allow an option to not use regular directed right quote/apostrophe +% (char 0x27), but instead the undirected quote from cmtt (char 0x0d). +% The undirected quote is ugly, so don't make it the default, but it +% works for pasting with more pdf viewers (at least evince), the +% lilypond developers report. xpdf does work with the regular 0x27. +% +\def\codequoteright{% + \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax + \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax + '% + \else \char'15 \fi + \else \char'15 \fi +} +% +% and a similar option for the left quote char vs. a grave accent. +% Modern fonts display ASCII 0x60 as a grave accent, so some people like +% the code environments to do likewise. +% +\def\codequoteleft{% + \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax + \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax + % [Knuth] pp. 380,381,391 + % \relax disables Spanish ligatures ?` and !` of \tt font. + \relax`% + \else \char'22 \fi + \else \char'22 \fi +} + +% Commands to set the quote options. +% +\parseargdef\codequoteundirected{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxicodequoteundirected\endcsname + = t% + \else\ifx\temp\offword + \expandafter\let\csname SETtxicodequoteundirected\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% + \fi\fi +} +% +\parseargdef\codequotebacktick{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxicodequotebacktick\endcsname + = t% + \else\ifx\temp\offword + \expandafter\let\csname SETtxicodequotebacktick\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% + \fi\fi +} + +% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. +\def\noligaturesquoteleft{\relax\lq} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Font commands. + +% #1 is the font command (\sl or \it), #2 is the text to slant. +% If we are in a monospaced environment, however, 1) always use \ttsl, +% and 2) do not add an italic correction. +\def\dosmartslant#1#2{% + \ifusingtt + {{\ttsl #2}\let\next=\relax}% + {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% + \next +} +\def\smartslanted{\dosmartslant\sl} +\def\smartitalic{\dosmartslant\it} + +% Output an italic correction unless \next (presumed to be the following +% character) is such as not to need one. +\def\smartitaliccorrection{% + \ifx\next,% + \else\ifx\next-% + \else\ifx\next.% + \else\ifx\next\.% + \else\ifx\next\comma% + \else\ptexslash + \fi\fi\fi\fi\fi + \aftersmartic +} + +% Unconditional use \ttsl, and no ic. @var is set to this for defuns. +\def\ttslanted#1{{\ttsl #1}} + +% @cite is like \smartslanted except unconditionally use \sl. We never want +% ttsl for book titles, do we? +\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} + +\def\aftersmartic{} +\def\var#1{% + \let\saveaftersmartic = \aftersmartic + \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% + \smartslanted{#1}% +} + +\let\i=\smartitalic +\let\slanted=\smartslanted +\let\dfn=\smartslanted +\let\emph=\smartitalic + +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +% @b, explicit bold. Also @strong. +\def\b#1{{\bf #1}} +\let\strong=\b + +% @sansserif, explicit sans. +\def\sansserif#1{{\sf #1}} + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=11 + \def\plainfrenchspacing{% + \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m + \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + \def\endofsentencespacefactor{1000}% for @. and friends + } + \def\plainnonfrenchspacing{% + \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 + \def\endofsentencespacefactor{3000}% for @. and friends + } +\catcode`@=\other +\def\endofsentencespacefactor{3000}% default + +% @t, explicit typewriter. +\def\t#1{% + {\tt \rawbackslash \plainfrenchspacing #1}% + \null +} + +% @samp. +\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} + +% @indicateurl is \samp, that is, with quotes. +\let\indicateurl=\samp + +% @code (and similar) prints in typewriter, but with spaces the same +% size as normal in the surrounding text, without hyphenation, etc. +% This is a subroutine for that. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \plainfrenchspacing + #1% + }% + \null % reset spacefactor to 1000 +} + +% We *must* turn on hyphenation at `-' and `_' in @code. +% (But see \codedashfinish below.) +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. +% +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. -- rms. +{ + \catcode`\-=\active \catcode`\_=\active + \catcode`\'=\active \catcode`\`=\active + \global\let'=\rq \global\let`=\lq % default definitions + % + \global\def\code{\begingroup + \setupmarkupstyle{code}% + % The following should really be moved into \setupmarkupstyle handlers. + \catcode\dashChar=\active \catcode\underChar=\active + \ifallowcodebreaks + \let-\codedash + \let_\codeunder + \else + \let-\normaldash + \let_\realunder + \fi + % Given -foo (with a single dash), we do not want to allow a break + % after the hyphen. + \global\let\codedashprev=\codedash + % + \codex + } + % + \gdef\codedash{\futurelet\next\codedashfinish} + \gdef\codedashfinish{% + \normaldash % always output the dash character itself. + % + % Now, output a discretionary to allow a line break, unless + % (a) the next character is a -, or + % (b) the preceding character is a -. + % E.g., given --posix, we do not want to allow a break after either -. + % Given --foo-bar, we do want to allow a break between the - and the b. + \ifx\next\codedash \else + \ifx\codedashprev\codedash + \else \discretionary{}{}{}\fi + \fi + % we need the space after the = for the case when \next itself is a + % space token; it would get swallowed otherwise. As in @code{- a}. + \global\let\codedashprev= \next + } +} +\def\normaldash{-} +% +\def\codex #1{\tclose{#1}\endgroup} + +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} + +% An additional complication: the above will allow breaks after, e.g., +% each of the four underscores in __typeof__. This is bad. +% @allowcodebreaks provides a document-level way to turn breaking at - +% and _ on and off. +% +\newif\ifallowcodebreaks \allowcodebreakstrue + +\def\keywordtrue{true} +\def\keywordfalse{false} + +\parseargdef\allowcodebreaks{% + \def\txiarg{#1}% + \ifx\txiarg\keywordtrue + \allowcodebreakstrue + \else\ifx\txiarg\keywordfalse + \allowcodebreaksfalse + \else + \errhelp = \EMsimple + \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% + \fi\fi +} + +% For @command, @env, @file, @option quotes seem unnecessary, +% so use \code rather than \samp. +\let\command=\code +\let\env=\code +\let\file=\code +\let\option=\code + +% @uref (abbreviation for `urlref') aka @url takes an optional +% (comma-separated) second argument specifying the text to display and +% an optional third arg as text to display instead of (rather than in +% addition to) the url itself. First (mandatory) arg is the url. + +% TeX-only option to allow changing PDF output to show only the second +% arg (if given), and not the url (which is then just the link target). +\newif\ifurefurlonlylink + +% The main macro is \urefbreak, which allows breaking at expected +% places within the url. (There used to be another version, which +% didn't support automatic breaking.) +\def\urefbreak{\begingroup \urefcatcodes \dourefbreak} +\let\uref=\urefbreak +% +\def\dourefbreak#1{\urefbreakfinish #1,,,\finish} +\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% look for second arg + \ifdim\wd0 > 0pt + \ifpdf + \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 + \unhbox0\ (\urefcode{#1})% DVI, always show arg and url + \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\ampChar=\active \catcode\dotChar=\active + \catcode\hashChar=\active \catcode\questChar=\active + \catcode\slashChar=\active +} +{ + \urefcatcodes + % + \global\def\urefcode{\begingroup + \setupmarkupstyle{code}% + \urefcatcodes + \let&\urefcodeamp + \let.\urefcodedot + \let#\urefcodehash + \let?\urefcodequest + \let/\urefcodeslash + \codex + } + % + % By default, they are just regular characters. + \global\def&{\normalamp} + \global\def.{\normaldot} + \global\def#{\normalhash} + \global\def?{\normalquest} + \global\def/{\normalslash} +} + +% we put a little stretch before and after the breakable chars, to help +% line breaking of long url's. The unequal skips make look better in +% cmtt at least, especially for dots. +\def\urefprestretchamount{.13em} +\def\urefpoststretchamount{.1em} +\def\urefprestretch{\urefprebreak \hskip0pt plus\urefprestretchamount\relax} +\def\urefpoststretch{\urefpostbreak \hskip0pt plus\urefprestretchamount\relax} +% +\def\urefcodeamp{\urefprestretch \&\urefpoststretch} +\def\urefcodedot{\urefprestretch .\urefpoststretch} +\def\urefcodehash{\urefprestretch \#\urefpoststretch} +\def\urefcodequest{\urefprestretch ?\urefpoststretch} +\def\urefcodeslash{\futurelet\next\urefcodeslashfinish} +{ + \catcode`\/=\active + \global\def\urefcodeslashfinish{% + \urefprestretch \slashChar + % Allow line break only after the final / in a sequence of + % slashes, to avoid line break between the slashes in http://. + \ifx\next/\else \urefpoststretch \fi + } +} + +% One more complication: by default we'll break after the special +% characters, but some people like to break before the special chars, so +% allow that. Also allow no breaking at all, for manual control. +% +\parseargdef\urefbreakstyle{% + \def\txiarg{#1}% + \ifx\txiarg\wordnone + \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} + \else\ifx\txiarg\wordbefore + \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} + \else\ifx\txiarg\wordafter + \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} + \else + \errhelp = \EMsimple + \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% + \fi\fi\fi +} +\def\wordafter{after} +\def\wordbefore{before} +\def\wordnone{none} + +\urefbreakstyle after + +% @url synonym for @uref, since that's how everyone uses it. +% +\let\url=\uref + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \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} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +% @acronym for "FBI", "NATO", and the like. +% We print this one point size smaller, since it's intended for +% all-uppercase. +% +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi + \null % reset \spacefactor=1000 +} + +% @abbr for "Comput. J." and the like. +% No font change, but don't do end-of-sentence spacing. +% +\def\abbr#1{\doabbr #1,,\finish} +\def\doabbr#1,#2,#3\finish{% + {\plainfrenchspacing #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi + \null % reset \spacefactor=1000 +} + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode`\_ = \active + \gdef\mathunderscore{% + \catcode`\_=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a math (or tt) \. +% FYI, plain.tex uses \\ as a temporary control sequence (for no +% particular reason), but this is not advertised and we don't care. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \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 + $\finishmath +} +\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 + } +} + +% ctrl is no longer a Texinfo command, but leave this definition for fun. +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. +% Ignore unless FMTNAME == tex; then it is like @iftex and @tex, +% except specified as a normal braced arg, so no newlines to worry about. +% +\def\outfmtnametex{tex} +% +\long\def\inlinefmt#1{\doinlinefmt #1,\finish} +\long\def\doinlinefmt#1,#2,\finish{% + \def\inlinefmtname{#1}% + \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi +} +% +% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if +% FMTNAME is tex, else ELSE-TEXT. +\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} +\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% + \def\inlinefmtname{#1}% + \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi +} +% +% For raw, must switch into @tex before parsing the argument, to avoid +% setting catcodes prematurely. Doing it this way means that, for +% example, @inlineraw{html, foo{bar} gets a parse error instead of being +% ignored. But this isn't important because if people want a literal +% *right* brace they would have to use a command anyway, so they may as +% well use a command to get a left brace too. We could re-use the +% delimiter character idea from \verb, but it seems like overkill. +% +\long\def\inlineraw{\tex \doinlineraw} +\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} +\def\doinlinerawtwo#1,#2,\finish{% + \def\inlinerawname{#1}% + \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi + \endgroup % close group opened by \tex. +} + +% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. +% +\long\def\inlineifset#1{\doinlineifset #1,\finish} +\long\def\doinlineifset#1,#2,\finish{% + \def\inlinevarname{#1}% + \expandafter\ifx\csname SET\inlinevarname\endcsname\relax + \else\ignorespaces#2\fi +} + +% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. +% +\long\def\inlineifclear#1{\doinlineifclear #1,\finish} +\long\def\doinlineifclear#1,#2,\finish{% + \def\inlinevarname{#1}% + \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi +} + + +\message{glyphs,} +% and logos. + +% @@ prints an @, as does @atchar{}. +\def\@{\char64 } +\let\atchar=\@ + +% @{ @} @lbracechar{} @rbracechar{} all generate brace characters. +% Unless we're in typewriter, use \ecfont because the CM text fonts do +% not have braces, and we don't want to switch into math. +\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} +\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} +\let\{=\mylbrace \let\lbracechar=\{ +\let\}=\myrbrace \let\rbracechar=\} +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux/toc files. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma = , + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \ptexc +\let\dotaccent = \ptexdot +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \ptext +\let\ubaraccent = \ptexb +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi + \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) +% +\edef\TeX{\TeX \spacefactor=1000 } + +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +% +\def\LaTeX{% + L\kern-.36em + {\setbox0=\hbox{T}% + \vbox to \ht0{\hbox{% + \ifx\textnominalsize\xwordpt + % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. + % Revert to plain's \scriptsize, which is 7pt. + \count255=\the\fam $\fam\count255 \scriptstyle A$% + \else + % For 11pt, we can use our lllsize. + \selectfonts\lllsize A% + \fi + }% + \vss + }}% + \kern-.15em + \TeX +} + +% Some math mode symbols. +\def\bullet{$\ptexbullet$} +\def\geq{\ifmmode \ge\else $\ge$\fi} +\def\leq{\ifmmode \le\else $\le$\fi} +\def\minus{\ifmmode -\else $-$\fi} + +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in the cm +% typewriter fonts as three actual period characters; on the other hand, +% in other typewriter fonts three periods are wider than 1.5em. So do +% whichever is larger. +% +\def\dots{% + \leavevmode + \setbox0=\hbox{...}% get width of three periods + \ifdim\wd0 > 1.5em + \dimen0 = \wd0 + \else + \dimen0 = 1.5em + \fi + \hbox to \dimen0{% + \hskip 0pt plus.25fil + .\hskip 0pt plus1fil + .\hskip 0pt plus1fil + .\hskip 0pt plus.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \dots + \spacefactor=\endofsentencespacefactor +} + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, they should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} +\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} +% +\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{% + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @pounds{} is a sterling sign, which Knuth put in the CM italic font. +% +\def\pounds{{\it\$}} + +% @euro{} comes from a separate font, depending on the current style. +% We use the free feym* fonts from the eurosym package by Henrik +% Theiling, which support regular, slanted, bold and bold slanted (and +% "outlined" (blackboard board, sort of) versions, which we don't need). +% It is available from http://www.ctan.org/tex-archive/fonts/eurosym. +% +% Although only regular is the truly official Euro symbol, we ignore +% that. The Euro is designed to be slightly taller than the regular +% font height. +% +% feymr - regular +% feymo - slanted +% feybr - bold +% feybo - bold slanted +% +% There is no good (free) typewriter version, to my knowledge. +% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. +% Hmm. +% +% Also doesn't work in math. Do we need to do math with euro symbols? +% Hope not. +% +% +\def\euro{{\eurofont e}} +\def\eurofont{% + % We set the font at each command, rather than predefining it in + % \textfonts and the other font-switching commands, so that + % installations which never need the symbol don't have to have the + % font installed. + % + % There is only one designed size (nominal 10pt), so we always scale + % that to the current nominal size. + % + % By the way, simply using "at 1em" works for cmr10 and the like, but + % does not work for cmbx10 and other extended/shrunken fonts. + % + \def\eurosize{\csname\curfontsize nominalsize\endcsname}% + % + \ifx\curfontstyle\bfstylename + % bold: + \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize + \else + % regular: + \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize + \fi + \thiseurofont +} + +% Glyphs from the EC fonts. We don't use \let for the aliases, because +% sometimes we redefine the original macro, and the alias should reflect +% the redefinition. +% +% Use LaTeX names for the Icelandic letters. +\def\DH{{\ecfont \char"D0}} % Eth +\def\dh{{\ecfont \char"F0}} % eth +\def\TH{{\ecfont \char"DE}} % Thorn +\def\th{{\ecfont \char"FE}} % thorn +% +\def\guillemetleft{{\ecfont \char"13}} +\def\guillemotleft{\guillemetleft} +\def\guillemetright{{\ecfont \char"14}} +\def\guillemotright{\guillemetright} +\def\guilsinglleft{{\ecfont \char"0E}} +\def\guilsinglright{{\ecfont \char"0F}} +\def\quotedblbase{{\ecfont \char"12}} +\def\quotesinglbase{{\ecfont \char"0D}} +% +% This positioning is not perfect (see the ogonek LaTeX package), but +% we have the precomposed glyphs for the most common cases. We put the +% tests to use those glyphs in the single \ogonek macro so we have fewer +% dummy definitions to worry about for index entries, etc. +% +% ogonek is also used with other letters in Lithuanian (IOU), but using +% the precomposed glyphs for those is not so easy since they aren't in +% the same EC font. +\def\ogonek#1{{% + \def\temp{#1}% + \ifx\temp\macrocharA\Aogonek + \else\ifx\temp\macrochara\aogonek + \else\ifx\temp\macrocharE\Eogonek + \else\ifx\temp\macrochare\eogonek + \else + \ecfont \setbox0=\hbox{#1}% + \ifdim\ht0=1ex\accent"0C #1% + \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% + \fi + \fi\fi\fi\fi + }% +} +\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} +\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} +\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} +\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} +% +% Use the ec* fonts (cm-super in outline format) for non-CM glyphs. +\def\ecfont{% + % 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 = ectt\ecsize \space at \nominalsize + \else + \ifx\curfontstyle\bfstylename + % bold: + \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize + \else + % regular: + \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \fi + \fi + \thisecfont +} + +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% + \hfil\crcr\Orb}}% + }$% +} + +% @textdegree - the normal degrees sign. +% +\def\textdegree{$^\circ$} + +% Laurent Siebenmann reports \Orb undefined with: +% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 +% so we'll define it if necessary. +% +\ifx\Orb\thisisundefined +\def\Orb{\mathhexbox20D} +\fi + +% Quotes. +\chardef\quotedblleft="5C +\chardef\quotedblright=`\" +\chardef\quoteleft=`\` +\chardef\quoteright=`\' + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue + +\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 + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents = \relax + \global\let\contents = \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents = \relax + \global\let\shortcontents = \relax + \fi +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +% Settings used for typesetting titles: no hyphenation, no indentation, +% don't worry much about spacing, ragged right. This should be used +% inside a \vbox, and fonts need to be set appropriately first. Because +% it is always used for titles, nothing else, we call \rmisbold. \par +% should be specified before the end of the \vbox, since a vbox is a group. +% +\def\raggedtitlesettings{% + \rmisbold + \hyphenpenalty=10000 + \parindent=0pt + \tolerance=5000 + \ptexraggedright +} + +% Macros to be used within @titlepage: + +\let\subtitlerm=\tenrm +\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} + +\parseargdef\title{% + \checkenv\titlepage + \vbox{\titlefonts \raggedtitlesettings #1\par}% + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +} + +\parseargdef\subtitle{% + \checkenv\titlepage + {\subtitlefont \rightline{#1}}% +} + +% @author should come last, but may come many times. +% It can also be used inside @quotation. +% +\parseargdef\author{% + \def\temp{\quotation}% + \ifx\thisenv\temp + \def\quotationauthor{#1}% printed in \Equotation. + \else + \checkenv\titlepage + \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi + {\secfonts\rmisbold \leftline{#1}}% + \fi +} + + +% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages + +% Now make 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\pageheight 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 + +\def\evenheadingmarks{\headingmarks{even}{heading}} +\def\oddheadingmarks{\headingmarks{odd}{heading}} +\def\evenfootingmarks{\headingmarks{even}{footing}} +\def\oddfootingmarks{\headingmarks{odd}{footing}} +\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} + \headingmarks{odd}{heading}{#1} } +\def\everyfootingmarks#1 {\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. + +\def\headings #1 {\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{\thischapter\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{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\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{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\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}% + % + \vadjust{\penalty 1200}}% not good to break after first line of item. + \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 + } +} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we call \makevalueexpandable in \indexdummies). +% The command has to be fully expandable (if the variable is set), since +% the result winds up in the index file. This means that if the +% variable's value contains other Texinfo commands, it's almost certain +% it will fail (although perhaps we could fix that with sufficient work +% to do a one-level expansion on the result, instead of complete). +% +% Unfortunately, this has the consequence that when _ is in the *value* +% of an @set, it does not print properly in the roman fonts (get the cmr +% dot accent at position 126 instead). No fix comes to mind, and it's +% been this way since 2003 or earlier, so just ignore it. +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @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 foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. +% +\def\newindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 % Open the file + \fi + \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{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 + \fi + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% +} + + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +% +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \relax + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname donesynindex#2\endcsname = 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname + \expandafter\let\csname#2indfile\endcsname=\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +% Take care of Texinfo commands that can appear in an index entry. +% Since there are some commands we want to expand, and others we don't, +% we have to laboriously prevent expansion for those that we don't. +% +\def\indexdummies{% + \escapechar = `\\ % use backslash in output files. + \def\@{@}% change to @@ when we switch to @ as escape char in index files. + \def\ {\realbackslash\space }% + % + % Need these unexpandable (because we define \tt as a dummy) + % definitions when @{ or @} appear in index entry text. Also, more + % complicated, when \tex is in effect and \{ is a \delimiter again. + % We can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. Perhaps we + % should use @lbracechar and @rbracechar? + \def\{{{\tt\char123}}% + \def\}{{\tt\char125}}% + % + % I don't entirely understand this, but when an index entry is + % generated from a macro call, the \endinput which \scanmacro inserts + % causes processing to be prematurely terminated. This is, + % apparently, because \indexsorttmp is fully expanded, and \endinput + % is an expandable command. The redefinition below makes \endinput + % disappear altogether for that purpose -- although logging shows that + % processing continues to some further point. On the other hand, it + % seems \endinput does not hurt in the printed index arg, since that + % is still getting written without apparent harm. + % + % Sample source (mac-idx3.tex, reported by Graham Percival to + % help-texinfo, 22may06): + % @macro funindex {WORD} + % @findex xyz + % @end macro + % ... + % @funindex commtest + % This is not enough to reproduce the bug, but it gives the flavor. + % + % Sample whatsit resulting: + % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} + % + % So: + \let\endinput = \empty + % + % Do the redefinitions. + \commondummies +} + +% For the aux and toc files, @ is the escape character. So we want to +% redefine everything using @ as the escape character (instead of +% \realbackslash, still used for index files). When everything uses @, +% this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ = \lbraceatcmd + \let\} = \rbraceatcmd + % + % Do the redefinitions. + \commondummies + \otherbackslash +} + +% Called from \indexdummies and \atdummies. +% +\def\commondummies{% + % + % \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. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % 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). + % + \def\definedummyword ##1{\def##1{\string##1\space}}% + \def\definedummyletter##1{\def##1{\string##1}}% + \let\definedummyaccent\definedummyletter + % + \commondummiesnofonts + % + \definedummyletter\_% + \definedummyletter\-% + % + % Non-English letters. + \definedummyword\AA + \definedummyword\AE + \definedummyword\DH + \definedummyword\L + \definedummyword\O + \definedummyword\OE + \definedummyword\TH + \definedummyword\aa + \definedummyword\ae + \definedummyword\dh + \definedummyword\exclamdown + \definedummyword\l + \definedummyword\o + \definedummyword\oe + \definedummyword\ordf + \definedummyword\ordm + \definedummyword\questiondown + \definedummyword\ss + \definedummyword\th + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword\bf + \definedummyword\gtr + \definedummyword\hat + \definedummyword\less + \definedummyword\sf + \definedummyword\sl + \definedummyword\tclose + \definedummyword\tt + % + \definedummyword\LaTeX + \definedummyword\TeX + % + % Assorted special characters. + \definedummyword\arrow + \definedummyword\bullet + \definedummyword\comma + \definedummyword\copyright + \definedummyword\registeredsymbol + \definedummyword\dots + \definedummyword\enddots + \definedummyword\entrybreak + \definedummyword\equiv + \definedummyword\error + \definedummyword\euro + \definedummyword\expansion + \definedummyword\geq + \definedummyword\guillemetleft + \definedummyword\guillemetright + \definedummyword\guilsinglleft + \definedummyword\guilsinglright + \definedummyword\lbracechar + \definedummyword\leq + \definedummyword\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\textdegree + % + % We want to disable all macros so that they are not expanded by \write. + \macrolist + % + \normalturnoffactive + % + % Handle some cases of @value -- where it does not contain any + % (non-fully-expandable) commands. + \makevalueexpandable +} + +% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% +\def\commondummiesnofonts{% + % Control letters and accents. + \definedummyletter\!% + \definedummyaccent\"% + \definedummyaccent\'% + \definedummyletter\*% + \definedummyaccent\,% + \definedummyletter\.% + \definedummyletter\/% + \definedummyletter\:% + \definedummyaccent\=% + \definedummyletter\?% + \definedummyaccent\^% + \definedummyaccent\`% + \definedummyaccent\~% + \definedummyword\u + \definedummyword\v + \definedummyword\H + \definedummyword\dotaccent + \definedummyword\ogonek + \definedummyword\ringaccent + \definedummyword\tieaccent + \definedummyword\ubaraccent + \definedummyword\udotaccent + \definedummyword\dotless + % + % Texinfo font commands. + \definedummyword\b + \definedummyword\i + \definedummyword\r + \definedummyword\sansserif + \definedummyword\sc + \definedummyword\slanted + \definedummyword\t + % + % Commands that take arguments. + \definedummyword\abbr + \definedummyword\acronym + \definedummyword\anchor + \definedummyword\cite + \definedummyword\code + \definedummyword\command + \definedummyword\dfn + \definedummyword\dmn + \definedummyword\email + \definedummyword\emph + \definedummyword\env + \definedummyword\file + \definedummyword\image + \definedummyword\indicateurl + \definedummyword\inforef + \definedummyword\kbd + \definedummyword\key + \definedummyword\math + \definedummyword\option + \definedummyword\pxref + \definedummyword\ref + \definedummyword\samp + \definedummyword\strong + \definedummyword\tie + \definedummyword\uref + \definedummyword\url + \definedummyword\var + \definedummyword\verb + \definedummyword\w + \definedummyword\xref + % + % Consider: + % @macro mkind{arg1,arg2} + % @cindex \arg2\ + % @end macro + % @mkind{foo, bar} + % The space after the comma will end up in the temporary definition + % that we make for arg2 (see \parsemargdef ff.). We want all this to be + % expanded for the sake of the index, so we end up just seeing "bar". + \let\xeatspaces = \eatspaces +} + +% For testing: output @{ and @} in index sort strings as \{ and \}. +\newif\ifusebracesinindexes + +% \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\definedummyaccent##1{\let##1\asis}% + % We can just ignore other control letters. + \def\definedummyletter##1{\let##1\empty}% + % All control words become @asis by default; overrides below. + \let\definedummyword\definedummyaccent + % + \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 + % + % Unfortunately, texindex is not prepared to handle braces in the + % content at all. So for index sorting, we map @{ and @} to strings + % starting with |, since that ASCII character is between ASCII { and }. + \ifusebracesinindexes + \def\lbracechar{\lbracecmd}% + \def\rbracechar{\rbracecmd}% + \else + \def\lbracechar{|a}% + \def\rbracechar{|b}% + \fi + \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{ZZZ}% + \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{zzz}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. + % (The following {} will end up in the sort string, but that's ok.) + \def\arrow{->}% + \def\bullet{bullet}% + \def\comma{,}% + \def\copyright{copyright}% + \def\dots{...}% + \def\enddots{...}% + \def\equiv{==}% + \def\error{error}% + \def\euro{euro}% + \def\expansion{==>}% + \def\geq{>=}% + \def\guillemetleft{<<}% + \def\guillemetright{>>}% + \def\guilsinglleft{<}% + \def\guilsinglright{>}% + \def\leq{<=}% + \def\minus{-}% + \def\point{.}% + \def\pounds{pounds}% + \def\print{-|}% + \def\quotedblbase{"}% + \def\quotedblleft{"}% + \def\quotedblright{"}% + \def\quoteleft{`}% + \def\quoteright{'}% + \def\quotesinglbase{,}% + \def\registeredsymbol{R}% + \def\result{=>}% + \def\textdegree{o}% + % + \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax + \else \indexlquoteignore \fi + % + % 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 +} + +% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us +% ignore left quotes in the sort term. +{\catcode`\`=\active + \gdef\indexlquoteignore{\let`=\empty}} + +\let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% Most index entries go through here, but \dosubind is the general case. +% #1 is the index name, #2 is the entry text. +\def\doind#1#2{\dosubind{#1}{#2}{}} + +% Workhorse for all \fooindexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% empty if called from \doind, as we usually are (the main exception +% is with most defuns, which call us directly). +% +\def\dosubind#1#2#3{% + \iflinks + {% + % Store the main index entry text (including the third arg). + \toks0 = {#2}% + % If third arg is present, precede it with a space. + \def\thirdarg{#3}% + \ifx\thirdarg\empty \else + \toks0 = \expandafter{\the\toks0 \space #3}% + \fi + % + \edef\writeto{\csname#1indfile\endcsname}% + % + \safewhatsit\dosubindwrite + }% + \fi +} + +% Write the entry in \toks0 to the index file: +% +\def\dosubindwrite{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% + \fi + % + % Remember, we are within a group. + \indexdummies % Must do this here, since \bf, etc expand at this stage + \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % Process the index entry with all font commands turned off, to + % get the string to sort by. + {\indexnofonts + \edef\temp{\the\toks0}% need full expansion + \xdef\indexsorttmp{\temp}% + }% + % + % 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{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% + }% + \temp +} + +% Take care of unwanted page breaks/skips around a whatsit: +% +% If a skip is the last thing on the list now, preserve it +% by backing up by \lastskip, doing the \write, then inserting +% the skip again. Otherwise, the whatsit generated by the +% \write or \pdfdest will make \lastskip zero. The result is that +% sequences like this: +% @end defun +% @tindex whatever +% @defun ... +% will have extra space inserted, because the \medbreak in the +% start of the @defun won't see the skip inserted by the @end of +% the previous defun. +% +% But don't do any of this if we're not in vertical mode. We +% don't want to do a \vskip and prematurely end a paragraph. +% +% Avoid page breaks due to these extra skips, too. +% +% But wait, there is a catch there: +% We'll have to check whether \lastskip is zero skip. \ifdim is not +% sufficient for this purpose, as it ignores stretch and shrink parts +% of the skip. The only way seems to be to check the textual +% representation of the skip. +% +% The following is almost like \def\zeroskipmacro{0.0pt} except that +% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). +% +\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} +% +\newskip\whatsitskip +\newcount\whatsitpenalty +% +% ..., ready, GO: +% +\def\safewhatsit#1{\ifhmode + #1% + \else + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \whatsitskip = \lastskip + \edef\lastskipmacro{\the\lastskip}% + \whatsitpenalty = \lastpenalty + % + % If \lastskip is nonzero, that means the last item was a + % skip. And since a skip is discardable, that means this + % -\whatsitskip glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\whatsitskip + \fi + % + #1% + % + \ifx\lastskipmacro\zeroskipmacro + % If \lastskip was zero, perhaps the last item was a penalty, and + % perhaps it was >=10000, e.g., a \nobreak. In that case, we want + % to re-insert the same penalty (values >10000 are used for various + % signals); since we just inserted a non-discardable item, any + % following glue (such as a \parskip) would be a breakpoint. For example: + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\whatsitskip + \fi +\fi} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\parseargdef\printindex{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \plainfrenchspacing + \everypar = {}% don't want the \kern\-parindent from indentation suppression. + % + % See if the index file exists and is nonempty. + % Change catcode of @ here so that if the index file contains + % \initial {@} + % as its first line, TeX doesn't complain about mismatched braces + % (because it thinks @} is a control sequence). + \catcode`\@ = 11 + \openin 1 \jobname.#1s + \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 + \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 \temp + \ifeof 1 + \putwordIndexIsEmpty + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\backslashcurfont}% + \catcode`\\ = 0 + \escapechar = `\\ + \begindoublecolumns + \input \jobname.#1s + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +\def\initial#1{{% + % Some minor font changes for the special characters. + \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt + % + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + \nobreak + \vskip 0pt plus 3\baselineskip + \penalty 0 + \vskip 0pt plus -3\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 .5\baselineskip + \leftline{\secbf #1}% + % Do our best not to break after the initial. + \nobreak + \vskip .33\baselineskip plus .1\baselineskip +}} + +% \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. +% +% A straightforward implementation would start like this: +% \def\entry#1#2{... +% But this freezes the catcodes in the argument, and can cause problems to +% @code, which sets - active. This problem was fixed by a kludge--- +% ``-'' was active throughout whole index, but this isn't really right. +% The right solution is to prevent \entry from swallowing the whole text. +% --kasal, 21nov03 +\def\entry{% + \begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent = 2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus1pt + % + % 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}% + % + % Swallow the left brace of the text (first parameter): + \afterassignment\doentry + \let\temp = +} +\def\entrybreak{\unskip\space\ignorespaces}% +\def\doentry{% + \bgroup % Instead of the swallowed brace. + \noindent + \aftergroup\finishentry + % And now comes the text of the entry. +} +\def\finishentry#1{% + % #1 is the page number. + % + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \setbox\boxA = \hbox{#1}% + \ifdim\wd\boxA = 0pt + \ % + \else + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ifpdf + \pdfgettoks#1.% + \ \the\toksA + \else + \ #1% + \fi + \fi + \par + \endgroup +} + +% Like plain.tex's \dotfill, except uses up at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \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 + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} + +% The double-column output routine for all double-column pages except +% the last. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \hbox to\pagewidth{\box0\hfil\box2}% +} +% +% All done 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 \pageheight (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. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Called at the end of the double column material. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +% Let's start with @part. +\outer\parseargdef\part{\partzzz{#1}} +\def\partzzz#1{% + \chapoddpage + \null + \vskip.3\vsize % move it down on the page a bit + \begingroup + \noindent \titlefonts\rmisbold #1\par % the text + \let\lastnode=\empty % no node to associate with + \writetocentry{part}{#1}{}% but put it in the toc + \headingsoff % no headline or footline on the part page + \chapoddpage + \endgroup +} + +% \unnumberedno is an oxymoron. But we count the unnumbered +% sections so that we can refer to them unambiguously in the pdf +% outlines by their "section number". We avoid collisions with chapter +% numbers by starting them at 10000. (If a document ever has 10000 +% chapters, we're in trouble anyway, I'm sure.) +\newcount\unnumberedno \unnumberedno = 10000 +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +% +% \def\appendixletter{\char\the\appendixno} +% We do the following ugly conditional instead of the above simple +% construct for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +% +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines these (using marks) as the number+name, number +% and name of the chapter. Page headings and footings can use +% these. @section does likewise. +\def\thischapter{} +\def\thischapternum{} +\def\thischaptername{} +\def\thissection{} +\def\thissectionnum{} +\def\thissectionname{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% we only have subsub. +\chardef\maxseclevel = 3 +% +% A numbered section within an unnumbered changes to unnumbered too. +% To achieve this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unnlevel = \maxseclevel +% +% Trace whether the current chapter is an appendix or not: +% \chapheadtype is "N" or "A", unnumbered chapters are ignored. +\def\chapheadtype{N} + +% Choose a heading macro +% #1 is heading type +% #2 is heading level +% #3 is text for heading +\def\genhead#1#2#3{% + % Compute the abs. sec. level: + \absseclevel=#2 + \advance\absseclevel by \secbase + % Make sure \absseclevel doesn't fall outside the range: + \ifnum \absseclevel < 0 + \absseclevel = 0 + \else + \ifnum \absseclevel > 3 + \absseclevel = 3 + \fi + \fi + % The heading type: + \def\headtype{#1}% + \if \headtype U% + \ifnum \absseclevel < \unnlevel + \chardef\unnlevel = \absseclevel + \fi + \else + % Check for appendix sections: + \ifnum \absseclevel = 0 + \edef\chapheadtype{\headtype}% + \else + \if \headtype A\if \chapheadtype N% + \errmessage{@appendix... within a non-appendix chapter}% + \fi\fi + \fi + % Check for numbered within unnumbered: + \ifnum \absseclevel > \unnlevel + \def\headtype{U}% + \else + \chardef\unnlevel = 3 + \fi + \fi + % Now print the heading: + \if \headtype U% + \ifcase\absseclevel + \unnumberedzzz{#3}% + \or \unnumberedseczzz{#3}% + \or \unnumberedsubseczzz{#3}% + \or \unnumberedsubsubseczzz{#3}% + \fi + \else + \if \headtype A% + \ifcase\absseclevel + \appendixzzz{#3}% + \or \appendixsectionzzz{#3}% + \or \appendixsubseczzz{#3}% + \or \appendixsubsubseczzz{#3}% + \fi + \else + \ifcase\absseclevel + \chapterzzz{#3}% + \or \seczzz{#3}% + \or \numberedsubseczzz{#3}% + \or \numberedsubsubseczzz{#3}% + \fi + \fi + \fi + \suppressfirstparagraphindent +} + +% an interface: +\def\numhead{\genhead N} +\def\apphead{\genhead A} +\def\unnmhead{\genhead U} + +% @chapter, @appendix, @unnumbered. Increment top-level counter, reset +% all lower-level sectioning counters to zero. +% +% Also set \chaplevelprefix, which we prepend to @float sequence numbers +% (e.g., figures), q.v. By default (before any chapter), that is empty. +\let\chaplevelprefix = \empty +% +\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz#1{% + % section resetting is \global in case the chapter is in a group, such + % as an @include file. + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\chapno by 1 + % + % Used for \float. + \gdef\chaplevelprefix{\the\chapno.}% + \resetallfloatnos + % + % \putwordChapter can contain complex things in translations. + \toks0=\expandafter{\putwordChapter}% + \message{\the\toks0 \space \the\chapno}% + % + % Write the actual heading. + \chapmacro{#1}{Ynumbered}{\the\chapno}% + % + % So @section and the like are numbered underneath this chapter. + \global\let\section = \numberedsec + \global\let\subsection = \numberedsubsec + \global\let\subsubsection = \numberedsubsubsec +} + +\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz +% +\def\appendixzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\appendixno by 1 + \gdef\chaplevelprefix{\appendixletter.}% + \resetallfloatnos + % + % \putwordAppendix can contain complex things in translations. + \toks0=\expandafter{\putwordAppendix}% + \message{\the\toks0 \space \appendixletter}% + % + \chapmacro{#1}{Yappendix}{\appendixletter}% + % + \global\let\section = \appendixsec + \global\let\subsection = \appendixsubsec + \global\let\subsubsection = \appendixsubsubsec +} + +% normally unnmhead0 calls unnumberedzzz: +\outer\parseargdef\unnumbered{\unnmhead0{#1}} +\def\unnumberedzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\unnumberedno by 1 + % + % Since an unnumbered has no number, no prefix for figures. + \global\let\chaplevelprefix = \empty + \resetallfloatnos + % + % This used to be simply \message{#1}, but TeX fully expands the + % argument to \message. Therefore, if #1 contained @-commands, TeX + % expanded them. For example, in `@unnumbered The @cite{Book}', TeX + % expanded @cite (which turns out to cause errors because \cite is meant + % to be executed, not expanded). + % + % Anyway, we don't want the fully-expanded definition of @cite to appear + % as a result of the \message, we just want `@cite' itself. We use + % \the 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{% + % Well, we could do the following in a group, but that would break + % an assumption that \chapmacro is called at the outermost level. + % Thus we are safer this way: --kasal, 24feb04 + \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}} +\def\chappager{\par\vfill\supereject} +% 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 +} + +\def\setchapternewpage #1 {\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 + +% Chapter opening. +% +% #1 is the text, #2 is the section type (Ynumbered, Ynothing, +% Yappendix, Yomitfromtoc), #3 the chapter number. +% +% To test against our argument. +\def\Ynothingkeyword{Ynothing} +\def\Yomitfromtockeyword{Yomitfromtoc} +\def\Yappendixkeyword{Yappendix} +% +\def\chapmacro#1#2#3{% + % Insert the first mark before the heading break (see notes for \domark). + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% + \gdef\thissection{}}% + % + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{\thischaptername}}% + \else\ifx\temptype\Yomitfromtockeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{}}% + \else\ifx\temptype\Yappendixkeyword + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\appendixletter}% + % \noexpand\putwordAppendix avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} + \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \else + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\the\chapno}% + % \noexpand\putwordChapter avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordChapter{} + \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \fi\fi\fi + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert the chapter heading break. + \pchapsepmacro + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \domark + % + {% + \chapfonts \rmisbold + % + % Have to define \lastsection before calling \donoderef, because the + % xref code eventually uses it. On the other hand, it has to be called + % after \pchapsepmacro, or the headline will change too soon. + \gdef\lastsection{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unnchap}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 = \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + \else + \setbox0 = \hbox{#3\enspace}% + \def\toctype{numchap}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. + \nobreak % Avoid page breaks at the interline glue. + \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerparameters{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt +} + + +% I don't think this chapter style is supported any more, so I'm not +% updating it with the new noderef stuff. We'll see. --karl, 11aug03. +% +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} +% +\def\unnchfopen #1{% + \chapoddpage + \vbox{\chapfonts \raggedtitlesettings #1\par}% + \nobreak\bigskip\nobreak +} +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} +\def\centerchfopen #1{% + \chapoddpage + \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% + \nobreak\bigskip \nobreak +} +\def\CHAPFopen{% + \global\let\chapmacro=\chfopen + \global\let\centerchapmacro=\centerchfopen} + + +% 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, #2 is the section level (sec/subsec/subsubsec), #3 is +% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the +% section number. +% +\def\seckeyword{sec} +% +\def\sectionheading#1#2#3#4{% + {% + \checkenv{}% should not be in an environment. + % + % Switch to the right set of fonts. + \csname #2fonts\endcsname \rmisbold + % + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + % Insert first mark before the heading break (see notes for \domark). + \let\prevsectiondefs=\lastsectiondefs + \ifx\temptype\Ynothingkeyword + \ifx\sectionlevel\seckeyword + \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% + \gdef\thissection{\thissectionname}}% + \fi + \else\ifx\temptype\Yomitfromtockeyword + % Don't redefine \thissection. + \else\ifx\temptype\Yappendixkeyword + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \else + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \fi\fi\fi + % + % Go into vertical mode. Usually we'll already be there, but we + % don't want the following whatsit to end up in a preceding paragraph + % if the document didn't happen to have a blank line. + \par + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert space above the heading. + \csname #2headingbreak\endcsname + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \global\let\prevsectiondefs=\lastsectiondefs + \domark + % + % Only insert the space after the number if we have a section number. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unn}% + \gdef\lastsection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \lastsection. + \setbox0 = \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\lastsection{#1}% + \else + \setbox0 = \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\lastsection{#1}% + \fi\fi\fi + % + % Write the toc entry (before \donoderef). See comments in \chapmacro. + \writetocentry{\toctype\sectionlevel}{#1}{#4}% + % + % Write the node reference (= pdf destination for pdftex). + % Again, see comments in \chapmacro. + \donoderef{#3}% + % + % Interline glue will be inserted when the vbox is completed. + % That glue will be a valid breakpoint for the page, since it'll be + % preceded by a whatsit (usually from the \donoderef, or from the + % \writetocentry if there was no node). We don't want to allow that + % break, since then the whatsits could end up on page n while the + % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. + \nobreak + % + % Output the actual section heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright + \hangindent=\wd0 % zero if no section number + \unhbox0 #1}% + }% + % Add extra space after the heading -- half of whatever came above it. + % Don't allow stretch, though. + \kern .5 \csname #2headingskip\endcsname + % + % Do not let the kern be a potential breakpoint, as it would be if it + % was followed by glue. + \nobreak + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a + % discardable item.) However, when a paragraph is not started next + % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out + % or the negative glue will cause weirdly wrong output, typically + % obscuring the section heading with something else. + \vskip-\parskip + % + % This is so the last item on the main vertical list is a known + % \penalty > 10000, so \startdefun, etc., can recognize the situation + % and do the needful. + \penalty 10001 +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. +% +% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} +% We append the current node name (if any) and page number as additional +% arguments for the \{chap,sec,...}entry macros which will eventually +% read this. The node name is used in the pdf outlines as the +% destination to jump to. +% +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% But if #1 is `omit', then we don't do anything. This is used for the +% table of contents chapter openings themselves. +% +\newif\iftocfileopened +\def\omitkeyword{omit}% +% +\def\writetocentry#1#2#3{% + \edef\writetoctype{#1}% + \ifx\writetoctype\omitkeyword \else + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + {\atdummies + \edef\temp{% + \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% + \temp + }% + \fi + \fi + % + % Tell \shipout to create a pdf destination on each page, if we're + % writing pdf. These are used in the table of contents. We can't + % just write one on every page because the title pages are numbered + % 1 and 2 (the page numbers aren't printed), and so are the first + % two pages of the document. Thus, we'd have two destinations named + % `1', and two named `2'. + \ifpdf \global\pdfmakepagedesttrue \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. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi +} + +% redefined for the two-volume lispref. We always output on +% \jobname.toc even if this is redefined. +% +\def\tocreadfilename{\jobname.toc} + +% Normal (long) toc. +% +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \ifeof 1 \else + \pdfmakeoutlines + \fi + \closein 1 + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\partentry = \shortpartentry + \let\numchapentry = \shortchapentry + \let\appentry = \shortchapentry + \let\unnchapentry = \shortunnchapentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf + \let\sl=\shortcontsl \let\tt=\shortconttt + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\numsecentry##1##2##3##4{} + \let\appsecentry = \numsecentry + \let\unnsecentry = \numsecentry + \let\numsubsecentry = \numsecentry + \let\appsubsecentry = \numsecentry + \let\unnsubsecentry = \numsecentry + \let\numsubsubsecentry = \numsecentry + \let\appsubsubsecentry = \numsecentry + \let\unnsubsubsecentry = \numsecentry + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \closein 1 + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} +\let\shortcontents = \summarycontents + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `A' for an appendix, or `3' for a chapter. +% +\def\shortchaplabel#1{% + % This space should be enough, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + % + % We'd like to right-justify chapter numbers, but that looks strange + % with appendix letters. And right-justifying numbers and + % left-justifying letters looks strange when there is less than 10 + % chapters. Have to read the whole toc once to know how many chapters + % there are before deciding ... + \hbox to 1em{#1\hss}% +} + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Parts, in the main contents. Replace the part number, which doesn't +% exist, with an empty box. Let's hope all the numbers have the same width. +% Also ignore the page number, which is conventionally not printed. +\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} +\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} +% +% Parts, in the short toc. +\def\shortpartentry#1#2#3#4{% + \penalty-300 + \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip + \shortchapentry{{\bf #1}}{\numeralbox}{}{}% +} + +% Chapters, in the main contents. +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3#4{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% +} + +% Appendices, in the main contents. +% Need the word Appendix, and a fixed-size box. +% +\def\appendixbox#1{% + % We use M since it's probably the widest letter. + \setbox0 = \hbox{\putwordAppendix{} M}% + \hbox to \wd0{\putwordAppendix{} #1\hss}} +% +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#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 + \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 + \escapechar=`\\ + % + % ' 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 + % + \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\*=\ptexstar + \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 + % 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 +}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will +% also clear it, so that its embedded environments do the narrowing again. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\envdef\cartouche{% + \ifhmode\par\fi % can't be in the midst of a paragraph. + \startsavinginserts + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt % we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % + % If this cartouche directly follows a sectioning command, we need the + % \parskip glue (backspaced over by default) or the cartouche can + % collide with the section heading. + \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi + % + \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 + \checkinserts +} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\newdimen\nonfillparindent +\def\nonfillstart{% + \aboveenvbreak + \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + % Turn off paragraph indentation but redefine \indent to emulate + % the normal \indent. + \nonfillparindent=\parindent + \parindent = 0pt + \let\indent\nonfillindent + % + \emergencystretch = 0pt % don't try to avoid overfull boxes + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \let\exdent=\nofillexdent +} + +\begingroup +\obeyspaces +% We want to swallow spaces (but not other tokens) after the fake +% @indent in our nonfill-environments, where spaces are normally +% active and set to @tie, resulting in them not being ignored after +% @indent. +\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% +\gdef\nonfillindentcheck{% +\ifx\temp % +\expandafter\nonfillindentgobble% +\else% +\leavevmode\nonfillindentbox% +\fi% +}% +\endgroup +\def\nonfillindentgobble#1{\nonfillindent} +\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} + +% If you want all examples etc. small: @set dispenvsize small. +% If you want even small examples the full size: @set dispenvsize nosmall. +% This affects the following displayed environments: +% @example, @display, @format, @lisp +% +\def\smallword{small} +\def\nosmallword{nosmall} +\let\SETdispenvsize\relax +\def\setnormaldispenv{% + \ifx\SETdispenvsize\smallword + % end paragraph for sake of leading, in case document has no blank + % line. This is redundant with what happens in \aboveenvbreak, but + % we need to do it before changing the fonts, and it's inconvenient + % to change the fonts afterward. + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} +\def\setsmalldispenv{% + \ifx\SETdispenvsize\nosmallword + \else + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} + +% We often define two environments, @foo and @smallfoo. +% Let's do it in one command. #1 is the env name, #2 the definition. +\def\makedispenvdef#1#2{% + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% + \expandafter\let\csname E#1\endcsname \afterenvbreak + \expandafter\let\csname Esmall#1\endcsname \afterenvbreak +} + +% Define two environment synonyms (#1 and #2) for an environment. +\def\maketwodispenvdef#1#2#3{% + \makedispenvdef{#1}{#3}% + \makedispenvdef{#2}{#3}% +} +% +% @lisp: indented, narrowed, typewriter font; +% @example: same as @lisp. +% +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. +% +\maketwodispenvdef{lisp}{example}{% + \nonfillstart + \tt\setupmarkupstyle{example}% + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} +% @display/@smalldisplay: same as @lisp except keep current font. +% +\makedispenvdef{display}{% + \nonfillstart + \gobble +} + +% @format/@smallformat: same as @display except don't narrow margins. +% +\makedispenvdef{format}{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} + +% @flushleft: same as @format, but doesn't obey \SETdispenvsize. +\envdef\flushleft{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} +\let\Eflushleft = \afterenvbreak + +% @flushright. +% +\envdef\flushright{% + \let\nonarrowing = t% + \nonfillstart + \advance\leftskip by 0pt plus 1fill\relax + \gobble +} +\let\Eflushright = \afterenvbreak + + +% @raggedright does more-or-less normal line breaking but no right +% justification. From plain.tex. Don't stretch around special +% characters in urls in this environment, since the stretch at the right +% should be enough. +\envdef\raggedright{% + \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax + \def\urefprestretchamount{0pt}% + \def\urefpoststretchamount{0pt}% +} +\let\Eraggedright\par + +\envdef\raggedleft{% + \parindent=0pt \leftskip0pt plus2em + \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt + \hbadness=10000 % Last line will usually be underfull, so turn off + % badness reporting. +} +\let\Eraggedleft\par + +\envdef\raggedcenter{% + \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em + \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt + \hbadness=10000 % Last line will usually be underfull, so turn off + % badness reporting. +} +\let\Eraggedcenter\par + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. We keep \parskip nonzero in general, since +% we're doing normal filling. So, when using \aboveenvbreak and +% \afterenvbreak, temporarily make \parskip 0. +% +\makedispenvdef{quotation}{\quotationstart} +% +\def\quotationstart{% + \indentedblockstart % same as \indentedblock, but increase right margin too. + \ifx\nonarrowing\relax + \advance\rightskip by \lispnarrowing + \fi + \parsearg\quotationlabel +} + +% We have retained a nonzero parskip for the environment, since we're +% doing normal filling. +% +\def\Equotation{% + \par + \ifx\quotationauthor\thisisundefined\else + % indent a bit. + \leftline{\kern 2\leftskip \sl ---\quotationauthor}% + \fi + {\parskip=0pt \afterenvbreak}% +} +\def\Esmallquotation{\Equotation} + +% If we're given an argument, typeset it in bold with a colon after. +\def\quotationlabel#1{% + \def\temp{#1}% + \ifx\temp\empty \else + {\bf #1: }% + \fi +} + +% @indentedblock is like @quotation, but indents only on the left and +% has no optional argument. +% +\makedispenvdef{indentedblock}{\indentedblockstart} +% +\def\indentedblockstart{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \exdentamount = \lispnarrowing + \else + \let\nonarrowing = \relax + \fi +} + +% Keep a nonzero parskip for the environment, since we're doing normal filling. +% +\def\Eindentedblock{% + \par + {\parskip=0pt \afterenvbreak}% +} +\def\Esmallindentedblock{\Eindentedblock} + + +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% 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 \starttabox and the \egroup would end verbatim mode. + \def\par{\leavevmode\egroup\box\verbbox\endgraf}% + \tabexpand + \setupmarkupstyle{verbatim}% + % Respect line breaks, + % print special symbols as themselves, and + % make each space count. + % Must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'#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}% + \input #1 + \afterenvbreak + }% +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is very 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 +% +% Define \deffn and \deffnx, without parameters. +% \deffnheader has to be defined explicitly. +% +\def\domakedefun#1#2#3{% + \envdef#1{% + \startdefun + \doingtypefnfalse % distinguish typed functions from all else + \parseargusing\activeparens{\printdefunline#3}% + }% + \def#2{\dodefunx#1}% + \def#3% +} + +\newif\ifdoingtypefn % doing typed function? +\newif\ifrettypeownline % typeset return type on its own line? + +% @deftypefnnewline on|off says whether the return type of typed functions +% are printed on their own line. This affects @deftypefn, @deftypefun, +% @deftypeop, and @deftypemethod. +% +\parseargdef\deftypefnnewline{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxideftypefnnl\endcsname + = \empty + \else\ifx\temp\offword + \expandafter\let\csname SETtxideftypefnnl\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @txideftypefnnl value `\temp', + must be on|off}% + \fi\fi +} + +% Untyped functions: + +% @deffn category name args +\makedefun{deffn}{\deffngeneral{}} + +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} + +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% +} + +% Typed functions: + +% @deftypefn category type name args +\makedefun{deftypefn}{\deftypefngeneral{}} + +% @deftypeop category class type name args +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} + +% \deftypeopon {category on}class type name args +\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deftypefngeneral {subind}category type name args +% +\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% + \dosubind{fn}{\code{#4}}{#1}% + \doingtypefntrue + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +% Typed variables: + +% @deftypevr category type var args +\makedefun{deftypevr}{\deftypecvgeneral{}} + +% @deftypecv category class type var args +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} + +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } + +% \deftypecvgeneral {subind}category type var args +% +\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% + \dosubind{vr}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +% Untyped variables: + +% @defvr category var args +\makedefun{defvr}#1 {\deftypevrheader{#1} {} } + +% @defcv category class var args +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} + +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } + +% Types: + +% @deftp category name args +\makedefun{deftp}#1 #2 #3\endheader{% + \doind{tp}{\code{#2}}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% +} + +% Remaining @defun-like shortcuts: +\makedefun{defun}{\deffnheader{\putwordDeffunc} } +\makedefun{defmac}{\deffnheader{\putwordDefmac} } +\makedefun{defspec}{\deffnheader{\putwordDefspec} } +\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } +\makedefun{defvar}{\defvrheader{\putwordDefvar} } +\makedefun{defopt}{\defvrheader{\putwordDefopt} } +\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} + +% \defname, which formats the name of the @def (not the args). +% #1 is the category, such as "Function". +% #2 is the return type, if any. +% #3 is the function name. +% +% We are followed by (but not passed) the arguments, if any. +% +\def\defname#1#2#3{% + \par + % Get the values of \leftskip and \rightskip as they were outside the @def... + \advance\leftskip by -\defbodyindent + % + % Determine if we are typesetting the return type of a typed function + % on a line by itself. + \rettypeownlinefalse + \ifdoingtypefn % doing a typed function specifically? + % then check user option for putting return type on its own line: + \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else + \rettypeownlinetrue + \fi + \fi + % + % How we'll format the category name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \def\temp{#1}% + \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} + % + % Figure out line sizes for the paragraph shape. We'll always have at + % least two. + \tempnum = 2 + % + % The first line needs space for \box0; but if \rightskip is nonzero, + % we need only space for the part of \box0 which exceeds it: + \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % + % If doing a return type on its own line, we'll have another line. + \ifrettypeownline + \advance\tempnum by 1 + \def\maybeshapeline{0in \hsize}% + \else + \def\maybeshapeline{}% + \fi + % + % The continuations: + \dimen2=\hsize \advance\dimen2 by -\defargsindent + % + % The final paragraph shape: + \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 + % + % Put the category name at the right margin. + \noindent + \hbox to 0pt{% + \hfil\box0 \kern-\hsize + % \hsize has to be shortened this way: + \kern\leftskip + % Intentionally do not respect \rightskip, since we need the space. + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=10000 \hbadness=10000 + \exdentamount=\defbodyindent + {% + % defun fonts. We use typewriter by default (used to be bold) because: + % . we're printing identifiers, they should be in tt in principle. + % . in languages with many accents, such as Czech or French, it's + % common to leave accents off identifiers. The result looks ok in + % tt, but exceedingly strange in rm. + % . we don't want -- and --- to be treated as ligatures. + % . this still does not fix the ?` and !` ligatures, but so far no + % one has made identifiers using them :). + \df \tt + \def\temp{#2}% text of the return type + \ifx\temp\empty\else + \tclose{\temp}% typeset the return type + \ifrettypeownline + % put return type on its own line; prohibit line break following: + \hfil\vadjust{\nobreak}\break + \else + \space % type on same line, so just followed by a space + \fi + \fi % no return type + #3% output function name + }% + {\rm\enskip}% hskip 0.5 em of \tenrm + % + \boldbrax + % arguments will be output next, if any. +} + +% Print arguments in slanted roman (not ttsl), inconsistently with using +% tt for the name. This is because literal text is sometimes needed in +% the argument list (groff manual), and ttsl and tt are not very +% distinguishable. Prevent hyphenation at `-' chars. +% +\def\defunargs#1{% + % use sl by default (not ttsl), + % tt for the names. + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. We used to recommend @var for that, so + % leave the code in, but it's strange for @var to lead to typewriter. + % Nowadays we recommend @code, since the difference between a ttsl hyphen + % and a tt hyphen is pretty tiny. @code also disables ?` !`. + \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% + #1% + \sl\hyphenchar\font=45 +} + +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=\active \catcode`\)=\active + \catcode`\[=\active \catcode`\]=\active + \catcode`\&=\active +} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +{ + \activeparens + \global\let(=\lparen \global\let)=\rparen + \global\let[=\lbrack \global\let]=\rbrack + \global\let& = \& + + \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} + \gdef\magicamp{\let&=\amprm} +} + +\newcount\parencount + +% If we encounter &foo, then turn on ()-hacking afterwards +\newif\ifampseen +\def\amprm#1 {\ampseentrue{\bf\ }} + +\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 + +\def\scanmacro#1{\begingroup + \newlinechar`\^^M + \let\xeatspaces\eatspaces + % + % Undo catcode changes of \startcontents and \doprintindex + % When called from @insertcopying or (short)caption, we need active + % backslash to get it printed correctly. Previously, we had + % \catcode`\\=\other instead. We'll see whether a problem appears + % with macro expansion. --kasal, 19aug04 + \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ + % + % ... and for \example: + \spaceisspace + % + % The \empty here causes a following catcode 5 newline to be eaten as + % part of reading whitespace after a control sequence. It does not + % eat a catcode 13 newline. There's no good way to handle the two + % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX + % would then have different behavior). See the Macro Details node in + % the manual for the workaround we recommend for macros and + % line-oriented commands. + % + \scantokens{#1\empty}% +\endgroup} + +\def\scanexp#1{% + \edef\temp{\noexpand\scanmacro{#1}}% + \temp +} + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? + +% List of all defined macros in the form +% \definedummyword\macro1\definedummyword\macro2... +% Currently is also contains all @aliases; the list can be split +% if there is a need. +\def\macrolist{} + +% Add the macro to \macrolist +\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} +\def\addtomacrolistxxx#1{% + \toks0 = \expandafter{\macrolist\definedummyword#1}% + \xdef\macrolist{\the\toks0}% +} + +% Utility routines. +% This does \let #1 = #2, with \csnames; that is, +% \let \csname#1\endcsname = \csname#2\endcsname +% (except of course we have to play expansion games). +% +\def\cslet#1#2{% + \expandafter\let + \csname#1\expandafter\endcsname + \csname#2\endcsname +} + +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} + +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=\other \catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \ +% to recognize macro arguments; this is the job of \mbodybackslash. +% +% Non-ASCII encodings make 8-bit characters active, so un-activate +% them to avoid their expansion. Must do this non-globally, to +% confine the change to the current group. +% +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. +% +\def\scanctxt{% used as subroutine + \catcode`\"=\other + \catcode`\+=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\@=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\~=\other + \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi +} + +\def\scanargctxt{% used for copying and captions, not macros. + \scanctxt + \catcode`\\=\other + \catcode`\^^M=\other +} + +\def\macrobodyctxt{% used for @macro definitions + \scanctxt + \catcode`\{=\other + \catcode`\}=\other + \catcode`\^^M=\other + \usembodybackslash +} + +\def\macroargctxt{% used when scanning invocations + \scanctxt + \catcode`\\=0 +} +% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" +% for the single characters \ { }. Thus, we end up with the "commands" +% that would be written @\ @{ @} in a Texinfo document. +% +% We already have @{ and @}. For @\, we define it here, and only for +% this purpose, to produce a typewriter backslash (so, the @\ that we +% define for @math can't be used with @macro calls): +% +\def\\{\normalbackslash}% +% +% We would like to do this for \, too, since that is what makeinfo does. +% But it is not possible, because Texinfo already has a command @, for a +% cedilla accent. Documents must use @comma{} instead. +% +% \anythingelse will almost certainly be an error of some kind. + + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. +% +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\margbackslash#1{\char`\#1 } + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0\relax + \else + \expandafter\parsemargdef \argl;% + \if\paramno>256\relax + \ifx\eTeXversion\thisisundefined + \errhelp = \EMsimple + \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} + \fi + \fi + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + \addtomacrolist{\the\macname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\parseargdef\unmacro{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\definedummyword\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx #1\relax + % remove this + \else + \noexpand\definedummyword \noexpand#1% + \fi +} + +% This makes use of the obscure 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. +\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}} + +% For macro processing make @ a letter so that we can make Texinfo private macro names. +\edef\texiatcatcode{\the\catcode`\@} +\catcode `@=11\relax + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. 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). +% +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. +% +% 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 underwhich the body was input). +% +% If you compile with TeX (not eTeX), and you have macros with 10 or more +% arguments, you need that no macro has more than 256 arguments, otherwise an +% error is produced. +\def\parsemargdef#1;{% + \paramno=0\def\paramlist{}% + \let\hash\relax + \let\xeatspaces\relax + \parsemargdefxxx#1,;,% + % 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. + \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} + +\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} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) +% + +\catcode `\@\texiatcatcode +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\catcode `\@=11\relax + +\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}% + } + +\def\macargexpandinbody@{% + %% Define the named-macro outside of this group and then close this group. + \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 +} + +% Save the token stack pointer into macro #1 +\def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} +% Restore the token stack pointer from number in macro #1 +\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} +% newtoks that can be used non \outer . +\def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} + +% Tailing 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}% +} + +% This defines a Texinfo @macro. There are eight cases: recursive and +% nonrecursive macros of zero, one, up to nine, and many arguments. +% Much magic with \expandafter here. +% \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 + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else + \ifnum\paramno<10\relax % at most 9 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \else % 10 or more + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\getargvals@{\the\macname}{\argl}% + }% + \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp + \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble + \fi + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % at most 9 + \ifnum\paramno<10\relax + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % 10 or more: + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\getargvals@{\the\macname}{\argl}% + }% + \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp + \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse + \fi + \fi + \fi} + +\catcode `\@\texiatcatcode\relax + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg). +% +\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \macnamexxx} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Make them active and then expand them all to nothing. +% +\def\alias{\parseargusing\obeyspaces\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{% + {% + \expandafter\let\obeyedspace=\empty + \addtomacrolist{#1}% + \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% + }% + \next +} + + +\message{cross references,} + +\newwrite\auxfile +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is relatively simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{% + \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% @node's only job in TeX is to define \lastnode, which is used in +% cross-references. The @node line might or might not have commas, and +% might or might not have spaces before the first comma, like: +% @node foo , bar , ... +% We don't want such trailing spaces in the node name. +% +\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} +% +% also remove a trailing comma, in case of something like this: +% @node Help-Cross, , , Cross-refs +\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} +\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} + +\let\nwnode=\node +\let\lastnode=\empty + +% Write a cross-reference definition for the current node. #1 is the +% type (Ynumbered, Yappendix, Ynothing). +% +\def\donoderef#1{% + \ifx\lastnode\empty\else + \setref{\lastnode}{#1}% + \global\let\lastnode=\empty + \fi +} + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +% +\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), which consists of three parts: +% 1) NAME-title - the current sectioning name taken from \lastsection, +% or the anchor name. +% 2) NAME-snt - section number and type, passed as the SNT arg, or +% empty for anchors. +% 3) NAME-pg - the page number. +% +% This is called from \donoderef, \anchor, and \dofloat. In the case of +% floats, there is an additional part, which is not written here: +% 4) NAME-lof - the text as it should appear in a @listoffloats. +% +\def\setref#1#2{% + \pdfmkdest{#1}% + \iflinks + {% + \atdummies % preserve commands, but don't expand them + \edef\writexrdef##1##2{% + \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef + ##1}{##2}}% these are parameters of \writexrdef + }% + \toks0 = \expandafter{\lastsection}% + \immediate \writexrdef{title}{\the\toks0 }% + \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. + \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout + }% + \fi +} + +% @xrefautosectiontitle on|off says whether @section(ing) names are used +% automatically in xrefs, if the third arg is not explicitly specified. +% This was provided as a "secret" @set xref-automatic-section-title +% variable, now it's official. +% +\parseargdef\xrefautomaticsectiontitle{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETxref-automatic-section-title\endcsname + = \empty + \else\ifx\temp\offword + \expandafter\let\csname SETxref-automatic-section-title\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', + must be on|off}% + \fi\fi +} + +% +% @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#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +% +\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 + {\indexnofonts + \turnoffactive + \makevalueexpandable + % This expands tokens, so do it after making catcode changes, so _ + % etc. don't get their TeX definitions. This ignores all spaces in + % #4, including (wrongly) those in the middle of the filename. + \getfilename{#4}% + % + % This (wrongly) does not take account of leading or trailing + % spaces in #1, which should be ignored. + \edef\pdfxrefdest{#1}% + \ifx\pdfxrefdest\empty + \def\pdfxrefdest{Top}% no empty targets + \else + \txiescapepdf\pdfxrefdest % escape PDF special chars + \fi + % + \leavevmode + \startlink attr{/Border [0 0 0]}% + \ifnum\filenamelength>0 + goto file{\the\filename.pdf} name{\pdfxrefdest}% + \else + goto name{\pdfmkpgn{\pdfxrefdest}}% + \fi + }% + \setcolor{\linkcolor}% + \fi + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". We distinguish them by the + % LABEL-title being set to a magic string. + {% + % Have to otherify everything special to allow the \csname to + % include an _ in the xref name, etc. + \indexnofonts + \turnoffactive + \expandafter\global\expandafter\let\expandafter\Xthisreftitle + \csname XR#1-title\endcsname + }% + \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}{}% + \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 +} + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. +% +\def\refx#1#2{% + {% + \indexnofonts + \otherbackslash + \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. Usually it's +% just a \def (we prepend XR to the control sequence name to avoid +% collisions). But if this is a float type, we have more work to do. +% +\def\xrdef#1#2{% + {% The node name might contain 8-bit characters, which in our current + % implementation are changed to commands like @'e. Don't let these + % mess up the control sequence name. + \indexnofonts + \turnoffactive + \xdef\safexrefname{#1}% + }% + % + \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref + % + % Was that xref control sequence that we just defined for a float? + \expandafter\iffloat\csname XR\safexrefname\endcsname + % it was a float, and we have the (safe) float type in \iffloattype. + \expandafter\let\expandafter\floatlist + \csname floatlist\iffloattype\endcsname + % + % Is this the first time we've seen this float type? + \expandafter\ifx\floatlist\relax + \toks0 = {\do}% yes, so just \do + \else + % had it before, so preserve previous elements in list. + \toks0 = \expandafter{\floatlist\do}% + \fi + % + % Remember this xref in the control sequence \floatlistFLOATTYPE, + % for later use in \listoffloats. + \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 + {\safexrefname}}% + \fi +} + +% Read the last existing aux file, if any. No error if none exists. +% +\def\tryauxfile{% + \openin 1 \jobname.aux + \ifeof 1 \else + \readdatafile{aux}% + \global\havexrefstrue + \fi + \closein 1 +} + +\def\setupdatafile{% + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\^=\other + % + % Special characters. Should be turned off anyway, but... + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + \catcode`\%=\other + \catcode`+=\other % avoid \+ for paranoia even though we've turned it off + % + % This is to support \ in node names and titles, since the \ + % characters end up in a \csname. It's easier than + % leaving it active and making its active definition an actual \ + % character. What I don't understand is why it works in the *value* + % of the xrdef. Seems like it should be a catcode12 \, and that + % should not typeset properly. But it works, so I'm moving on for + % now. --karl, 15jan04. + \catcode`\\=\other + % + % Make the characters 128-255 be printing characters. + {% + \count1=128 + \def\loop{% + \catcode\count1=\other + \advance\count1 by 1 + \ifnum \count1<256 \loop \fi + }% + }% + % + % @ 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{% + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + % + \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=\errfootnote + % + % 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=\pagewidth + \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\errfootnote{% + \errhelp=\EMsimple + \errmessage{Nested footnotes not supported in texinfo.tex, + even though they work in makeinfo; sorry} +} + +% In case a @footnote appears in a vbox, save the footnote text and create +% the real \insert just after the vbox finished. Otherwise, the insertion +% would be lost. +% Similarly, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. +% +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. +% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp = +} +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} + +\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +\closein 1 +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\thisisundefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % 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 + \dopdfimage{#1}{#2}{#3}% + \else + % \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}% + \fi + % + \ifimagevmode + \medskip % space after a standalone image + \fi + \ifx\centersub\centerV \egroup \fi +\endgroup} + + +% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, +% etc. We don't actually implement floating yet, we always include the +% float "here". But it seemed the best name for the future. +% +\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} + +% There may be a space before second and/or third parameter; delete it. +\def\eatcommaspace#1, {#1,} + +% #1 is the optional FLOATTYPE, the text label for this float, typically +% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, +% this float will not be numbered and cannot be referred to. +% +% #2 is the optional xref label. Also must be present for the float to +% be referable. +% +% #3 is the optional positioning argument; for now, it is ignored. It +% will somehow specify the positions allowed to float to (here, top, bottom). +% +% We keep a separate counter for each FLOATTYPE, which we reset at each +% chapter-level command. +\let\resetallfloatnos=\empty +% +\def\dofloat#1,#2,#3,#4\finish{% + \let\thiscaption=\empty + \let\thisshortcaption=\empty + % + % don't lose footnotes inside @float. + % + % BEWARE: when the floats start float, we have to issue warning whenever an + % insert appears inside a float which could possibly float. --kasal, 26may04 + % + \startsavinginserts + % + % We can't be used inside a paragraph. + \par + % + \vtop\bgroup + \def\floattype{#1}% + \def\floatlabel{#2}% + \def\floatloc{#3}% we do nothing with this yet. + % + \ifx\floattype\empty + \let\safefloattype=\empty + \else + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + \fi + % + % If label is given but no type, we handle that as the empty type. + \ifx\floatlabel\empty \else + % We want each FLOATTYPE to be numbered separately (Figure 1, + % Table 1, Figure 2, ...). (And if no label, no number.) + % + \expandafter\getfloatno\csname\safefloattype floatno\endcsname + \global\advance\floatno by 1 + % + {% + % This magic value for \lastsection is output by \setref as the + % XREFLABEL-title value. \xrefX uses it to distinguish float + % labels (which have a completely different output format) from + % node and anchor labels. And \xrdef uses it to construct the + % lists of floats. + % + \edef\lastsection{\floatmagic=\safefloattype}% + \setref{\floatlabel}{Yfloat}% + }% + \fi + % + % start with \parskip glue, I guess. + \vskip\parskip + % + % Don't suppress indentation if a float happens to start a section. + \restorefirstparagraphindent +} + +% we have these possibilities: +% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap +% @float Foo,lbl & no caption: Foo 1.1 +% @float Foo & @caption{Cap}: Foo: Cap +% @float Foo & no caption: Foo +% @float ,lbl & Caption{Cap}: 1.1: Cap +% @float ,lbl & no caption: 1.1 +% @float & @caption{Cap}: Cap +% @float & no caption: +% +\def\Efloat{% + \let\floatident = \empty + % + % In all cases, if we have a float type, it comes first. + \ifx\floattype\empty \else \def\floatident{\floattype}\fi + % + % If we have an xref label, the number comes next. + \ifx\floatlabel\empty \else + \ifx\floattype\empty \else % if also had float type, need tie first. + \appendtomacro\floatident{\tie}% + \fi + % the number. + \appendtomacro\floatident{\chaplevelprefix\the\floatno}% + \fi + % + % Start the printed caption with what we've constructed in + % \floatident, but keep it separate; we need \floatident again. + \let\captionline = \floatident + % + \ifx\thiscaption\empty \else + \ifx\floatident\empty \else + \appendtomacro\captionline{: }% had ident, so need a colon between + \fi + % + % caption text. + \appendtomacro\captionline{\scanexp\thiscaption}% + \fi + % + % If we have anything to print, print it, with space before. + % Eventually this needs to become an \insert. + \ifx\captionline\empty \else + \vskip.5\parskip + \captionline + % + % Space below caption. + \vskip\parskip + \fi + % + % If have an xref label, write the list of floats info. Do this + % after the caption, to avoid chance of it being a breakpoint. + \ifx\floatlabel\empty \else + % Write the text that goes in the lof to the aux file as + % \floatlabel-lof. Besides \floatident, we include the short + % caption if specified, else the full caption if specified, else nothing. + {% + \atdummies + % + % since we read the caption text in the macro world, where ^^M + % is turned into a normal character, we have to scan it back, so + % we don't write the literal three characters "^^M" into the aux file. + \scanexp{% + \xdef\noexpand\gtemp{% + \ifx\thisshortcaption\empty + \thiscaption + \else + \thisshortcaption + \fi + }% + }% + \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident + \ifx\gtemp\empty \else : \gtemp \fi}}% + }% + \fi + \egroup % end of \vtop + % + % place the captured inserts + % + % BEWARE: when the floats start floating, we have to issue warning + % whenever an insert appears inside a float which could possibly + % float. --kasal, 26may04 + % + \checkinserts +} + +% Append the tokens #2 to the definition of macro #1, not expanding either. +% +\def\appendtomacro#1#2{% + \expandafter\def\expandafter#1\expandafter{#1#2}% +} + +% @caption, @shortcaption +% +\def\caption{\docaption\thiscaption} +\def\shortcaption{\docaption\thisshortcaption} +\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} +\def\defcaption#1#2{\egroup \def#1{#2}} + +% The parameter is the control sequence identifying the counter we are +% going to use. Create it if it doesn't exist and assign it to \floatno. +\def\getfloatno#1{% + \ifx#1\relax + % Haven't seen this figure type before. + \csname newcount\endcsname #1% + % + % Remember to reset this floatno at the next chap. + \expandafter\gdef\expandafter\resetallfloatnos + \expandafter{\resetallfloatnos #1=0 }% + \fi + \let\floatno#1% +} + +% \setref calls this to get the XREFLABEL-snt value. We want an @xref +% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we +% first read the @float command. +% +\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% + +% Magic string used for the XREFLABEL-title value, so \xrefX can +% distinguish floats from other xref types. +\def\floatmagic{!!float!!} + +% #1 is the control sequence we are passed; we expand into a conditional +% which is true if #1 represents a float ref. That is, the magic +% \lastsection value which we \setref above. +% +\def\iffloat#1{\expandafter\doiffloat#1==\finish} +% +% #1 is (maybe) the \floatmagic string. If so, #2 will be the +% (safe) float type for this float. We set \iffloattype to #2. +% +\def\doiffloat#1=#2=#3\finish{% + \def\temp{#1}% + \def\iffloattype{#2}% + \ifx\temp\floatmagic +} + +% @listoffloats FLOATTYPE - print a list of floats like a table of contents. +% +\parseargdef\listoffloats{% + \def\floattype{#1}% floattype + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + % + % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. + \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax + \ifhavexrefs + % if the user said @listoffloats foo but never @float foo. + \message{\linenumber No `\safefloattype' floats to list.}% + \fi + \else + \begingroup + \leftskip=\tocindent % indent these entries like a toc + \let\do=\listoffloatsdo + \csname floatlist\safefloattype\endcsname + \endgroup + \fi +} + +% This is called on each entry in a list of floats. We're passed the +% xref label, in the form LABEL-title, which is how we save it in the +% aux file. We strip off the -title and look up \XRLABEL-lof, which +% has the text we're supposed to typeset here. +% +% Figures without xref labels will not be included in the list (since +% they won't appear in the aux file). +% +\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} +\def\listoffloatsdoentry#1-title\finish{{% + % Can't fully expand XR#1-lof because it can contain anything. Just + % pass the control sequence. On the other hand, XR#1-pg is just the + % page number, and we want to fully expand that so we can get a link + % in pdf output. + \toksA = \expandafter{\csname XR#1-lof\endcsname}% + % + % use the same \entry macro we use to generate the TOC and index. + \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% + \writeentry +}} + + +\message{localization,} + +% For single-language documents, @documentlanguage is usually given very +% early, just after @documentencoding. Single argument is the language +% (de) or locale (de_DE) abbreviation. +% +{ + \catcode`\_ = \active + \globaldefs=1 +\parseargdef\documentlanguage{% + \tex % read txi-??.tex file in plain TeX. + % Read the file by the name they passed if it exists. + \let_ = \normalunderscore % normal _ character for filename test + \openin 1 txi-#1.tex + \ifeof 1 + \documentlanguagetrywithoutunderscore #1_\finish + \else + \globaldefs = 1 % everything in the txi-LL files needs to persist + \input txi-#1.tex + \fi + \closein 1 + \endgroup % end raw TeX +} +% +% If they passed de_DE, and txi-de_DE.tex doesn't exist, +% try txi-de.tex. +% +\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% + \openin 1 txi-#1.tex + \ifeof 1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \else + \globaldefs = 1 % everything in the txi-LL files needs to persist + \input txi-#1.tex + \fi + \closein 1 +} +}% end of special _ catcode +% +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? Putting it in the current +directory should work if nowhere else does.} + +% This macro is called from txi-??.tex files; the first argument is the +% \language name to set (without the "\lang@" prefix), the second and +% third args are \{left,right}hyphenmin. +% +% The language names to pass are determined when the format is built. +% See the etex.log file created at that time, e.g., +% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. +% +% With TeX Live 2008, etex now includes hyphenation patterns for all +% available languages. This means we can support hyphenation in +% Texinfo, at least to some extent. (This still doesn't solve the +% accented characters problem.) +% +\catcode`@=11 +\def\txisetlanguage#1#2#3{% + % do not set the language if the name is undefined in the current TeX. + \expandafter\ifx\csname lang@#1\endcsname \relax + \message{no patterns for #1}% + \else + \global\language = \csname lang@#1\endcsname + \fi + % but there is no harm in adjusting the hyphenmin values regardless. + \global\lefthyphenmin = #2\relax + \global\righthyphenmin = #3\relax +} + +% 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. +% +\parseargdef\documentencoding{% + % 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 + \setnonasciicharscatcode\active + \lattwochardefs + % + \else \ifx \declaredencoding \latone + \setnonasciicharscatcode\active + \latonechardefs + % + \else \ifx \declaredencoding \latnine + \setnonasciicharscatcode\active + \latninechardefs + % + \else \ifx \declaredencoding \utfeight + \setnonasciicharscatcode\active + \utfeightchardefs + % + \else + \message{Unknown document encoding #1, ignoring.}% + % + \fi % utfeight + \fi % latnine + \fi % latone + \fi % lattwo + \fi % ascii +} + +% A message to be logged when using a character that isn't available +% the default font encoding (OT1). +% +\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #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 +% +% Latin1 (ISO-8859-1) character definitions. +\def\latonechardefs{% + \gdef^^a0{\tie} + \gdef^^a1{\exclamdown} + \gdef^^a2{\missingcharmsg{CENT SIGN}} + \gdef^^a3{{\pounds}} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\missingcharmsg{YEN SIGN}} + \gdef^^a6{\missingcharmsg{BROKEN BAR}} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\copyright} + \gdef^^aa{\ordf} + \gdef^^ab{\guillemetleft} + \gdef^^ac{$\lnot$} + \gdef^^ad{\-} + \gdef^^ae{\registeredsymbol} + \gdef^^af{\={}} + % + \gdef^^b0{\textdegree} + \gdef^^b1{$\pm$} + \gdef^^b2{$^2$} + \gdef^^b3{$^3$} + \gdef^^b4{\'{}} + \gdef^^b5{$\mu$} + \gdef^^b6{\P} + % + \gdef^^b7{$^.$} + \gdef^^b8{\cedilla\ } + \gdef^^b9{$^1$} + \gdef^^ba{\ordm} + % + \gdef^^bb{\guillemetright} + \gdef^^bc{$1\over4$} + \gdef^^bd{$1\over2$} + \gdef^^be{$3\over4$} + \gdef^^bf{\questiondown} + % + \gdef^^c0{\`A} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\~A} + \gdef^^c4{\"A} + \gdef^^c5{\ringaccent A} + \gdef^^c6{\AE} + \gdef^^c7{\cedilla C} + \gdef^^c8{\`E} + \gdef^^c9{\'E} + \gdef^^ca{\^E} + \gdef^^cb{\"E} + \gdef^^cc{\`I} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\"I} + % + \gdef^^d0{\DH} + \gdef^^d1{\~N} + \gdef^^d2{\`O} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\~O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\O} + \gdef^^d9{\`U} + \gdef^^da{\'U} + \gdef^^db{\^U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\TH} + \gdef^^df{\ss} + % + \gdef^^e0{\`a} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\~a} + \gdef^^e4{\"a} + \gdef^^e5{\ringaccent a} + \gdef^^e6{\ae} + \gdef^^e7{\cedilla c} + \gdef^^e8{\`e} + \gdef^^e9{\'e} + \gdef^^ea{\^e} + \gdef^^eb{\"e} + \gdef^^ec{\`{\dotless i}} + \gdef^^ed{\'{\dotless i}} + \gdef^^ee{\^{\dotless i}} + \gdef^^ef{\"{\dotless i}} + % + \gdef^^f0{\dh} + \gdef^^f1{\~n} + \gdef^^f2{\`o} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\~o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\o} + \gdef^^f9{\`u} + \gdef^^fa{\'u} + \gdef^^fb{\^u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\th} + \gdef^^ff{\"y} +} + +% Latin9 (ISO-8859-15) encoding character definitions. +\def\latninechardefs{% + % Encoding is almost identical to Latin1. + \latonechardefs + % + \gdef^^a4{\euro} + \gdef^^a6{\v S} + \gdef^^a8{\v s} + \gdef^^b4{\v Z} + \gdef^^b8{\v z} + \gdef^^bc{\OE} + \gdef^^bd{\oe} + \gdef^^be{\"Y} +} + +% Latin2 (ISO-8859-2) character definitions. +\def\lattwochardefs{% + \gdef^^a0{\tie} + \gdef^^a1{\ogonek{A}} + \gdef^^a2{\u{}} + \gdef^^a3{\L} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\v L} + \gdef^^a6{\'S} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\v S} + \gdef^^aa{\cedilla S} + \gdef^^ab{\v T} + \gdef^^ac{\'Z} + \gdef^^ad{\-} + \gdef^^ae{\v Z} + \gdef^^af{\dotaccent Z} + % + \gdef^^b0{\textdegree} + \gdef^^b1{\ogonek{a}} + \gdef^^b2{\ogonek{ }} + \gdef^^b3{\l} + \gdef^^b4{\'{}} + \gdef^^b5{\v l} + \gdef^^b6{\'s} + \gdef^^b7{\v{}} + \gdef^^b8{\cedilla\ } + \gdef^^b9{\v s} + \gdef^^ba{\cedilla s} + \gdef^^bb{\v t} + \gdef^^bc{\'z} + \gdef^^bd{\H{}} + \gdef^^be{\v z} + \gdef^^bf{\dotaccent z} + % + \gdef^^c0{\'R} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\u A} + \gdef^^c4{\"A} + \gdef^^c5{\'L} + \gdef^^c6{\'C} + \gdef^^c7{\cedilla C} + \gdef^^c8{\v C} + \gdef^^c9{\'E} + \gdef^^ca{\ogonek{E}} + \gdef^^cb{\"E} + \gdef^^cc{\v E} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\v D} + % + \gdef^^d0{\DH} + \gdef^^d1{\'N} + \gdef^^d2{\v N} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\H O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\v R} + \gdef^^d9{\ringaccent U} + \gdef^^da{\'U} + \gdef^^db{\H U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\cedilla T} + \gdef^^df{\ss} + % + \gdef^^e0{\'r} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\u a} + \gdef^^e4{\"a} + \gdef^^e5{\'l} + \gdef^^e6{\'c} + \gdef^^e7{\cedilla c} + \gdef^^e8{\v c} + \gdef^^e9{\'e} + \gdef^^ea{\ogonek{e}} + \gdef^^eb{\"e} + \gdef^^ec{\v e} + \gdef^^ed{\'{\dotless{i}}} + \gdef^^ee{\^{\dotless{i}}} + \gdef^^ef{\v d} + % + \gdef^^f0{\dh} + \gdef^^f1{\'n} + \gdef^^f2{\v n} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\H o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\v r} + \gdef^^f9{\ringaccent u} + \gdef^^fa{\'u} + \gdef^^fb{\H u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\cedilla t} + \gdef^^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 +} + +\begingroup + \catcode`\~13 + \catcode`\"12 + + \def\UTFviiiLoop{% + \global\catcode\countUTFx\active + \uccode`\~\countUTFx + \uppercase\expandafter{\UTFviiiTmp}% + \advance\countUTFx by 1 + \ifnum\countUTFx < \countUTFy + \expandafter\UTFviiiLoop + \fi} + + \countUTFx = "C2 + \countUTFy = "E0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiTwoOctets\string~}} + \UTFviiiLoop + + \countUTFx = "E0 + \countUTFy = "F0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiThreeOctets\string~}} + \UTFviiiLoop + + \countUTFx = "F0 + \countUTFy = "F4 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiFourOctets\string~}} + \UTFviiiLoop +\endgroup + +\begingroup + \catcode`\"=12 + \catcode`\<=12 + \catcode`\.=12 + \catcode`\,=12 + \catcode`\;=12 + \catcode`\!=12 + \catcode`\~=13 + + \gdef\DeclareUnicodeCharacter#1#2{% + \countUTFz = "#1\relax + %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% + \begingroup + \parseXMLCharref + \def\UTFviiiTwoOctets##1##2{% + \csname u8:##1\string ##2\endcsname}% + \def\UTFviiiThreeOctets##1##2##3{% + \csname u8:##1\string ##2\string ##3\endcsname}% + \def\UTFviiiFourOctets##1##2##3##4{% + \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \gdef\UTFviiiTmp{#2}% + \endgroup} + + \gdef\parseXMLCharref{% + \ifnum\countUTFz < "A0\relax + \errhelp = \EMsimple + \errmessage{Cannot define Unicode char value < 00A0}% + \else\ifnum\countUTFz < "800\relax + \parseUTFviiiA,% + \parseUTFviiiB C\UTFviiiTwoOctets.,% + \else\ifnum\countUTFz < "10000\relax + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% + \else + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiA!% + \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% + \fi\fi\fi + } + + \gdef\parseUTFviiiA#1{% + \countUTFx = \countUTFz + \divide\countUTFz by 64 + \countUTFy = \countUTFz + \multiply\countUTFz by 64 + \advance\countUTFx by -\countUTFz + \advance\countUTFx by 128 + \uccode `#1\countUTFx + \countUTFz = \countUTFy} + + \gdef\parseUTFviiiB#1#2#3#4{% + \advance\countUTFz by "#10\relax + \uccode `#3\countUTFz + \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} +\endgroup + +\def\utfeightchardefs{% + \DeclareUnicodeCharacter{00A0}{\tie} + \DeclareUnicodeCharacter{00A1}{\exclamdown} + \DeclareUnicodeCharacter{00A3}{\pounds} + \DeclareUnicodeCharacter{00A8}{\"{ }} + \DeclareUnicodeCharacter{00A9}{\copyright} + \DeclareUnicodeCharacter{00AA}{\ordf} + \DeclareUnicodeCharacter{00AB}{\guillemetleft} + \DeclareUnicodeCharacter{00AD}{\-} + \DeclareUnicodeCharacter{00AE}{\registeredsymbol} + \DeclareUnicodeCharacter{00AF}{\={ }} + + \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} + \DeclareUnicodeCharacter{00B4}{\'{ }} + \DeclareUnicodeCharacter{00B8}{\cedilla{ }} + \DeclareUnicodeCharacter{00BA}{\ordm} + \DeclareUnicodeCharacter{00BB}{\guillemetright} + \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{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{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{0118}{\ogonek{E}} + \DeclareUnicodeCharacter{0119}{\ogonek{e}} + \DeclareUnicodeCharacter{010A}{\dotaccent{C}} + \DeclareUnicodeCharacter{010B}{\dotaccent{c}} + \DeclareUnicodeCharacter{010C}{\v{C}} + \DeclareUnicodeCharacter{010D}{\v{c}} + \DeclareUnicodeCharacter{010E}{\v{D}} + + \DeclareUnicodeCharacter{0112}{\=E} + \DeclareUnicodeCharacter{0113}{\=e} + \DeclareUnicodeCharacter{0114}{\u{E}} + \DeclareUnicodeCharacter{0115}{\u{e}} + \DeclareUnicodeCharacter{0116}{\dotaccent{E}} + \DeclareUnicodeCharacter{0117}{\dotaccent{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{0124}{\^H} + \DeclareUnicodeCharacter{0125}{\^h} + \DeclareUnicodeCharacter{0128}{\~I} + \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} + \DeclareUnicodeCharacter{012A}{\=I} + \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} + \DeclareUnicodeCharacter{012C}{\u{I}} + \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} + + \DeclareUnicodeCharacter{0130}{\dotaccent{I}} + \DeclareUnicodeCharacter{0131}{\dotless{i}} + \DeclareUnicodeCharacter{0132}{IJ} + \DeclareUnicodeCharacter{0133}{ij} + \DeclareUnicodeCharacter{0134}{\^J} + \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} + \DeclareUnicodeCharacter{0139}{\'L} + \DeclareUnicodeCharacter{013A}{\'l} + + \DeclareUnicodeCharacter{0141}{\L} + \DeclareUnicodeCharacter{0142}{\l} + \DeclareUnicodeCharacter{0143}{\'N} + \DeclareUnicodeCharacter{0144}{\'n} + \DeclareUnicodeCharacter{0147}{\v{N}} + \DeclareUnicodeCharacter{0148}{\v{n}} + \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{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{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{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{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{ }} + + \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} + + \DeclareUnicodeCharacter{2013}{--} + \DeclareUnicodeCharacter{2014}{---} + \DeclareUnicodeCharacter{2018}{\quoteleft} + \DeclareUnicodeCharacter{2019}{\quoteright} + \DeclareUnicodeCharacter{201A}{\quotesinglbase} + \DeclareUnicodeCharacter{201C}{\quotedblleft} + \DeclareUnicodeCharacter{201D}{\quotedblright} + \DeclareUnicodeCharacter{201E}{\quotedblbase} + \DeclareUnicodeCharacter{2022}{\bullet} + \DeclareUnicodeCharacter{2026}{\dots} + \DeclareUnicodeCharacter{2039}{\guilsinglleft} + \DeclareUnicodeCharacter{203A}{\guilsinglright} + \DeclareUnicodeCharacter{20AC}{\euro} + + \DeclareUnicodeCharacter{2192}{\expansion} + \DeclareUnicodeCharacter{21D2}{\result} + + \DeclareUnicodeCharacter{2212}{\minus} + \DeclareUnicodeCharacter{2217}{\point} + \DeclareUnicodeCharacter{2261}{\equiv} +}% end of \utfeightchardefs + + +% US-ASCII character definitions. +\def\asciichardefs{% nothing need be done + \relax +} + +% Make non-ASCII characters printable again for compatibility with +% existing Texinfo documents that may use them, even without declaring a +% document encoding. +% +\setnonasciicharscatcode \other + + +\message{formatting,} + +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be very finicky about underfull hboxes, either. +\hbadness = 6666 + +% Following George Bush, get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; +% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; +% 7) physical page height; 8) physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset = #3\relax + \topskip = #6\relax + \splittopskip = \topskip + % + \vsize = #1\relax + \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight = \vsize + % + \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in + \pagewidth = \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 + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{607.2pt}{6in}% that's 46 lines + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.25 trim size. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {-.2in}{0in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .5cm +}} + +% Use @smallerbook to reset parameters for 6x9 trim size. +% (Just testing, parameters still in flux.) +\def\smallerbook{{\globaldefs = 1 + \parskip = 1.5pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.4in}{4.8in}% + {-.2in}{-.4in}% + {0pt}{14pt}% + {9in}{6in}% + % + \lispnarrowing = 0.25in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .4cm +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset = -6mm + % \global\bindingoffset = 10mm + % @end tex + \internalpagesizes{673.2pt}{160mm}% that's 51 lines + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs = 1 + \parskip = 2pt plus 1pt minus 0.1pt + \textleading = 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs = 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs = 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs = 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs = 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi + \globaldefs = 1 + % + \parskip = 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 = #1\relax + \advance\dimen0 by \voffset + % + \dimen2 = \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} + +\def^^L{\par} % remove \outer, so ^L can appear in an @comment + +% DEL is a comment character, in case @c does not suffice. +\catcode`\^^? = 14 + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other \def\normaldoublequote{"} +\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix +\catcode`\+=\other \def\normalplus{+} +\catcode`\<=\other \def\normalless{<} +\catcode`\>=\other \def\normalgreater{>} +\catcode`\^=\other \def\normalcaret{^} +\catcode`\_=\other \def\normalunderscore{_} +\catcode`\|=\other \def\normalverticalbar{|} +\catcode`\~=\other \def\normaltilde{~} + +% This macro is used to make a character print one way in \tt +% (where it can probably be output as-is), and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% 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\hat=`\^ +\catcode`\^=\active \def\activehat{{\tt \hat}} \let^ = \activehat + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +\let\realunder=_ +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } + +\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 + +% 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. +} + +% 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 \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +% Used sometimes to turn off (effectively) the active characters even after +% parsing them. +\def\turnoffactive{% + \normalturnoffactive + \otherbackslash +} + +\catcode`\@=0 + +% \backslashcurfont outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\backslashcurfont=`\\ +\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work + +% \realbackslash is an actual character `\' with catcode other, and +% \doublebackslash is two of them (for the pdf outlines). +{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} + +% In texinfo, backslash is an active character; it prints the backslash +% in fixed width font. +\catcode`\\=\active % @ for escape char from now on. + +% 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). It seems better for @backslashchar{} to always +% print a typewriter backslash, 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@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} +@let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. + +% On startup, @fixbackslash assigns: +% @let \ = @normalbackslash +% \rawbackslash defines an active \ to do \backslashcurfont. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. We switch back and forth between these. +@gdef@rawbackslash{@let\=@backslashcurfont} +@gdef@otherbackslash{@let\=@realbackslash} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. Also revert - to its normal character, in +% case the active - from code has slipped in. +% +{@catcode`- = @active + @gdef@normalturnoffactive{% + @let-=@normaldash + @let"=@normaldoublequote + @let$=@normaldollar %$ font-lock fix + @let+=@normalplus + @let<=@normalless + @let>=@normalgreater + @let\=@normalbackslash + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let~=@normaltilde + @markupsetuplqdefault + @markupsetuprqdefault + @unsepspaces + } +} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% 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. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\' in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also turn back on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active + @catcode`@_=@active +} + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These (along with & and #) are made active for url-breaking, so need +% active definitions as the normal characters. +@def@normaldot{.} +@def@normalquest{?} +@def@normalslash{/} + +% These look ok in all fonts, so just make them not special. +% @hashchar{} gets its own user-level command, because of #line. +@catcode`@& = @other @def@normalamp{&} +@catcode`@# = @other @def@normalhash{#} +@catcode`@% = @other @def@normalpercent{%} + +@let @hashchar = @normalhash + +@c Finally, make ` and ' active, so that txicodequoteundirected and +@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we +@c don't make ` and ' active, @code will not get them as active chars. +@c Do this last of all since we use ` in the previous @catcode assignments. +@catcode`@'=@active +@catcode`@`=@active +@markupsetuplqdefault +@markupsetuprqdefault + +@c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" +@c End: + +@c vim:sw=2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore diff --git a/configh.dos b/configh.dos new file mode 100644 index 0000000..b316214 --- /dev/null +++ b/configh.dos @@ -0,0 +1,113 @@ +/* configh.dos -- hand-massaged config.h file for MS-DOS builds -*-C-*- + +Copyright (C) 1994-2014 Free 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.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "make" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "4.1" + +/* Output sync sypport */ +#define NO_OUTPUT_SYNC + +/* Version number of package */ +#define VERSION "4.1" + +/* Build host information. */ +#define MAKE_HOST "i386-pc-msdosdjgpp" + +/* Grok DOS paths (drive specs and backslash path element separators) */ +#define HAVE_DOS_PATHS diff --git a/configure b/configure new file mode 100755 index 0000000..c587e44 --- /dev/null +++ b/configure @@ -0,0 +1,12904 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for GNU make 4.1. +# +# 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.1' +PACKAGE_STRING='GNU make 4.1' +PACKAGE_BUGREPORT='bug-make@gnu.org' +PACKAGE_URL='http://www.gnu.org/software/make/' + +ac_unique_file="vpath.c" +# 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" + +gt_needs= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +WINDOWSENV_FALSE +WINDOWSENV_TRUE +MAKE_HOST +USE_LOCAL_GLOB_FALSE +USE_LOCAL_GLOB_TRUE +GLOBLIB +GLOBINC +AM_LDFLAGS +USE_CUSTOMS_FALSE +USE_CUSTOMS_TRUE +REMOTE +GETLOADAVG_LIBS +KMEM_GROUP +NEED_SETGID +LIBOBJS +HAVE_GUILE_FALSE +HAVE_GUILE_TRUE +GUILE_LIBS +GUILE_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +ALLOCA +POSUB +LTLIBINTL +LIBINTL +INTLLIBS +LTLIBICONV +LIBICONV +INTL_MACOSX_LIBS +XGETTEXT_EXTRA_OPTIONS +MSGMERGE +XGETTEXT_015 +XGETTEXT +GMSGFMT_015 +MSGFMT_015 +GMSGFMT +MSGFMT +GETTEXT_MACRO_VERSION +USE_NLS +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +ac_ct_AR +PERL +AR +RANLIB +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +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 +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' +ac_subst_files='MAINT_MAKEFILE' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +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 +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' +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 ;; + + -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 +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.1 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] + --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.1:";; + 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 + --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 + +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.1 +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_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# 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_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_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&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.1, 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 + +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 config "$srcdir"/config; 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 config \"$srcdir\"/config" "$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 config.h" + + +# Automake setup +# We have to enable "foreign" because ChangeLog is auto-generated +# We cannot enable -Werror because gettext 0.18.1 has invalid content +# When we update gettext to 0.18.3 or better we can add it again. +am__api_version='1.14' + +# 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}" != 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.1' + + +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. 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" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# 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 + + 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 _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 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 + + + +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 + + + +# Needed for w32/Makefile.am +if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +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 + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_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="$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_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 + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + 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 +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + + +# Specialized system macros +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_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 + + + +{ $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 + + + +# Enable gettext, in "external" mode. + + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + + + { $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.18 + + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +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 + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +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 + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +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 + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +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 GCC" >&5 +$as_echo_n "checking for ld used by GCC... " >&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. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path 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 + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + 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 GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${acl_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's 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 + 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 +int main () +{ + /* 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 const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + 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, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } + /* 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 const char input[] = "\263"; + char buf[10]; + 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, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#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 const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + 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, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#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)) + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + am_cv_func_iconv_works=yes +else + am_cv_func_iconv_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 + + 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 +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 + + +# Find some definition for uintmax_t + +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 : + +else + uintmax_t="unsigned long" + ac_fn_c_check_type "$LINENO" "unsigned long long" "ac_cv_type_unsigned_long_long" "$ac_includes_default" +if test "x$ac_cv_type_unsigned_long_long" = xyes; then : + uintmax_t="unsigned long long" +fi + + +cat >>confdefs.h <<_ACEOF +#define uintmax_t $uintmax_t +_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; + exit (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 mkstemp mktemp fdopen fileno \ + dup dup2 getcwd realpath sigsetmask sigaction \ + getgroups seteuid setegid setlinebuf setreuid setregid \ + getrlimit setrlimit setvbuf pipe strerror strsignal \ + lstat readlink atexit isatty ttyname +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 + + +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 + + +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 + +{ $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 + + +# See if the user wants to add (or not) GNU Guile support + + + + + + + +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 + +# Check whether --with-guile was given. +if test "${with_guile+set}" = set; then : + withval=$with_guile; +fi + + +# For some strange reason, at least on Ubuntu, each version of Guile +# comes with it's own PC file so we have to specify them as individual +# packages. Ugh. +if test "x$with_guile" != xno; then : + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUILE" >&5 +$as_echo_n "checking for GUILE... " >&6; } + +if test -n "$GUILE_CFLAGS"; then + pkg_cv_GUILE_CFLAGS="$GUILE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "guile-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GUILE_CFLAGS=`$PKG_CONFIG --cflags "guile-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GUILE_LIBS"; then + pkg_cv_GUILE_LIBS="$GUILE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "guile-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GUILE_LIBS=`$PKG_CONFIG --libs "guile-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +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-2.0" 2>&1` + else + GUILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "guile-2.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GUILE_PKG_ERRORS" >&5 + + +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-1.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "guile-1.8") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GUILE_CFLAGS=`$PKG_CONFIG --cflags "guile-1.8" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GUILE_LIBS"; then + pkg_cv_GUILE_LIBS="$GUILE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-1.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "guile-1.8") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GUILE_LIBS=`$PKG_CONFIG --libs "guile-1.8" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +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-1.8" 2>&1` + else + GUILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "guile-1.8" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GUILE_PKG_ERRORS" >&5 + + have_guile=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_guile=no +else + GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS + GUILE_LIBS=$pkg_cv_GUILE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_guile=yes +fi +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUILE" >&5 +$as_echo_n "checking for GUILE... " >&6; } + +if test -n "$GUILE_CFLAGS"; then + pkg_cv_GUILE_CFLAGS="$GUILE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-1.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "guile-1.8") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GUILE_CFLAGS=`$PKG_CONFIG --cflags "guile-1.8" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GUILE_LIBS"; then + pkg_cv_GUILE_LIBS="$GUILE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-1.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "guile-1.8") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GUILE_LIBS=`$PKG_CONFIG --libs "guile-1.8" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +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-1.8" 2>&1` + else + GUILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "guile-1.8" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GUILE_PKG_ERRORS" >&5 + + have_guile=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_guile=no +else + GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS + GUILE_LIBS=$pkg_cv_GUILE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_guile=yes +fi +else + GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS + GUILE_LIBS=$pkg_cv_GUILE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_guile=yes +fi + +fi + +if test "$have_guile" = yes; then : + +$as_echo "#define HAVE_GUILE 1" >>confdefs.h + +fi + + if test "$have_guile" = yes; then + HAVE_GUILE_TRUE= + HAVE_GUILE_FALSE='#' +else + HAVE_GUILE_TRUE='#' + HAVE_GUILE_FALSE= +fi + + +ac_have_func=no # yes means we've found a way to get the load average. + +# Make sure getloadavg.c is where it belongs, at configure-time. +test -f "$srcdir/$ac_config_libobj_dir/getloadavg.c" || + as_fn_error $? "$srcdir/$ac_config_libobj_dir/getloadavg.c is missing" "$LINENO" 5 + +ac_save_LIBS=$LIBS + +# Check for getloadavg, but be sure not to touch the cache variable. +(ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg" +if test "x$ac_cv_func_getloadavg" = xyes; then : + exit 0 +else + exit 1 +fi +) && ac_have_func=yes + +# On HPUX9, an unprivileged user can get load averages through this function. +for ac_func in pstat_getdynamic +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 + +fi +done + + +# Solaris has libkstat which does not require root. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for kstat_open in -lkstat" >&5 +$as_echo_n "checking for kstat_open in -lkstat... " >&6; } +if ${ac_cv_lib_kstat_kstat_open+:} false; then : + $as_echo_n "(cached) " >&6 +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 && ac_have_func=yes + +# Some systems with -lutil have (and need) -lkvm as well, some do not. +# On Solaris, -lkvm requires nlist from -lelf, so check that first +# to get the right answer into the cache. +# For kstat on solaris, we need libelf to force the definition of SVR4 below. +if test $ac_have_func = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for elf_begin in -lelf" >&5 +$as_echo_n "checking for elf_begin in -lelf... " >&6; } +if ${ac_cv_lib_elf_elf_begin+:} false; then : + $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 + +fi +if test $ac_have_func = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kvm_open in -lkvm" >&5 +$as_echo_n "checking for kvm_open in -lkvm... " >&6; } +if ${ac_cv_lib_kvm_kvm_open+:} false; then : + $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" ac_have_func=yes ac_cv_func_getloadavg_setgid=yes +fi + +fi + +if test $ac_have_func = no; then + # There is a commonly available library for RS/6000 AIX. + # Since it is not a standard part of AIX, it might be installed locally. + ac_getloadavg_LIBS=$LIBS + LIBS="-L/usr/local/lib $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getloadavg in -lgetloadavg" >&5 +$as_echo_n "checking for getloadavg in -lgetloadavg... " >&6; } +if ${ac_cv_lib_getloadavg_getloadavg+:} false; then : + $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" +else + LIBS=$ac_getloadavg_LIBS +fi + +fi + +# Make sure it is really in the library, if we think we found it, +# otherwise set up the replacement function. +for ac_func in getloadavg +do : + ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg" +if test "x$ac_cv_func_getloadavg" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETLOADAVG 1 +_ACEOF + +else + case " $LIBOBJS " in + *" getloadavg.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getloadavg.$ac_objext" + ;; +esac + + +$as_echo "#define C_GETLOADAVG 1" >>confdefs.h + +# Figure out what our getloadavg.c needs. +ac_have_func=no +ac_fn_c_check_header_mongrel "$LINENO" "sys/dg_sys_info.h" "ac_cv_header_sys_dg_sys_info_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_dg_sys_info_h" = xyes; then : + ac_have_func=yes + +$as_echo "#define 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 + + + +ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes; then : + +fi + + +for ac_func in setlocale +do : + ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" +if test "x$ac_cv_func_setlocale" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETLOCALE 1 +_ACEOF + +fi +done + + +# 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 $ac_have_func = no && test "$ac_cv_lib_elf_elf_begin" = yes \ + && test "$ac_cv_lib_kvm_kvm_open" = yes; then + ac_have_func=yes + +$as_echo "#define SVR4 1" >>confdefs.h + +fi + +if test $ac_have_func = no; then + ac_fn_c_check_header_mongrel "$LINENO" "inq_stats/cpustats.h" "ac_cv_header_inq_stats_cpustats_h" "$ac_includes_default" +if test "x$ac_cv_header_inq_stats_cpustats_h" = xyes; then : + ac_have_func=yes + +$as_echo "#define UMAX 1" >>confdefs.h + + +$as_echo "#define UMAX4_3 1" >>confdefs.h + +fi + + +fi + +if test $ac_have_func = no; then + ac_fn_c_check_header_mongrel "$LINENO" "sys/cpustats.h" "ac_cv_header_sys_cpustats_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_cpustats_h" = xyes; then : + ac_have_func=yes; $as_echo "#define UMAX 1" >>confdefs.h + +fi + + +fi + +if test $ac_have_func = no; then + for ac_header in mach/mach.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "mach/mach.h" "ac_cv_header_mach_mach_h" "$ac_includes_default" +if test "x$ac_cv_header_mach_mach_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MACH_MACH_H 1 +_ACEOF + +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 + + +$as_echo "#define NLIST_NAME_UNION 1" >>confdefs.h + +fi + + +fi + +done + +fi +done + + +# Some definitions of getloadavg require that the program be installed setgid. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getloadavg requires setgid" >&5 +$as_echo_n "checking whether getloadavg requires setgid... " >&6; } +if ${ac_cv_func_getloadavg_setgid+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include "$srcdir/$ac_config_libobj_dir/getloadavg.c" +#ifdef LDAV_PRIVILEGED +Yowza Am I SETGID yet +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Yowza Am I SETGID yet" >/dev/null 2>&1; then : + ac_cv_func_getloadavg_setgid=yes +else + ac_cv_func_getloadavg_setgid=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getloadavg_setgid" >&5 +$as_echo "$ac_cv_func_getloadavg_setgid" >&6; } +if test $ac_cv_func_getloadavg_setgid = yes; then + NEED_SETGID=true + +$as_echo "#define GETLOADAVG_PRIVILEGED 1" >>confdefs.h + +else + NEED_SETGID=false +fi + +if test $ac_cv_func_getloadavg_setgid = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking group of /dev/kmem" >&5 +$as_echo_n "checking group of /dev/kmem... " >&6; } +if ${ac_cv_group_kmem+:} false; then : + $as_echo_n "(cached) " >&6 +else + # On Solaris, /dev/kmem is a symlink. Get info on the real file. + ac_ls_output=`ls -lgL /dev/kmem 2>/dev/null` + # If we got an error (system does not support symlinks), try without -L. + test -z "$ac_ls_output" && ac_ls_output=`ls -lg /dev/kmem` + ac_cv_group_kmem=`$as_echo "$ac_ls_output" \ + | sed -ne 's/[ ][ ]*/ /g; + s/^.[sSrwx-]* *[0-9]* *\([^0-9]*\) *.*/\1/; + / /s/.* //;p;'` + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_group_kmem" >&5 +$as_echo "$ac_cv_group_kmem" >&6; } + KMEM_GROUP=$ac_cv_group_kmem +fi +if test "x$ac_save_LIBS" = x; then + GETLOADAVG_LIBS=$LIBS +else + GETLOADAVG_LIBS=`$as_echo "$LIBS" | sed "s|$ac_save_LIBS||"` +fi +LIBS=$ac_save_LIBS + + + +# AC_FUNC_GETLOADAVG is documented to set the NLIST_STRUCT value, but it +# doesn't. So, we will. + +if test "$ac_cv_header_nlist_h" = yes; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +struct nlist nl; + nl.n_name = "string"; + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + make_cv_nlist_struct=yes +else + make_cv_nlist_struct=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test "$make_cv_nlist_struct" = yes; then : + +$as_echo "#define NLIST_STRUCT 1" >>confdefs.h + + +fi + +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 + +# 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 + +# 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 + +#define GLOB_INTERFACE_VERSION 1 +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +# include +# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION + gnu glob +# endif +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "gnu glob" >/dev/null 2>&1; then : + make_cv_sys_gnu_glob=yes +else + make_cv_sys_gnu_glob=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_sys_gnu_glob" >&5 +$as_echo "$make_cv_sys_gnu_glob" >&6; } +if test "$make_cv_sys_gnu_glob" = no; then : + GLOBINC='-I$(srcdir)/glob' + GLOBLIB=glob/libglob.a + +fi + + + +# Tell automake about this, so it can build the right .c files. + if test "$make_cv_sys_gnu_glob" = no; then + USE_LOCAL_GLOB_TRUE= + USE_LOCAL_GLOB_FALSE='#' +else + USE_LOCAL_GLOB_TRUE='#' + USE_LOCAL_GLOB_FALSE= +fi + + +# Let the makefile know what our build host is + + +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 + +# Specify what files are to be created. +ac_config_files="$ac_config_files Makefile glob/Makefile po/Makefile.in config/Makefile doc/Makefile w32/Makefile tests/config-flags.pm" + + +# 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 "${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 "${USE_LOCAL_GLOB_TRUE}" && test -z "${USE_LOCAL_GLOB_FALSE}"; then + as_fn_error $? "conditional \"USE_LOCAL_GLOB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WINDOWSENV_TRUE}" && test -z "${WINDOWSENV_FALSE}"; then + as_fn_error $? "conditional \"WINDOWSENV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +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.1, 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.1 +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" ac_aux_dir="$ac_aux_dir" +# 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 + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "glob/Makefile") CONFIG_FILES="$CONFIG_FILES glob/Makefile" ;; + "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "config/Makefile") CONFIG_FILES="$CONFIG_FILES config/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "w32/Makefile") CONFIG_FILES="$CONFIG_FILES w32/Makefile" ;; + "tests/config-flags.pm") CONFIG_FILES="$CONFIG_FILES tests/config-flags.pm" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + 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. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "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" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/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 assigment 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 assigment 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 + + +# We only generate the build.sh if we have a build.sh.in; we won't have +# one before we've created a distribution. +if test -f "$srcdir/build.sh.in"; then : + ./config.status --file build.sh + chmod +x build.sh + +fi + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..fab9a2d --- /dev/null +++ b/configure.ac @@ -0,0 +1,525 @@ +# Process this file with autoconf to produce a configure script. +# +# Copyright (C) 1993-2014 Free 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.1],[bug-make@gnu.org]) + +AC_PREREQ([2.62]) + +# Autoconf setup +AC_CONFIG_AUX_DIR([config]) +AC_CONFIG_SRCDIR([vpath.c]) +AC_CONFIG_HEADERS([config.h]) + +# Automake setup +# We have to enable "foreign" because ChangeLog is auto-generated +# We cannot enable -Werror because gettext 0.18.1 has invalid content +# When we update gettext to 0.18.3 or better we can add it again. +AM_INIT_AUTOMAKE([1.11.1 silent-rules foreign -Wall]) + +# Checks for programs. +AC_USE_SYSTEM_EXTENSIONS +AC_PROG_CC +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]) + +# Needed for w32/Makefile.am +AM_PROG_AR + +# Specialized system macros +AC_CANONICAL_HOST +AC_AIX +AC_ISC_POSIX +AC_MINIX + +# Enable gettext, in "external" mode. +AM_GNU_GETTEXT_VERSION([0.18.1]) +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]) + +AM_PROG_CC_C_O +AC_C_CONST +AC_TYPE_SIGNAL +AC_TYPE_UID_T +AC_TYPE_PID_T + +# Find some definition for uintmax_t + +AC_CHECK_TYPE([uintmax_t],[], +[ uintmax_t="unsigned long" + AC_CHECK_TYPE([unsigned long long],[uintmax_t="unsigned long long"]) + AC_DEFINE_UNQUOTED([uintmax_t], [$uintmax_t], + [Define uintmax_t if not defined in or .]) +]) + +# 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; + exit (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 mkstemp mktemp fdopen fileno \ + dup dup2 getcwd realpath sigsetmask sigaction \ + getgroups seteuid setegid setlinebuf setreuid setregid \ + getrlimit setrlimit setvbuf pipe strerror strsignal \ + lstat readlink atexit isatty ttyname]) + +# 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_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_ALLOCA +AC_FUNC_CLOSEDIR_VOID + +# See if the user wants to add (or not) GNU Guile support +PKG_PROG_PKG_CONFIG +AC_ARG_WITH([guile], [AS_HELP_STRING([--with-guile], + [Support GNU Guile for embedded scripting])]) + +# For some strange reason, at least on Ubuntu, each version of Guile +# comes with it's own PC file so we have to specify them as individual +# packages. Ugh. +AS_IF([test "x$with_guile" != xno], +[ PKG_CHECK_MODULES([GUILE], [guile-2.0], [have_guile=yes], + [PKG_CHECK_MODULES([GUILE], [guile-1.8], [have_guile=yes], + [have_guile=no])]) +]) + +AS_IF([test "$have_guile" = yes], + [AC_DEFINE([HAVE_GUILE], [1], [Embed GNU Guile support])]) + +AM_CONDITIONAL([HAVE_GUILE], [test "$have_guile" = yes]) + +AC_FUNC_GETLOADAVG + +# AC_FUNC_GETLOADAVG is documented to set the NLIST_STRUCT value, but it +# doesn't. So, we will. + +AS_IF([test "$ac_cv_header_nlist_h" = yes], +[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[struct nlist nl; + nl.n_name = "string"; + return 0;]])], + [make_cv_nlist_struct=yes], + [make_cv_nlist_struct=no]) + AS_IF([test "$make_cv_nlist_struct" = yes], + [ AC_DEFINE([NLIST_STRUCT], [1], + [Define to 1 if struct nlist.n_name is a pointer rather than an array.]) + ]) +]) + +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.]) +]) + +# 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 + +# 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 + +#define GLOB_INTERFACE_VERSION 1 +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +# include +# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION + gnu glob +# endif +#endif], + [make_cv_sys_gnu_glob=yes], + [make_cv_sys_gnu_glob=no])]) +AS_IF([test "$make_cv_sys_gnu_glob" = no], +[ GLOBINC='-I$(srcdir)/glob' + GLOBLIB=glob/libglob.a +]) +AC_SUBST([GLOBINC]) +AC_SUBST([GLOBLIB]) + +# Tell automake about this, so it can build the right .c files. +AM_CONDITIONAL([USE_LOCAL_GLOB], [test "$make_cv_sys_gnu_glob" = no]) + +# Let the makefile know what our build host is + +AC_DEFINE_UNQUOTED([MAKE_HOST],["$host"],[Build host information.]) +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 +]) + +# Specify what files are to be created. +AC_CONFIG_FILES([Makefile glob/Makefile po/Makefile.in config/Makefile \ + doc/Makefile w32/Makefile tests/config-flags.pm]) + +# OK, do it! + +AC_OUTPUT + +# We only generate the build.sh if we have a build.sh.in; we won't have +# one before we've created a distribution. +AS_IF([test -f "$srcdir/build.sh.in"], +[ ./config.status --file build.sh + chmod +x build.sh +]) + +dnl Local Variables: +dnl comment-start: "dnl " +dnl comment-end: "" +dnl comment-start-skip: "\\bdnl\\b\\s *" +dnl compile-command: "make configure config.h.in" +dnl End: diff --git a/configure.bat b/configure.bat new file mode 100644 index 0000000..e54ba84 --- /dev/null +++ b/configure.bat @@ -0,0 +1,60 @@ +@echo off +rem Copyright (C) 1994-2014 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 Configuring MAKE for 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 +set XSRC=%1 +if not "%XSRC%"=="%1" goto SmallEnv + +:SrcDone + +update %XSRC%/configh.dos ./config.h + +rem Do they have Make? +redir -o junk.$$$ -eo make -n -f NUL +rem REDIR will return 1 if it cannot run Make. +rem If it can run Make, it will usually return 2, +rem but 0 is also OK with us. +if errorlevel 2 goto MakeOk +if not errorlevel 1 goto MakeOk +if exist junk.$$$ del junk.$$$ +echo No Make program found--use DOSBUILD.BAT to build Make. +goto End + +rem They do have Make. Generate the Makefile. + +:MakeOk +del junk.$$$ +update %XSRC%/Makefile.DOS ./Makefile +echo Done. +if not "%XSRC%"=="." echo Invoke Make thus: "make srcdir=%XSRC%" +goto End + +:SmallEnv +echo Your environment is too small. Please enlarge it and run me again. + +:End +set XRSC= diff --git a/debug.h b/debug.h new file mode 100644 index 0000000..9d2ec04 --- /dev/null +++ b/debug.h @@ -0,0 +1,37 @@ +/* Debugging macros and interface. +Copyright (C) 1999-2014 Free 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) + +#define DBS(_l,_x) do{ if(ISDB(_l)) {print_spaces (depth); \ + printf _x; fflush (stdout);} }while(0) + +#define DBF(_l,_x) do{ if(ISDB(_l)) {print_spaces (depth); \ + printf (_x, file->name); \ + fflush (stdout);} }while(0) + +#define DB(_l,_x) do{ if(ISDB(_l)) {printf _x; fflush (stdout);} }while(0) diff --git a/default.c b/default.c new file mode 100644 index 0000000..3b6f7ae --- /dev/null +++ b/default.c @@ -0,0 +1,663 @@ +/* Data base of default implicit rules for GNU Make. +Copyright (C) 1988-2014 Free 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 + ".obj.exe", + "$(LINK.obj) $^ $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@", + ".mar.exe", + "$(COMPILE.mar) $^ \n $(LINK.obj) $(subst .mar,.obj,$^) $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@", + ".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) $<", + +#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.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)", + "COMPILE.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH)", + "YACC.y", "$(YACC) $(YFLAGS)", + "LEX.l", "$(LEX) $(LFLAGS)", + "COMPILE.for", "$(FC) $(FFLAGS) $(TARGET_ARCH)", + "COMPILE.pas", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH)", + "COMPILE.mar", "$(MACRO) $(MACROFLAGS)", + "COMPILE.s", "$(AS) $(ASFLAGS) $(TARGET_MACH)", + "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", + "COMPILE.C", "$(COMPILE.cc)", + "COMPILE.cpp", "$(COMPILE.cc)", + "LINK.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)", + "LINK.C", "$(LINK.cc)", + "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/dep.h b/dep.h new file mode 100644 index 0000000..b8c0d29 --- /dev/null +++ b/dep.h @@ -0,0 +1,92 @@ +/* Definitions of dependency data structures for GNU Make. +Copyright (C) 1988-2014 Free 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 . */ + +/* Flag bits for the second argument to 'read_makefile'. + These flags are saved in the 'changed' field of each + 'struct dep' 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, + chained through the 'next'. 'stem' is the stem for this + dep line of static pattern rule or NULL. + + Note that the first two words of this match a struct nameseq. */ + +struct dep + { + struct dep *next; + const char *name; + const char *stem; + struct file *file; + unsigned int changed : 8; + unsigned int ignore_mtime : 1; + unsigned int staticpattern : 1; + unsigned int need_2nd_expansion : 1; + unsigned int dontcare : 1; + }; + + +/* Structure used in chains of names, for parsing and globbing. */ + +struct nameseq + { + struct nameseq *next; + const char *name; + }; + +#define PARSEFS_NONE 0x0000 +#define PARSEFS_NOSTRIP 0x0001 +#define PARSEFS_NOAR 0x0002 +#define PARSEFS_NOGLOB 0x0004 +#define PARSEFS_EXISTS 0x0008 +#define PARSEFS_NOCACHE 0x0010 + +#define PARSE_FILE_SEQ(_s,_t,_c,_p,_f) \ + (_t *)parse_file_seq ((_s),sizeof (_t),(_c),(_p),(_f)) +#define PARSE_SIMPLE_SEQ(_s,_t) \ + (_t *)parse_file_seq ((_s),sizeof (_t),MAP_NUL,NULL,PARSEFS_NONE) + +#ifdef VMS +void *parse_file_seq (); +#else +void *parse_file_seq (char **stringp, unsigned int size, + int stopmap, const char *prefix, int flags); +#endif + +char *tilde_expand (const char *name); + +#ifndef NO_ARCHIVES +struct nameseq *ar_glob (const char *arname, const char *member_pattern, unsigned int size); +#endif + +#define dep_name(d) ((d)->name == 0 ? (d)->file->name : (d)->name) + +#define alloc_dep() (xcalloc (sizeof (struct dep))) +#define free_ns(_n) free (_n) +#define free_dep(_d) free_ns (_d) + +struct dep *copy_dep_chain (const struct dep *d); +void free_dep_chain (struct dep *d); +void free_ns_chain (struct nameseq *n); +struct dep *read_all_makefiles (const char **makefiles); +void eval_buffer (char *buffer, const gmk_floc *floc); +enum update_status update_goal_chain (struct dep *goals); diff --git a/dir.c b/dir.c new file mode 100644 index 0000000..7e00b8f --- /dev/null +++ b/dir.c @@ -0,0 +1,1234 @@ +/* Directory hashing for GNU Make. +Copyright (C) 1988-2014 Free 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 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; +} +#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; + int ctime; + int 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[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 + 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 + 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 + 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. */ + short length; + short impossible; /* This file is impossible. */ + }; + +static unsigned long +dirfile_hash_1 (const void *key) +{ + return_ISTRING_HASH_1 (((struct dirfile const *) key)->name); +} + +static unsigned long +dirfile_hash_2 (const void *key) +{ + return_ISTRING_HASH_2 (((struct dirfile const *) key)->name); +} + +static int +dirfile_hash_cmp (const void *xv, const void *yv) +{ + const struct dirfile *x = xv; + const struct dirfile *y = yv; + int result = x->length - y->length; + if (result) + return result; + return_ISTRING_COMPARE (x->name, y->name); +} + +#ifndef DIRFILE_BUCKETS +#define DIRFILE_BUCKETS 107 +#endif + +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; + +#ifdef VMS + if ((*name == '.') && (*(name+1) == 0)) + name = "[]"; + else + name = vmsify (name,1); +#endif + + 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) + dir->name = strcache_add_len (downcase (name), p - name); +#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. */ + +#ifdef VMS + r = vmsstat_dir (name, &st); +#elif 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 + 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 + 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 + +#ifdef VMS + filename = vmsify (filename,0); +#endif + + if (filename != 0) + { + struct dirfile dirfile_key; + + if (*filename == '\0') + { + /* Checking if the directory exists. */ + return 1; + } + dirfile_key.name = filename; + dirfile_key.length = strlen (filename); + df = hash_find_item (&dir->dirfiles, &dirfile_key); + if (df) + return !df->impossible; + } + + /* The file was not found in the hashed list. + Try to read the directory further. */ + + if (dir->dirstream == 0) + { +#ifdef WINDOWS32 + /* + * Check to see if directory has changed since last read. FAT + * filesystems force a rehash always as mtime does not change + * on directories (ugh!). + */ + if (dir->path_key) + { + if ((dir->fs_flags & FS_FAT) != 0) + { + dir->mtime = time ((time_t *) 0); + rehash = 1; + } + else if (stat (dir->path_key, &st) == 0 && st.st_mtime > dir->mtime) + { + /* reset date stamp to show most recent re-process. */ + dir->mtime = st.st_mtime; + rehash = 1; + } + + /* If it has been already read in, all done. */ + if (!rehash) + return 0; + + /* make sure directory can still be opened; if not return. */ + dir->dirstream = opendir (dir->path_key); + if (!dir->dirstream) + return 0; + } + else +#endif + /* The directory has been all read in. */ + return 0; + } + + while (1) + { + /* Enter the file in the hash table. */ + unsigned int len; + struct dirfile dirfile_key; + struct dirfile **dirfile_slot; + + ENULLLOOP (d, readdir (dir->dirstream)); + if (d == 0) + { + if (errno) + pfatal_with_name ("INTERNAL: readdir"); + break; + } + +#if defined(VMS) && defined(HAVE_DIRENT_H) + /* In VMS we get file versions too, which have to be stripped off */ + { + 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) + df->name = strcache_add_len (downcase (d->d_name), len); +#else + df->name = strcache_add_len (d->d_name, len); +#endif + df->length = len; + df->impossible = 0; + hash_insert_at (&dir->dirfiles, df, dirfile_slot); + } + /* Check if the name matches the one we're searching for. */ + if (filename != 0 && patheq (d->d_name, filename)) + return 1; + } + + /* If the directory has been completely read in, + close the stream and reset the pointer to nil. */ + if (d == 0) + { + --open_directories; + closedir (dir->dirstream); + dir->dirstream = 0; + } + return 0; +} + +/* Return 1 if the name FILENAME in directory DIRNAME + is entered in the dir hash table. + FILENAME must contain no slashes. */ + +int +dir_file_exists_p (const char *dirname, const char *filename) +{ + 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 + +#ifdef VMS + dirend = strrchr (name, ']'); + if (dirend == 0) + dirend = strrchr (name, ':'); + if (dirend == 0) + return dir_file_exists_p ("[]", name); +#else /* !VMS */ + dirend = strrchr (name, '/'); +#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 /* !VMS && !AMIGA */ + return dir_file_exists_p ("", name); +#endif /* AMIGA */ +#endif /* VMS */ + + 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; + } + return dir_file_exists_p (dirname, slash + 1); +} + +/* 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; + +#ifdef VMS + dirend = strrchr (p, ']'); + if (dirend == 0) + dirend = strrchr (p, ':'); + dirend++; + if (dirend == (char *)1) + dir = find_directory ("[]"); +#else + dirend = strrchr (p, '/'); +# 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 /* !VMS && !AMIGA */ + dir = find_directory ("."); +# endif /* AMIGA */ +#endif /* VMS */ + 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); + filename = p = slash + 1; + } + + 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) + 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 + dirend = strrchr (filename, ']'); + if (dirend == 0) + dir = find_directory ("[]")->contents; +#else + dirend = strrchr (filename, '/'); +#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 /* !VMS && !AMIGA */ + dir = find_directory (".")->contents; +#endif /* AMIGA */ +#endif /* VMS */ + 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; + filename = slash + 1; + } + + 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 + 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 %d): could not be opened.\n"), + dir->name, dir->contents->path_key,dir->contents->mtime); +#else /* WINDOWS32 */ +#ifdef VMS + 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 %d): "), + dir->name, dir->contents->path_key, dir->contents->mtime); +#else /* WINDOWS32 */ +#ifdef VMS + 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. */ + +#include + +/* Structure describing state of iterating through a directory hash table. */ + +struct dirstream + { + struct directory_contents *contents; /* The directory being read. */ + struct dirfile **dirfile_slot; /* Current slot in table. */ + }; + +/* Forward declarations. */ +static __ptr_t open_dirstream (const char *); +static struct dirent *read_dirstream (__ptr_t); + +static __ptr_t +open_dirstream (const char *directory) +{ + struct dirstream *new; + struct directory *dir = find_directory (directory); + + if (dir->contents == 0 || dir->contents->dirfiles.ht_vec == 0) + /* DIR->contents is nil if the directory could not be stat'd. + DIR->contents->dirfiles is nil if it could not be opened. */ + return 0; + + /* Read all the contents of the directory now. There is no benefit + in being lazy, since glob will want to see every file anyway. */ + + dir_contents_file_exists_p (dir->contents, 0); + + new = xmalloc (sizeof (struct dirstream)); + new->contents = dir->contents; + new->dirfile_slot = (struct dirfile **) new->contents->dirfiles.ht_vec; + + return (__ptr_t) new; +} + +static struct dirent * +read_dirstream (__ptr_t stream) +{ + static char *buf; + static unsigned int bufsz; + + struct dirstream *const ds = (struct dirstream *) stream; + struct directory_contents *dc = ds->contents; + struct dirfile **dirfile_end = (struct dirfile **) dc->dirfiles.ht_vec + dc->dirfiles.ht_size; + + while (ds->dirfile_slot < dirfile_end) + { + struct dirfile *df = *ds->dirfile_slot++; + if (! HASH_VACANT (df) && !df->impossible) + { + /* The glob interface wants a 'struct dirent', so mock one up. */ + struct dirent *d; + unsigned int len = df->length + 1; + unsigned int sz = sizeof (*d) - sizeof (d->d_name) + len; + if (sz > bufsz) + { + bufsz *= 2; + if (sz > bufsz) + bufsz = sz; + buf = xrealloc (buf, bufsz); + } + d = (struct dirent *) buf; +#ifdef __MINGW32__ +# if __MINGW32_MAJOR_VERSION < 3 || (__MINGW32_MAJOR_VERSION == 3 && \ + __MINGW32_MINOR_VERSION == 0) + d->d_name = xmalloc (len); +# endif +#endif + FAKE_DIR_ENTRY (d); +#ifdef _DIRENT_HAVE_D_NAMLEN + d->d_namlen = len - 1; +#endif +#ifdef _DIRENT_HAVE_D_TYPE + d->d_type = DT_UNKNOWN; +#endif + memcpy (d->d_name, df->name, len); + return d; + } + } + + return 0; +} + +/* On 64 bit ReliantUNIX (5.44 and above) in LFS mode, stat() is actually a + * macro for stat64(). If stat is a macro, make a local wrapper function to + * invoke it. + * + * On MS-Windows, stat() "succeeds" for foo/bar/. where foo/bar is a + * regular file; fix that here. + */ +#if !defined(stat) && !defined(WINDOWS32) +# ifndef VMS +int stat (const char *path, struct stat *sbuf); +# endif +# define local_stat stat +#else +static int +local_stat (const char *path, struct stat *buf) +{ + int e; +#ifdef WINDOWS32 + size_t plen = strlen (path); + + /* Make sure the parent of "." exists and is a directory, not a + file. This is because 'stat' on Windows normalizes the argument + foo/. => foo without checking first that foo is a directory. */ + if (plen > 1 && path[plen - 1] == '.' + && (path[plen - 2] == '/' || path[plen - 2] == '\\')) + { + char parent[MAXPATHLEN]; + + strncpy (parent, path, plen - 2); + parent[plen - 2] = '\0'; + if (stat (parent, buf) < 0 || !_S_ISDIR (buf->st_mode)) + return -1; + } +#endif + + EINTRLOOP (e, stat (path, buf)); + return e; +} +#endif + +void +dir_setup_glob (glob_t *gl) +{ + gl->gl_opendir = open_dirstream; + gl->gl_readdir = read_dirstream; + gl->gl_closedir = free; + gl->gl_stat = local_stat; + /* We don't bother setting gl_lstat, since glob never calls it. + The slot is only there for compatibility with 4.4 BSD. */ +} + +void +hash_init_directories (void) +{ + hash_init (&directories, DIRECTORY_BUCKETS, + directory_hash_1, directory_hash_2, directory_hash_cmp); + hash_init (&directory_contents, DIRECTORY_BUCKETS, + directory_contents_hash_1, directory_contents_hash_2, + directory_contents_hash_cmp); +} diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..03977ba --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,24 @@ +# -*-Makefile-*-, or close enough +# Copyright (C) 2000-2014 Free 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/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..f930c6a --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,793 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 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-2014 Free 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +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 +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(make_TEXINFOS) $(top_srcdir)/config/mdate-sh \ + $(srcdir)/version.texi $(srcdir)/stamp-vti \ + $(top_srcdir)/config/texinfo.tex +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/intlmacosx.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +AM_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)/config/texinfo.tex +am__TEXINFO_TEX_DIR = $(top_srcdir)/config +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) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLOBINC = @GLOBINC@ +GLOBLIB = @GLOBLIB@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GUILE_CFLAGS = @GUILE_CFLAGS@ +GUILE_LIBS = @GUILE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +KMEM_GROUP = @KMEM_GROUP@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_HOST = @MAKE_HOST@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEED_SETGID = @NEED_SETGID@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +REMOTE = @REMOTE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +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 +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +.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)/config/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) + -@rm -f vti.tmp + @cp $(srcdir)/version.texi $@ + +mostlyclean-vti: + -rm -f vti.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: $(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 + + +# 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/doc/fdl.texi b/doc/fdl.texi new file mode 100644 index 0000000..9c3bbe5 --- /dev/null +++ b/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{http://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{http://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/doc/make-stds.texi b/doc/make-stds.texi new file mode 100644 index 0000000..db01628 --- /dev/null +++ b/doc/make-stds.texi @@ -0,0 +1,1172 @@ +@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 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 `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/doc/make.info b/doc/make.info new file mode 100644 index 0000000..7a54c1b --- /dev/null +++ b/doc/make.info @@ -0,0 +1,200 @@ +This is make.info, produced by makeinfo version 5.2 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.73, last updated 5 October 2014, of 'The GNU Make +Manual', for GNU 'make' version 4.1. + + 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 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: 1342 +make.info-2: 305689 + +Tag Table: +(Indirect) +Node: Top1342 +Node: Overview16115 +Node: Preparing17128 +Node: Reading18096 +Node: Bugs19023 +Node: Introduction20852 +Node: Rule Introduction22445 +Node: Simple Makefile24378 +Node: How Make Works28114 +Node: Variables Simplify30763 +Node: make Deduces32969 +Node: Combine By Prerequisite34702 +Node: Cleanup35731 +Node: Makefiles37149 +Node: Makefile Contents37985 +Node: Splitting Lines41158 +Node: Makefile Names42918 +Node: Include44525 +Ref: Include-Footnote-148269 +Node: MAKEFILES Variable48403 +Node: Remaking Makefiles49944 +Node: Overriding Makefiles54169 +Node: Reading Makefiles56197 +Node: Secondary Expansion59659 +Node: Rules67120 +Node: Rule Example69793 +Node: Rule Syntax70646 +Node: Prerequisite Types73241 +Node: Wildcards76108 +Node: Wildcard Examples77827 +Node: Wildcard Pitfall79177 +Node: Wildcard Function80966 +Node: Directory Search82750 +Node: General Search83885 +Node: Selective Search85592 +Node: Search Algorithm88582 +Node: Recipes/Search91100 +Node: Implicit/Search92423 +Node: Libraries/Search93365 +Node: Phony Targets95336 +Node: Force Targets100173 +Node: Empty Targets101210 +Node: Special Targets102512 +Node: Multiple Targets110385 +Node: Multiple Rules112245 +Node: Static Pattern114463 +Node: Static Usage115115 +Node: Static versus Implicit118834 +Node: Double-Colon120574 +Node: Automatic Prerequisites122334 +Node: Recipes126595 +Node: Recipe Syntax127767 +Node: Splitting Recipe Lines129882 +Node: Variables in Recipes133035 +Node: Echoing134361 +Node: Execution135636 +Ref: Execution-Footnote-1137049 +Node: One Shell137194 +Node: Choosing the Shell140509 +Node: Parallel144653 +Node: Parallel Output147322 +Node: Parallel Input151749 +Node: Errors152868 +Node: Interrupts156532 +Node: Recursion158115 +Node: MAKE Variable160212 +Node: Variables/Recursion162455 +Node: Options/Recursion167900 +Node: -w Option173918 +Node: Canned Recipes174913 +Node: Empty Recipes177896 +Node: Using Variables179044 +Node: Reference182472 +Node: Flavors184030 +Node: Advanced190009 +Node: Substitution Refs190514 +Node: Computed Names192067 +Node: Values196615 +Node: Setting197532 +Node: Appending200441 +Node: Override Directive204383 +Node: Multi-Line206010 +Node: Undefine Directive208834 +Node: Environment209923 +Node: Target-specific212175 +Node: Pattern-specific215202 +Node: Suppressing Inheritance217049 +Node: Special Variables218502 +Node: Conditionals224911 +Node: Conditional Example225624 +Node: Conditional Syntax228187 +Node: Testing Flags233944 +Node: Functions235045 +Node: Syntax of Functions236605 +Node: Text Functions238939 +Node: File Name Functions247504 +Node: Conditional Functions252730 +Node: Foreach Function255105 +Node: File Function258318 +Node: Call Function260396 +Node: Value Function263281 +Node: Eval Function264718 +Node: Origin Function266994 +Node: Flavor Function270220 +Node: Make Control Functions271264 +Node: Shell Function272950 +Node: Guile Function274583 +Node: Running275333 +Node: Makefile Arguments277314 +Node: Goals278030 +Node: Instead of Execution282769 +Node: Avoiding Compilation286484 +Node: Overriding288459 +Node: Testing290771 +Node: Options Summary292655 +Node: Implicit Rules305689 +Node: Using Implicit307826 +Node: Catalogue of Rules311345 +Node: Implicit Variables320689 +Node: Chained Rules325762 +Node: Pattern Rules329772 +Node: Pattern Intro331306 +Node: Pattern Examples333888 +Node: Automatic Variables335695 +Node: Pattern Match343045 +Node: Match-Anything Rules346368 +Node: Canceling Rules350247 +Node: Last Resort350961 +Node: Suffix Rules352790 +Node: Implicit Rule Search356515 +Node: Archives360014 +Node: Archive Members360719 +Node: Archive Update362329 +Node: Archive Symbols364240 +Node: Archive Pitfalls365473 +Node: Archive Suffix Rules366195 +Node: Extending make367743 +Node: Guile Integration368880 +Node: Guile Types370108 +Node: Guile Interface372528 +Node: Guile Example373814 +Node: Loading Objects376005 +Node: load Directive377495 +Node: Remaking Loaded Objects380249 +Node: Loaded Object API380883 +Node: Loaded Object Example387645 +Node: Features389892 +Node: Missing399059 +Node: Makefile Conventions402784 +Node: Makefile Basics403763 +Node: Utilities in Makefiles406930 +Node: Command Variables409429 +Node: DESTDIR412669 +Node: Directory Variables414836 +Node: Standard Targets430192 +Node: Install Command Categories444298 +Node: Quick Reference448824 +Node: Error Messages461529 +Node: Complex Makefile469425 +Node: GNU Free Documentation License478043 +Node: Concept Index503185 +Node: Name Index573971 + +End Tag Table diff --git a/doc/make.info-1 b/doc/make.info-1 new file mode 100644 index 0000000..2a1a922 --- /dev/null +++ b/doc/make.info-1 @@ -0,0 +1,7316 @@ +This is make.info, produced by makeinfo version 5.2 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.73, last updated 5 October 2014, of 'The GNU Make +Manual', for GNU 'make' version 4.1. + + 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 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.73, last updated 5 October 2014, of 'The GNU Make +Manual', for GNU 'make' version 4.1. + + 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 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'. +* 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 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 + + + +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 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. + + +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.) + + 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: Secondary Expansion, Prev: Overriding Makefiles, Up: Makefiles + +3.7 How 'make' Reads a Makefile +=============================== + +GNU 'make' does its work in two distinct phases. During the first phase +it reads all the makefiles, included makefiles, etc. and internalizes +all the variables and their values, implicit and explicit rules, and +constructs a dependency graph of all the targets and their +prerequisites. During the second phase, 'make' uses these internal +structures to determine what targets will need to be rebuilt and to +invoke the rules necessary to do so. + + It's important to understand this two-phase approach because it has a +direct impact on how variable and function expansion happens; this is +often a source of some confusion when writing makefiles. Here we will +present a summary of the phases in which expansion happens for different +constructs within the makefile. We say that expansion is "immediate" if +it happens during the first phase: in this case 'make' will expand any +variables or functions in that section of a construct as the makefile is +parsed. We say that expansion is "deferred" if expansion is not +performed immediately. Expansion of a deferred construct is not +performed until either the construct appears later in an immediate +context, or until the second phase. + + 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 construct the target is always +deferred. This general rule is true for explicit rules, pattern rules, +suffix rules, static pattern rules, and simple prerequisite definitions. + + +File: make.info, Node: Secondary Expansion, Prev: Reading Makefiles, Up: Makefiles + +3.8 Secondary Expansion +======================= + +In the previous section we learned that GNU 'make' works in two distinct +phases: a read-in phase and a target-update phase (*note How 'make' +Reads a Makefile: Reading Makefiles.). GNU make also has the ability to +enable a _second expansion_ of the prerequisites (only) for some or all +targets defined in the makefile. In order for this second expansion to +occur, the special target '.SECONDEXPANSION' must be defined before the +first prerequisite list that makes use of this feature. + + 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 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. This usage of + '.SILENT' is supported only for historical compatibility. We + recommend you use the more selective ways to silence specific + recipes. *Note Recipe Echoing: Echoing. If you want to silence + all recipes for a particular run of 'make', use the '-s' or '--silent' + option (*note Options Summary::). + +'.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 +=============================== + +A rule with multiple targets is equivalent to writing many rules, each +with one target, and all identical aside from that. The same recipe +applies to all the targets, but its effect may vary because you can +substitute the actual target name into the recipe using '$@'. The rule +contributes the same prerequisites to all the targets also. + + This is 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. + + * Similar recipes work for all the targets. The recipes do not need + to be absolutely identical, since the automatic variable '$@' can + be used to substitute the particular target to be remade into the + commands (*note Automatic Variables::). For example: + + 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. + + +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.). '.SILENT' is essentially +obsolete since '@' is more flexible. + + +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 $(@D) && gobble $(@F) > ../$@ + +Here we use the shell AND operator ('&&') so that if the 'cd' command +fails, the script will fail without trying to invoke the 'gobble' +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 +_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. These ways of ignoring errors are obsolete because '-' +is more flexible. + + 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. + + +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 '-j 1' is always put into 'MAKEFLAGS' instead of the value you +specified. This is because 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. The only 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.). + + 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 is strongly discouraged, except in the case of +the 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 c.o + bar := $(foo:.o=.c) + +sets 'bar' to 'a.c b.c c.c'. *Note Setting Variables: Setting. + + A substitution reference is actually an abbreviation for use of the +'patsubst' expansion function (*note Functions for String Substitution +and Analysis: Text Functions.). We provide substitution references as +well as 'patsubst' for compatibility with other implementations of +'make'. + + 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 c.o + bar := $(foo:%.o=%.c) + +sets 'bar' to 'a.c b.c 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 program +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") + + +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). 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. + + 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 + + The value in an ordinary assignment cannot contain a newline; but the +newlines that separate the lines of the value in a 'define' become part +of the variable's value (except for the final newline which precedes the +'endef' and is not considered part of the value). + + When used in a recipe, the previous example is functionally +equivalent to this: + + 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.). + + +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. 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) + + substitutes the string '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 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 all cases the file is created if it does not +exist. + + The syntax of the 'file' function is: + + $(file OP FILENAME[,TEXT]) + + The operator OP can be either '>' which indicates overwrite mode, or +'>>' which indicates append mode. The FILENAME indicates the file to be +written to. There may optionally be whitespace between the operator and +the file name. + + When the 'file' function is expanded all its arguments are expanded +first, then the file indicated by FILENAME will be opened in the mode +described by OP. Finally TEXT will be written to the file. If TEXT +does not already end in a newline, even if empty, a final newline will +be written. If the TEXT argument is not given, nothing will be written. +The result of evaluating the 'file' function is always the empty string. + + It is a fatal error if the file cannot be opened for writing, or if +the write operation fails. + + 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.). + + 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.). + + +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. + +'--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. + diff --git a/doc/make.info-2 b/doc/make.info-2 new file mode 100644 index 0000000..c6229ff --- /dev/null +++ b/doc/make.info-2 @@ -0,0 +1,5884 @@ +This is make.info, produced by makeinfo version 5.2 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.73, last updated 5 October 2014, of 'The GNU Make +Manual', for GNU 'make' version 4.1. + + 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 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: 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. + + +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. Unlike normal rules, +this does not act as many different rules with the same prerequisites +and recipe. If a pattern rule has multiple targets, 'make' knows that +the rule's recipe is responsible for making all of the targets. The +recipe is executed only once to make all the targets. When searching +for a pattern rule to match a target, the target patterns of a rule +other than the one that matches the target in need of a rule are +incidental: 'make' worries only about giving a recipe and prerequisites +to the file presently in question. However, when this file's recipe is +run, the other targets are marked as having been updated themselves. + + +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. 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. These variants are semi-obsolete in +GNU 'make' since the functions 'dir' and 'notdir' can be used to get a +similar effect (*note Functions for File Names: File Name Functions.). +Note, however, that the 'D' variants all omit the trailing slash which +always appears in the output of the 'dir' function. Here is a table of +the variants: + +'$(@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: Features, Next: Missing, Prev: Extending make, Up: Top + +13 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 + +14 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 obsolete. + + * 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 + +15 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 + +15.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 + +15.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 + +15.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 + +15.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 + +15.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 + +15.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 + +15.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 + +C.1 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 33) +* '#' (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 33) +* +=, expansion <1>: Reading Makefiles. (line 33) +* ,v (RCS file extension): Catalogue of Rules. (line 163) +* '-' (in recipes): Errors. (line 19) +* -, and 'define': Canned Recipes. (line 49) +* '--always-make': Options Summary. (line 15) +* '--assume-new': Instead of Execution. + (line 41) +* '--assume-new' <1>: Options Summary. (line 284) +* '--assume-new', and recursion: Options/Recursion. (line 22) +* '--assume-old': Avoiding Compilation. + (line 6) +* '--assume-old' <1>: Options Summary. (line 163) +* '--assume-old', and recursion: Options/Recursion. (line 22) +* '--check-symlink-times': Options Summary. (line 144) +* '--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 154) +* '--environment-overrides': Options Summary. (line 85) +* '--eval': Options Summary. (line 89) +* '--file': Makefile Names. (line 23) +* '--file' <1>: Makefile Arguments. (line 6) +* '--file' <2>: Options Summary. (line 97) +* '--file', and recursion: Options/Recursion. (line 22) +* '--help': Options Summary. (line 103) +* '--ignore-errors': Errors. (line 30) +* '--ignore-errors' <1>: Options Summary. (line 108) +* '--include-dir': Include. (line 53) +* '--include-dir' <1>: Options Summary. (line 113) +* '--jobs': Parallel. (line 6) +* '--jobs' <1>: Options Summary. (line 120) +* '--jobs', and recursion: Options/Recursion. (line 25) +* '--just-print': Echoing. (line 18) +* '--just-print' <1>: Instead of Execution. + (line 14) +* '--just-print' <2>: Options Summary. (line 153) +* '--keep-going': Errors. (line 47) +* '--keep-going' <1>: Testing. (line 16) +* '--keep-going' <2>: Options Summary. (line 129) +* '--load-average': Parallel. (line 35) +* '--load-average' <1>: Options Summary. (line 136) +* '--makefile': Makefile Names. (line 23) +* '--makefile' <1>: Makefile Arguments. (line 6) +* '--makefile' <2>: Options Summary. (line 98) +* '--max-load': Parallel. (line 35) +* '--max-load' <1>: Options Summary. (line 137) +* '--new-file': Instead of Execution. + (line 41) +* '--new-file' <1>: Options Summary. (line 283) +* '--new-file', and recursion: Options/Recursion. (line 22) +* '--no-builtin-rules': Options Summary. (line 209) +* '--no-builtin-variables': Options Summary. (line 222) +* '--no-keep-going': Options Summary. (line 238) +* '--no-print-directory': -w Option. (line 20) +* '--no-print-directory' <1>: Options Summary. (line 275) +* '--old-file': Avoiding Compilation. + (line 6) +* '--old-file' <1>: Options Summary. (line 162) +* '--old-file', and recursion: Options/Recursion. (line 22) +* '--output-sync': Parallel Output. (line 11) +* '--output-sync' <1>: Options Summary. (line 171) +* '--print-data-base': Options Summary. (line 187) +* '--print-directory': Options Summary. (line 267) +* '--print-directory', and '--directory': -w Option. (line 20) +* '--print-directory', and recursion: -w Option. (line 20) +* '--print-directory', disabling: -w Option. (line 20) +* '--question': Instead of Execution. + (line 32) +* '--question' <1>: Options Summary. (line 201) +* '--quiet': Echoing. (line 24) +* '--quiet' <1>: Options Summary. (line 232) +* '--recon': Echoing. (line 18) +* '--recon' <1>: Instead of Execution. + (line 14) +* '--recon' <2>: Options Summary. (line 155) +* '--silent': Echoing. (line 24) +* '--silent' <1>: Options Summary. (line 231) +* '--stop': Options Summary. (line 239) +* '--touch': Instead of Execution. + (line 24) +* '--touch' <1>: Options Summary. (line 247) +* '--touch', and recursion: MAKE Variable. (line 35) +* '--trace': Options Summary. (line 254) +* '--version': Options Summary. (line 262) +* '--warn-undefined-variables': Options Summary. (line 292) +* '--what-if': Instead of Execution. + (line 41) +* '--what-if' <1>: Options Summary. (line 282) +* '-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' (shell flag): Automatic Prerequisites. + (line 65) +* '-f': Makefile Names. (line 23) +* '-f' <1>: Makefile Arguments. (line 6) +* '-f' <2>: Options Summary. (line 96) +* '-f', and recursion: Options/Recursion. (line 22) +* '-h': Options Summary. (line 102) +* '-I': Include. (line 53) +* '-i': Errors. (line 30) +* '-i' <1>: Options Summary. (line 107) +* '-I' <1>: Options Summary. (line 112) +* '-j': Parallel. (line 6) +* '-j' <1>: Options Summary. (line 119) +* '-j', and archive update: Archive Pitfalls. (line 6) +* '-j', and recursion: Options/Recursion. (line 25) +* '-k': Errors. (line 47) +* '-k' <1>: Testing. (line 16) +* '-k' <2>: Options Summary. (line 128) +* '-l': Options Summary. (line 135) +* '-L': Options Summary. (line 143) +* '-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 152) +* '-O': Parallel Output. (line 11) +* '-o': Avoiding Compilation. + (line 6) +* '-o' <1>: Options Summary. (line 161) +* '-O' <1>: Options Summary. (line 170) +* '-o', and recursion: Options/Recursion. (line 22) +* '-p': Options Summary. (line 186) +* '-q': Instead of Execution. + (line 32) +* '-q' <1>: Options Summary. (line 200) +* '-r': Options Summary. (line 208) +* '-R': Options Summary. (line 221) +* '-s': Echoing. (line 24) +* '-s' <1>: Options Summary. (line 230) +* '-S': Options Summary. (line 237) +* '-t': Instead of Execution. + (line 24) +* '-t' <1>: Options Summary. (line 246) +* '-t', and recursion: MAKE Variable. (line 35) +* '-v': Options Summary. (line 261) +* '-W': Instead of Execution. + (line 41) +* '-w': Options Summary. (line 266) +* '-W' <1>: Options Summary. (line 281) +* '-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 33) +* '?' (wildcard character): Wildcards. (line 6) +* ?=: Flavors. (line 135) +* ?= <1>: Setting. (line 6) +* ?=, expansion: Reading Makefiles. (line 33) +* '@' (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 187) +* deducing recipes (implicit rules): make Deduces. (line 6) +* default directories for included makefiles: Include. (line 53) +* default goal: How Make Works. (line 11) +* default goal <1>: Rules. (line 11) +* default makefile name: Makefile Names. (line 6) +* default rules, last-resort: Last Resort. (line 6) +* define, expansion: Reading Makefiles. (line 33) +* defining variables verbatim: Multi-Line. (line 6) +* deletion of target files: Errors. (line 64) +* 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 62) +* 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 92) +* 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, 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) +* Guile: Guile Function. (line 6) +* Guile <1>: Guile Integration. (line 6) +* Guile example: Guile Example. (line 6) +* guile, conversion of types: Guile Types. (line 6) +* home directory: Wildcards. (line 11) +* IEEE Standard 1003.2: Overview. (line 13) +* ifdef, expansion: Reading Makefiles. (line 82) +* ifeq, expansion: Reading Makefiles. (line 82) +* ifndef, expansion: Reading Makefiles. (line 82) +* ifneq, expansion: Reading Makefiles. (line 82) +* implicit rule: Implicit Rules. (line 6) +* implicit rule, and directory search: Implicit/Search. (line 6) +* implicit rule, and 'VPATH': Implicit/Search. (line 6) +* implicit rule, definition of: Makefile Contents. (line 16) +* implicit rule, expansion: Reading Makefiles. (line 92) +* implicit rule, 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) +* 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) +* jobs, limiting based on load: Parallel. (line 35) +* 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 61) +* list of changed prerequisites: Automatic Variables. (line 51) +* 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 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, parsing: 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) +* 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 53) +* 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 171) +* 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 171) +* parallel execution, overriding: Special Targets. (line 142) +* parts of makefile rule: Rule Introduction. (line 6) +* Pascal, rule to compile: Catalogue of Rules. (line 45) +* pattern rule: Pattern Intro. (line 6) +* pattern rule, expansion: Reading Makefiles. (line 92) +* pattern 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 157) +* post-installation commands: Install Command Categories. + (line 6) +* pre-installation commands: Install Command Categories. + (line 6) +* precious targets: Special Targets. (line 32) +* predefined rules and variables, printing: Options Summary. (line 187) +* prefix, adding: File Name Functions. (line 78) +* prerequisite: Rules. (line 6) +* prerequisite pattern, implicit: Pattern Intro. (line 22) +* prerequisite pattern, static (not implicit): Static Usage. (line 30) +* prerequisite types: Prerequisite Types. (line 6) +* prerequisite, expansion: Reading Makefiles. (line 92) +* 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 61) +* prerequisites, list of changed: Automatic Variables. (line 51) +* 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 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 150) +* 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 64) +* removal of target files <1>: Interrupts. (line 6) +* removing duplicate words: Text Functions. (line 155) +* removing targets on failure: Special Targets. (line 71) +* 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 77) +* 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 64) +* target, deleting on interrupt: Interrupts. (line 6) +* target, expansion: Reading Makefiles. (line 92) +* target, multiple in pattern rule: Pattern Intro. (line 53) +* 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, 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) +* '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) +* '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 292) +* 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 292) +* 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, 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': 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 64) +* .EXPORT_ALL_VARIABLES: Special Targets. (line 135) +* .EXPORT_ALL_VARIABLES <1>: Variables/Recursion. (line 99) +* .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 141) +* .ONESHELL: Special Targets. (line 149) +* .ONESHELL <1>: One Shell. (line 6) +* .PHONY: Phony Targets. (line 22) +* .PHONY <1>: Special Targets. (line 8) +* .POSIX: Special Targets. (line 156) +* .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) +* .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 28) +* 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/doc/make.texi b/doc/make.texi new file mode 100644 index 0000000..b0f5af7 --- /dev/null +++ b/doc/make.texi @@ -0,0 +1,12556 @@ +\input texinfo @c -*- Texinfo -*- +@c %**start of header +@setfilename make.info + +@include version.texi +@set EDITION 0.73 + +@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 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}. +* 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 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 + +@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 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. + +@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.)@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, Secondary Expansion, Overriding Makefiles, Makefiles +@section How @code{make} Reads a Makefile +@cindex reading makefiles +@cindex makefile, parsing + +GNU @code{make} does its work in two distinct phases. During the first +phase it reads all the makefiles, included makefiles, etc. and +internalizes all the variables and their values, implicit and explicit +rules, and constructs a dependency graph of all the targets and their +prerequisites. During the second phase, @code{make} uses these internal +structures to determine what targets will need to be rebuilt and to +invoke the rules necessary to do so. + +It's important to understand this two-phase approach because it has a +direct impact on how variable and function expansion happens; this is +often a source of some confusion when writing makefiles. Here we will +present a summary of the phases in which expansion happens for different +constructs within the makefile. We say that expansion is +@dfn{immediate} if it happens during the first phase: in this case +@code{make} will expand any variables or functions in that section of a +construct as the makefile is parsed. We say that expansion is +@dfn{deferred} if expansion is not performed immediately. Expansion of +a deferred construct is not performed until either the construct appears +later in an immediate context, or until the second phase. + +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 construct the target is always deferred. This +general rule is true for explicit rules, pattern rules, suffix rules, +static pattern rules, and simple prerequisite definitions. + +@node Secondary Expansion, , Reading Makefiles, Makefiles +@section Secondary Expansion +@cindex secondary expansion +@cindex expansion, secondary + +@findex .SECONDEXPANSION +In the previous section we learned that GNU @code{make} works in two +distinct phases: a read-in phase and a target-update phase +(@pxref{Reading Makefiles, , How @code{make} Reads a Makefile}). GNU +make also has the ability to enable a @emph{second expansion} of the +prerequisites (only) for some or all targets defined in the makefile. +In order for this second expansion to occur, the special target +@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 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. This usage of +@samp{.SILENT} is supported only for historical compatibility. We +recommend you use the more selective ways to silence specific recipes. +@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 + +A rule with multiple targets is equivalent to writing many rules, each with +one target, and all identical aside from that. The same recipe applies to +all the targets, but its effect may vary because you can substitute the +actual target name into the recipe using @samp{$@@}. The rule contributes +the same prerequisites to all the targets also. + +This is 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. + +@item +Similar recipes work for all the targets. The recipes do not need +to be absolutely identical, since the automatic variable @samp{$@@} +can be used to substitute the particular target to be remade into the +commands (@pxref{Automatic Variables}). For example: + +@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}. + +@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}). +@code{.SILENT} is essentially obsolete since @samp{@@} is more flexible.@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 $(@@D) && gobble $(@@F) > ../$@@ +@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 @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. These ways of ignoring errors are obsolete +because @samp{-} is more flexible. + +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. + +@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 +@samp{-j 1} is always put into @code{MAKEFLAGS} instead of the value you +specified. This is because 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. The only 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 + +@c !!! another reason is for canonical stamp files: +@ignore +@example +foo: stamp-foo ; +stamp-foo: foo.in + create foo frm foo.in + touch $@ +@end example +@end ignore + +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 is strongly discouraged, except in +the case of the 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 c.o +bar := $(foo:.o=.c) +@end example + +@noindent +sets @samp{bar} to @samp{a.c b.c c.c}. @xref{Setting, ,Setting Variables}. + +A substitution reference is actually an abbreviation for use of the +@code{patsubst} expansion function (@pxref{Text Functions, ,Functions for String Substitution and Analysis}). We provide +substitution references as well as @code{patsubst} for compatibility with +other implementations of @code{make}. + +@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 c.o +bar := $(foo:%.o=%.c) +@end group +@end example + +@noindent +sets @samp{bar} to @samp{a.c b.c 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 +program 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 + + +@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). 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. + +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 + +The value in an ordinary assignment cannot contain a newline; but the +newlines that separate the lines of the value in a @code{define} become +part of the variable's value (except for the final newline which precedes +the @code{endef} and is not considered part of the value).@refill + +@need 800 +When used in a recipe, the previous example is functionally equivalent +to this: + +@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}). + +@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. 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 + +substitutes the string @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 + +The @code{file} function allows the makefile to write to 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 all cases the file is created if it does not +exist. + +The syntax of the @code{file} function is: + +@example +$(file @var{op} @var{filename}[,@var{text}]) +@end example + +The operator @var{op} can be either @code{>} which indicates overwrite +mode, or @code{>>} which indicates append mode. The @var{filename} +indicates the file to be written to. There may optionally be +whitespace between the operator and the file name. + +When the @code{file} function is expanded all its arguments are +expanded first, then the file indicated by @var{filename} will be +opened in the mode described by @var{op}. Finally @var{text} will be +written to the file. If @var{text} does not already end in a newline, +even if empty, a final newline will be written. If the @var{text} +argument is not given, nothing will be written. The result of +evaluating the @code{file} function is always the empty string. + +It is a fatal error if the file cannot be opened for writing, or if +the write operation fails. + +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}). + +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 --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. + +@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}. + +@c !!! The end of of this paragraph should be rewritten. --bob +Pattern rules may have more than one target. Unlike normal rules, +this does not act as many different rules with the same prerequisites +and recipe. If a pattern rule has multiple targets, @code{make} knows +that the rule's recipe is responsible for making all of the targets. +The recipe is executed only once to make all the targets. When +searching for a pattern rule to match a target, the target patterns of +a rule other than the one that matches the target in need of a rule +are incidental: @code{make} worries only about giving a recipe and +prerequisites to the file presently in question. However, when this +file's recipe is run, the other targets are marked as having been +updated themselves. +@cindex multiple targets, in pattern rule +@cindex target, multiple in pattern rule + +@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. 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. These variants are +semi-obsolete in GNU @code{make} since the functions @code{dir} and +@code{notdir} can be used to get a similar effect (@pxref{File Name +Functions, , Functions for File Names}). Note, however, that the +@samp{D} variants all omit the trailing slash which always appears in +the output of the @code{dir} function. Here is a table of the variants: + +@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 Features, Missing, Extending 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 obsolete.@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 +@appendixsec 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/doc/stamp-vti b/doc/stamp-vti new file mode 100644 index 0000000..c46333e --- /dev/null +++ b/doc/stamp-vti @@ -0,0 +1,4 @@ +@set UPDATED 5 October 2014 +@set UPDATED-MONTH October 2014 +@set EDITION 4.1 +@set VERSION 4.1 diff --git a/doc/version.texi b/doc/version.texi new file mode 100644 index 0000000..c46333e --- /dev/null +++ b/doc/version.texi @@ -0,0 +1,4 @@ +@set UPDATED 5 October 2014 +@set UPDATED-MONTH October 2014 +@set EDITION 4.1 +@set VERSION 4.1 diff --git a/dosbuild.bat b/dosbuild.bat new file mode 100644 index 0000000..fac2e88 --- /dev/null +++ b/dosbuild.bat @@ -0,0 +1,65 @@ +@echo off +rem Copyright (C) 1998-2014 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 + +rem Echo ON so they will see what is going on. +@echo on +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g commands.c -o commands.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g output.c -o output.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g job.c -o job.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g dir.c -o dir.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g file.c -o file.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g misc.c -o misc.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g main.c -o main.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -DINCLUDEDIR=\"c:/djgpp/include\" -O2 -g read.c -o read.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -DLIBDIR=\"c:/djgpp/lib\" -O2 -g remake.c -o remake.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g rule.c -o rule.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g implicit.c -o implicit.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g default.c -o default.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g variable.c -o variable.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g expand.c -o expand.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g function.c -o function.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g vpath.c -o vpath.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g hash.c -o hash.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g strcache.c -o strcache.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g version.c -o version.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g ar.c -o ar.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g arscan.c -o arscan.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g signame.c -o signame.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g remote-stub.c -o remote-stub.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g getopt.c -o getopt.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g getopt1.c -o getopt1.o +@cd glob +@if exist libglob.a del libglob.a +gcc -I. -c -DHAVE_CONFIG_H -I.. -O2 -g glob.c -o glob.o +gcc -I. -c -DHAVE_CONFIG_H -I.. -O2 -g fnmatch.c -o fnmatch.o +ar rv libglob.a glob.o fnmatch.o +@echo off +cd .. +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.$$$ +echo glob/libglob.a >> respf.$$$ +rem gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g guile.c -o guile.o +rem echo guile.o >> respf.$$$ +@echo Linking... +@echo on +gcc -o make.new @respf.$$$ +@if exist make.exe echo Make.exe is now built! +@if not exist make.exe echo Make.exe build failed... +@if exist make.exe del respf.$$$ diff --git a/expand.c b/expand.c new file mode 100644 index 0000000..1c87db1 --- /dev/null +++ b/expand.c @@ -0,0 +1,596 @@ +/* Variable expansion functions for GNU Make. +Copyright (C) 1988-2014 Free 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 gmk_floc **expanding_var = &reading_file; + +/* The next two describe the variable output buffer. + This buffer is used to hold the variable-expansion of a line of the + makefile. It is made bigger with realloc whenever it is too small. + variable_buffer_length is the size currently allocated. + variable_buffer is the address of the buffer. + + For efficiency, it's guaranteed that the buffer will always have + VARIABLE_BUFFER_ZONE extra bytes allocated. This allows you to add a few + extra chars without having to call a function. Note you should never use + these bytes unless you're _sure_ you have room (you know when the buffer + length was last checked. */ + +#define VARIABLE_BUFFER_ZONE 5 + +static unsigned int variable_buffer_length; +char *variable_buffer; + +/* Subroutine of variable_expand and friends: + The text to add is LENGTH chars starting at STRING to the variable_buffer. + The text is added to the buffer at PTR, and the updated pointer into + the buffer is returned as the value. Thus, the value returned by + each call to variable_buffer_output should be the first argument to + the following call. */ + +char * +variable_buffer_output (char *ptr, const char *string, unsigned int length) +{ + register unsigned int newlen = length + (ptr - variable_buffer); + + if ((newlen + VARIABLE_BUFFER_ZONE) > variable_buffer_length) + { + unsigned int offset = ptr - variable_buffer; + variable_buffer_length = (newlen + 100 > 2 * variable_buffer_length + ? newlen + 100 + : 2 * variable_buffer_length); + variable_buffer = xrealloc (variable_buffer, variable_buffer_length); + ptr = variable_buffer + offset; + } + + memcpy (ptr, string, length); + return ptr + length; +} + +/* Return a pointer to the beginning of the variable buffer. */ + +static char * +initialize_variable_output (void) +{ + /* If we don't have a variable output buffer yet, get one. */ + + if (variable_buffer == 0) + { + variable_buffer_length = 200; + variable_buffer = xmalloc (variable_buffer_length); + variable_buffer[0] = '\0'; + } + + return variable_buffer; +} + +/* 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 gmk_floc *this_var; + const gmk_floc **saved_varp; + struct variable_set_list *save = 0; + int set_reading = 0; + + /* Don't install a new location if this location is empty. + This can happen for command-line variables, builtin variables, etc. */ + saved_varp = expanding_var; + if (v->fileinfo.filenm) + { + this_var = &v->fileinfo; + expanding_var = &this_var; + } + + /* If we have no other file-reading context, use the variable's context. */ + if (!reading_file) + { + set_reading = 1; + reading_file = &v->fileinfo; + } + + if (v->expanding) + { + if (!v->exp_count) + /* Expanding V causes infinite recursion. Lose. */ + OS (fatal, *expanding_var, + _("Recursive variable '%s' references itself (eventually)"), + v->name); + --v->exp_count; + } + + if (file) + { + save = current_variable_set_list; + current_variable_set_list = file->variables; + } + + v->expanding = 1; + if (v->append) + value = allocated_variable_append (v); + else + value = allocated_variable_expand (v->value); + v->expanding = 0; + + if (set_reading) + reading_file = 0; + + if (file) + current_variable_set_list = save; + + expanding_var = saved_varp; + + return value; +} + +/* Expand a simple reference to variable NAME, which is LENGTH chars long. */ + +#ifdef __GNUC__ +__inline +#endif +static char * +reference_variable (char *o, const char *name, unsigned int length) +{ + struct variable *v; + char *value; + + v = lookup_variable (name, length); + + if (v == 0) + warn_undefined (name, length); + + /* If there's no variable by that name or it has no value, stop now. */ + if (v == 0 || (*v->value == '\0' && !v->append)) + return o; + + value = (v->recursive ? recursively_expand (v) : v->value); + + o = variable_buffer_output (o, value, strlen (value)); + + if (v->recursive) + free (value); + + return o; +} + +/* Scan STRING for variable references and expansion-function calls. Only + LENGTH bytes of STRING are actually scanned. If LENGTH is -1, scan until + a null byte is found. + + Write the results to LINE, which must point into 'variable_buffer'. If + LINE is NULL, start at the beginning of the buffer. + Return a pointer to LINE, or to the beginning of the buffer if LINE is + NULL. + */ +char * +variable_expand_string (char *line, const char *string, long length) +{ + struct variable *v; + const char *p, *p1; + char *save; + char *o; + unsigned int line_offset; + + if (!line) + line = initialize_variable_output (); + o = line; + line_offset = line - variable_buffer; + + if (length == 0) + { + variable_buffer_output (o, "", 1); + return (variable_buffer); + } + + /* We need a copy of STRING: due to eval, it's possible that it will get + freed as we process it (it might be the value of a variable that's reset + for example). Also having a nil-terminated string is handy. */ + save = length < 0 ? xstrdup (string) : xstrndup (string, length); + p = save; + + while (1) + { + /* Copy all following uninteresting chars all at once to the + variable output buffer, and skip them. Uninteresting chars end + at the next $ or the end of the input. */ + + p1 = strchr (p, '$'); + + o = variable_buffer_output (o, p, p1 != 0 ? (unsigned int)(p1 - p) : strlen (p) + 1); + + if (p1 == 0) + break; + p = p1 + 1; + + /* Dispatch on the char that follows the $. */ + + switch (*p) + { + case '$': + /* $$ seen means output one $ to the variable output buffer. */ + o = variable_buffer_output (o, p, 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; + + case '\0': + break; + + default: + if (isblank ((unsigned char)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, (long)-1); +} + +/* 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 gmk_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, unsigned int length, + const struct variable_set_list *set, int local) +{ + const struct variable *v; + char *buf = 0; + /* If this set is local and the next is not a parent, then next is local. */ + int nextlocal = local && set->next_is_parent == 0; + + /* If there's nothing left to check, return the empty buffer. */ + if (!set) + return initialize_variable_output (); + + /* Try to find the variable in this variable set. */ + v = lookup_variable_in_set (name, length, set->set); + + /* If there isn't one, or this one is private, try the set above us. */ + if (!v || (!local && v->private_var)) + return variable_append (name, length, set->next, nextlocal); + + /* If this variable type is append, first get any upper values. + If not, initialize the buffer. */ + if (v->append) + buf = variable_append (name, length, set->next, nextlocal); + else + buf = initialize_variable_output (); + + /* Append this value to the buffer, and return it. + If we already have a value, first add a space. */ + if (buf > variable_buffer) + buf = variable_buffer_output (buf, " ", 1); + + /* Either expand it or copy it, depending. */ + if (! v->recursive) + return variable_buffer_output (buf, v->value, strlen (v->value)); + + buf = variable_expand_string (buf, v->value, strlen (v->value)); + return (buf + strlen (buf)); +} + + +static char * +allocated_variable_append (const struct variable *v) +{ + char *val; + + /* Construct the appended variable value. */ + + char *obuf = variable_buffer; + unsigned int olen = variable_buffer_length; + + variable_buffer = 0; + + val = variable_append (v->name, strlen (v->name), + current_variable_set_list, 1); + variable_buffer_output (val, "", 1); + val = variable_buffer; + + variable_buffer = obuf; + variable_buffer_length = olen; + + return val; +} + +/* Like variable_expand_for_file, but the returned string is malloc'd. + This function is called a lot. It wants to be efficient. */ + +char * +allocated_variable_expand_for_file (const char *line, struct file *file) +{ + char *value; + + char *obuf = variable_buffer; + unsigned int olen = variable_buffer_length; + + variable_buffer = 0; + + value = variable_expand_for_file (line, file); + + variable_buffer = obuf; + variable_buffer_length = olen; + + return value; +} + +/* Install a new variable_buffer context, returning the current one for + safe-keeping. */ + +void +install_variable_buffer (char **bufp, unsigned int *lenp) +{ + *bufp = variable_buffer; + *lenp = variable_buffer_length; + + variable_buffer = 0; + initialize_variable_output (); +} + +/* Restore a previously-saved variable_buffer setting (free the current one). + */ + +void +restore_variable_buffer (char *buf, unsigned int len) +{ + free (variable_buffer); + + variable_buffer = buf; + variable_buffer_length = len; +} diff --git a/file.c b/file.c new file mode 100644 index 0000000..e1a8e80 --- /dev/null +++ b/file.c @@ -0,0 +1,1141 @@ +/* Target file management for GNU Make. +Copyright (C) 1988-2014 Free 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); +} + +#ifndef FILE_BUCKETS +#define FILE_BUCKETS 1007 +#endif +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; +#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS) + char *lname; +#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 +# 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; +#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(VMS) + name = "[]"; +#elif defined(_AMIGA) + name = ""; +#else + 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 (!silent_flag) + { + if (! doneany) + { + fputs ("rm ", stdout); + doneany = 1; + } + else + putchar (' '); + fputs (f->name, stdout); + fflush (stdout); + } + } + if (status < 0) + perror_with_name ("unlink: ", f->name); + } + } + } + + if (doneany && !sig) + { + putchar ('\n'); + fflush (stdout); + } +} + +/* Given a string containing prerequisites (fully expanded), break it up into + a struct dep list. Enter each of these prereqs into the file database. + */ +struct dep * +split_prereqs (char *p) +{ + struct dep *new = PARSE_FILE_SEQ (&p, struct dep, MAP_PIPE, NULL, + PARSEFS_NONE); + + if (*p) + { + /* Files that follow '|' are "order-only" prerequisites that satisfy the + dependency by existing: their modification times are irrelevant. */ + struct dep *ood; + + ++p; + ood = PARSE_SIMPLE_SEQ (&p, struct dep); + + if (! new) + new = ood; + else + { + struct dep *dp; + for (dp = new; dp->next != NULL; dp = dp->next) + ; + dp->next = ood; + } + + for (; ood != NULL; ood = ood->next) + ood->ignore_mtime = 1; + } + + return new; +} + +/* Given a list of prerequisites, enter them into the file database. + If STEM is set then first expand patterns using STEM. */ +struct dep * +enter_prereqs (struct dep *deps, const char *stem) +{ + struct dep *d1; + + if (deps == 0) + return 0; + + /* If we have a stem, expand the %'s. We use patsubst_expand to translate + the prerequisites' patterns into plain prerequisite names. */ + if (stem) + { + const char *pattern = "%"; + char *buffer = variable_expand (""); + struct dep *dp = deps, *dl = 0; + + while (dp != 0) + { + char *percent; + int nl = strlen (dp->name) + 1; + char *nm = alloca (nl); + memcpy (nm, dp->name, nl); + percent = find_percent (nm); + if (percent) + { + char *o; + + /* We have to handle empty stems specially, because that + would be equivalent to $(patsubst %,dp->name,) which + will always be empty. */ + if (stem[0] == '\0') + { + memmove (percent, percent+1, strlen (percent)); + o = variable_buffer_output (buffer, nm, strlen (nm) + 1); + } + else + o = patsubst_expand_pat (buffer, stem, pattern, nm, + pattern+1, percent+1); + + /* If the name expanded to the empty string, ignore it. */ + if (buffer[0] == '\0') + { + struct dep *df = dp; + if (dp == deps) + dp = deps = deps->next; + else + dp = dl->next = dp->next; + free_dep (df); + continue; + } + + /* Save the name. */ + dp->name = strcache_add_len (buffer, o - buffer); + } + dp->stem = stem; + dp->staticpattern = 1; + dl = dp; + dp = dp->next; + } + } + + /* Enter them as files, unless they need a 2nd expansion. */ + for (d1 = deps; d1 != 0; d1 = d1->next) + { + if (d1->need_2nd_expansion) + continue; + + d1->file = lookup_file (d1->name); + if (d1->file == 0) + d1->file = enter_file (d1->name); + d1->staticpattern = 0; + d1->name = 0; + } + + return deps; +} + +/* Set the intermediate flag. */ + +static void +set_intermediate (const void *item) +{ + struct file *f = (struct file *) item; + f->intermediate = 1; +} + +/* Expand and parse each dependency line. */ +static void +expand_deps (struct file *f) +{ + struct dep *d; + struct dep **dp; + const char *file_stem = f->stem; + int initialized = 0; + + f->updating = 0; + + /* Walk through the dependencies. For any dependency that needs 2nd + expansion, expand it then insert the result into the list. */ + dp = &f->deps; + d = f->deps; + while (d != 0) + { + char *p; + struct dep *new, *next; + char *name = (char *)d->name; + + if (! d->name || ! d->need_2nd_expansion) + { + /* This one is all set already. */ + dp = &d->next; + d = d->next; + continue; + } + + /* If it's from a static pattern rule, convert the patterns into + "$*" so they'll expand properly. */ + if (d->staticpattern) + { + char *o = variable_expand (""); + o = subst_expand (o, name, "%", "$*", 1, 2, 0); + *o = '\0'; + free (name); + d->name = name = xstrdup (variable_buffer); + d->staticpattern = 0; + } + + /* We're going to do second expansion so initialize file variables for + the file. Since the stem for static pattern rules comes from + individual dep lines, we will temporarily set f->stem to d->stem. */ + if (!initialized) + { + initialize_file_variables (f, 0); + initialized = 1; + } + + if (d->stem != 0) + f->stem = d->stem; + + set_file_variables (f); + + p = variable_expand_for_file (d->name, f); + + if (d->stem != 0) + f->stem = file_stem; + + /* At this point we don't need the name anymore: free it. */ + free (name); + + /* Parse the prerequisites and enter them into the file database. */ + new = enter_prereqs (split_prereqs (p), d->stem); + + /* If there were no prereqs here (blank!) then throw this one out. */ + if (new == 0) + { + *dp = d->next; + free_dep (d); + d = *dp; + continue; + } + + /* Add newly parsed prerequisites. */ + next = d->next; + *dp = new; + for (dp = &new->next, d = new->next; d != 0; dp = &d->next, d = d->next) + ; + *dp = next; + d = *dp; + } +} + +/* Reset the updating flag. */ + +static void +reset_updating (const void *item) +{ + struct file *f = (struct file *) item; + f->updating = 0; +} + +/* For each dependency of each file, make the 'struct dep' point + at the appropriate 'struct file' (which may have to be created). + + Also mark the files depended on by .PRECIOUS, .PHONY, .SILENT, + and various other special targets. */ + +void +snap_deps (void) +{ + struct file *f; + struct file *f2; + struct dep *d; + + /* Remember that we've done this. Once we start snapping deps we can no + longer define new targets. */ + snapped_deps = 1; + + /* Perform second expansion and enter each dependency name as a file. We + must use hash_dump() here because within these loops we likely add new + files to the table, possibly causing an in-situ table expansion. + + We only need to do this if second_expansion has been defined; if it + hasn't then all deps were expanded as the makefile was read in. If we + ever change make to be able to unset .SECONDARY_EXPANSION this will have + to change. */ + + if (second_expansion) + { + struct file **file_slot_0 = (struct file **) hash_dump (&files, 0, 0); + struct file **file_end = file_slot_0 + files.ht_fill; + struct file **file_slot; + const char *suffixes; + + /* Expand .SUFFIXES: its prerequisites are used for $$* calc. */ + f = lookup_file (".SUFFIXES"); + suffixes = f ? f->name : 0; + for (; f != 0; f = f->prev) + expand_deps (f); + + /* For every target that's not .SUFFIXES, expand its prerequisites. */ + + for (file_slot = file_slot_0; file_slot < file_end; file_slot++) + for (f = *file_slot; f != 0; f = f->prev) + if (f->name != suffixes) + expand_deps (f); + free (file_slot_0); + } + else + /* We're not doing second expansion, so reset updating. */ + hash_map (&files, reset_updating); + + /* Now manage all the special targets. */ + + for (f = lookup_file (".PRECIOUS"); f != 0; f = f->prev) + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->precious = 1; + + for (f = lookup_file (".LOW_RESOLUTION_TIME"); f != 0; f = f->prev) + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->low_resolution_time = 1; + + for (f = lookup_file (".PHONY"); f != 0; f = f->prev) + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + { + /* Mark this file as phony nonexistent target. */ + f2->phony = 1; + f2->is_target = 1; + f2->last_mtime = NONEXISTENT_MTIME; + f2->mtime_before_update = NONEXISTENT_MTIME; + } + + for (f = lookup_file (".INTERMEDIATE"); f != 0; f = f->prev) + /* Mark .INTERMEDIATE deps as intermediate files. */ + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->intermediate = 1; + /* .INTERMEDIATE with no deps does nothing. + Marking all files as intermediates is useless since the goal targets + would be deleted after they are built. */ + + for (f = lookup_file (".SECONDARY"); f != 0; f = f->prev) + /* Mark .SECONDARY deps as both intermediate and secondary. */ + if (f->deps) + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->intermediate = f2->secondary = 1; + /* .SECONDARY with no deps listed marks *all* files that way. */ + else + { + all_secondary = 1; + hash_map (&files, set_intermediate); + } + + f = lookup_file (".EXPORT_ALL_VARIABLES"); + if (f != 0 && f->is_target) + export_all_variables = 1; + + f = lookup_file (".IGNORE"); + if (f != 0 && f->is_target) + { + if (f->deps == 0) + ignore_errors_flag = 1; + else + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->command_flags |= COMMANDS_NOERROR; + } + + f = lookup_file (".SILENT"); + if (f != 0 && f->is_target) + { + if (f->deps == 0) + silent_flag = 1; + else + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->command_flags |= COMMANDS_SILENT; + } + + f = lookup_file (".NOTPARALLEL"); + if (f != 0 && f->is_target) + not_parallel = 1; + +#ifndef NO_MINUS_C_MINUS_O + /* If .POSIX was defined, remove OUTPUT_OPTION to comply. */ + /* This needs more work: what if the user sets this in the makefile? + if (posix_pedantic) + define_variable_cname ("OUTPUT_OPTION", "", o_default, 1); + */ +#endif +} + +/* Set the 'command_state' member of FILE and all its 'also_make's. */ + +void +set_command_state (struct file *file, enum cmd_state state) +{ + struct dep *d; + + file->command_state = state; + + for (d = file->also_make; d != 0; d = d->next) + d->file->command_state = state; +} + +/* 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) + { + unsigned long max = EXPANSION_INCREMENT (strlen (value)); + unsigned long len; + char *p; + struct file **fp = (struct file **) files.ht_vec; + struct file **end = &fp[files.ht_size]; + + /* Make sure we have at least MAX bytes in the allocated buffer. */ + value = xrealloc (value, max); + + p = value; + len = 0; + for (; fp < end; ++fp) + if (!HASH_VACANT (*fp) && (*fp)->is_target) + { + struct file *f = *fp; + int l = strlen (f->name); + + len += l + 1; + if (len > max) + { + unsigned long off = p - value; + + max += EXPANSION_INCREMENT (l + 1); + value = xrealloc (value, max); + p = &value[off]; + } + + memcpy (p, f->name, l); + p += l; + *(p++) = ' '; + } + *(p-1) = '\0'; + + last_targ_count = files.ht_fill; + } + + return value; +} + +void +init_hash_files (void) +{ + hash_init (&files, 1000, file_hash_1, file_hash_2, file_hash_cmp); +} + +/* EOF */ diff --git a/filedef.h b/filedef.h new file mode 100644 index 0000000..b8973db --- /dev/null +++ b/filedef.h @@ -0,0 +1,209 @@ +/* Definition of target file data structures for GNU Make. +Copyright (C) 1988-2014 Free 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 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. */ + int command_flags; /* Flags OR'd in for cmds; see commands.h. */ + enum update_status /* Status of the last attempt to update. */ + { + us_success = 0, /* Successfully updated. Must be 0! */ + us_none, /* No attempt to update has been made. */ + us_question, /* Needs to be updated (-q is is set). */ + us_failed /* Update failed. */ + } update_status ENUM_BITFIELD (2); + enum cmd_state /* State of the commands. */ + { + cs_not_started = 0, /* Not yet started. Must be 0! */ + cs_deps_running, /* Dep commands running. */ + cs_running, /* Commands running. */ + cs_finished /* Commands finished. */ + } command_state ENUM_BITFIELD (2); + + unsigned int builtin:1; /* True if the file is a builtin rule. */ + unsigned int precious:1; /* Non-0 means don't delete file on quit */ + unsigned int loaded:1; /* True if the file is a loaded object. */ + unsigned int low_resolution_time:1; /* Nonzero if this file's time stamp + has only one-second resolution. */ + unsigned int tried_implicit:1; /* Nonzero if have searched + for implicit rule for making + this file; don't search again. */ + unsigned int updating:1; /* Nonzero while updating deps of this file */ + unsigned int updated:1; /* Nonzero if this file has been remade. */ + unsigned int is_target:1; /* Nonzero if file is described as target. */ + unsigned int cmd_target:1; /* Nonzero if file was given on cmd line. */ + unsigned int phony:1; /* Nonzero if this is a phony file + i.e., a prerequisite of .PHONY. */ + unsigned int intermediate:1;/* Nonzero if this is an intermediate file. */ + unsigned int secondary:1; /* Nonzero means remove_intermediates should + not delete it. */ + unsigned int dontcare:1; /* Nonzero if no complaint is to be made if + this target cannot be remade. */ + unsigned int ignore_vpath:1;/* Nonzero if we threw out VPATH name. */ + unsigned int pat_searched:1;/* Nonzero if we already searched for + pattern-specific variables. */ + unsigned int considered:1; /* equal to 'considered' if file has been + considered on current scan of goal chain */ + unsigned int no_diag:1; /* True if the file failed to update and no + diagnostics has been issued (dontcare). */ + }; + + +extern struct file *suffix_file, *default_file; + + +struct file *lookup_file (const char *name); +struct file *enter_file (const char *name); +struct dep *split_prereqs (char *prereqstr); +struct dep *enter_prereqs (struct dep *prereqs, const char *stem); +void remove_intermediates (int sig); +void snap_deps (void); +void rename_file (struct file *file, const char *name); +void rehash_file (struct file *file, const char *name); +void set_command_state (struct file *file, enum cmd_state state); +void notice_finished_file (struct file *file); +void init_hash_files (void); +char *build_target_list (char *old_list); +void print_prereqs (const struct dep *deps); +void print_file_data_base (void); + +#if FILE_TIMESTAMP_HI_RES +# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \ + file_timestamp_cons (fname, (st).st_mtime, (st).ST_MTIM_NSEC) +#else +# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \ + file_timestamp_cons (fname, (st).st_mtime, 0) +#endif + +/* If FILE_TIMESTAMP is 64 bits (or more), use nanosecond resolution. + (Multiply by 2**30 instead of by 10**9 to save time at the cost of + slightly decreasing the number of available timestamps.) With + 64-bit FILE_TIMESTAMP, this stops working on 2514-05-30 01:53:04 + UTC, but by then uintmax_t should be larger than 64 bits. */ +#define FILE_TIMESTAMPS_PER_S (FILE_TIMESTAMP_HI_RES ? 1000000000 : 1) +#define FILE_TIMESTAMP_LO_BITS (FILE_TIMESTAMP_HI_RES ? 30 : 0) + +#define FILE_TIMESTAMP_S(ts) (((ts) - ORDINARY_MTIME_MIN) \ + >> FILE_TIMESTAMP_LO_BITS) +#define FILE_TIMESTAMP_NS(ts) ((int) (((ts) - ORDINARY_MTIME_MIN) \ + & ((1 << FILE_TIMESTAMP_LO_BITS) - 1))) + +/* Upper bound on length of string "YYYY-MM-DD HH:MM:SS.NNNNNNNNN" + representing a file timestamp. The upper bound is not necessarily 29, + since the year might be less than -999 or greater than 9999. + + Subtract one for the sign bit if in case file timestamps can be negative; + subtract FLOOR_LOG2_SECONDS_PER_YEAR to yield an upper bound on how many + file timestamp bits might affect the year; + 302 / 1000 is log10 (2) rounded up; + add one for integer division truncation; + add one more for a minus sign if file timestamps can be negative; + add 4 to allow for any 4-digit epoch year (e.g. 1970); + add 25 to allow for "-MM-DD HH:MM:SS.NNNNNNNNN". */ +#define FLOOR_LOG2_SECONDS_PER_YEAR 24 +#define FILE_TIMESTAMP_PRINT_LEN_BOUND \ + (((sizeof (FILE_TIMESTAMP) * CHAR_BIT - 1 - FLOOR_LOG2_SECONDS_PER_YEAR) \ + * 302 / 1000) \ + + 1 + 1 + 4 + 25) + +FILE_TIMESTAMP file_timestamp_cons (char const *, time_t, long int); +FILE_TIMESTAMP file_timestamp_now (int *); +void file_timestamp_sprintf (char *p, FILE_TIMESTAMP ts); + +/* Return the mtime of file F (a struct file *), caching it. + The value is NONEXISTENT_MTIME if the file does not exist. */ +#define file_mtime(f) file_mtime_1 ((f), 1) +/* Return the mtime of file F (a struct file *), caching it. + Don't search using vpath for the file--if it doesn't actually exist, + we don't find it. + The value is NONEXISTENT_MTIME if the file does not exist. */ +#define file_mtime_no_search(f) file_mtime_1 ((f), 0) +FILE_TIMESTAMP f_mtime (struct file *file, int search); +#define file_mtime_1(f, v) \ + ((f)->last_mtime == UNKNOWN_MTIME ? f_mtime ((f), v) : (f)->last_mtime) + +/* Special timestamp values. */ + +/* The file's timestamp is not yet known. */ +#define UNKNOWN_MTIME 0 + +/* The file does not exist. */ +#define NONEXISTENT_MTIME 1 + +/* The file does not exist, and we assume that it is older than any + actual file. */ +#define OLD_MTIME 2 + +/* The smallest and largest ordinary timestamps. */ +#define ORDINARY_MTIME_MIN (OLD_MTIME + 1) +#define ORDINARY_MTIME_MAX ((FILE_TIMESTAMP_S (NEW_MTIME) \ + << FILE_TIMESTAMP_LO_BITS) \ + + ORDINARY_MTIME_MIN + FILE_TIMESTAMPS_PER_S - 1) + +/* Modtime value to use for 'infinitely new'. We used to get the current time + from the system and use that whenever we wanted 'new'. But that causes + trouble when the machine running make and the machine holding a file have + different ideas about what time it is; and can also lose for 'force' + targets, which need to be considered newer than anything that depends on + them, even if said dependents' modtimes are in the future. */ +#define NEW_MTIME INTEGER_TYPE_MAXIMUM (FILE_TIMESTAMP) + +#define check_renamed(file) \ + while ((file)->renamed != 0) (file) = (file)->renamed /* No ; here. */ + +/* Have we snapped deps yet? */ +extern int snapped_deps; diff --git a/function.c b/function.c new file mode 100644 index 0000000..169c3a1 --- /dev/null +++ b/function.c @@ -0,0 +1,2623 @@ +/* Builtin function expansion for GNU Make. +Copyright (C) 1988-2014 Free 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 "commands.h" +#include "debug.h" + +#ifdef _AMIGA +#include "amiga.h" +#endif + + +struct function_table_entry + { + union { + char *(*func_ptr) (char *output, char **argv, const char *fname); + gmk_func_ptr alloc_func_ptr; + } fptr; + const char *name; + unsigned char len; + unsigned char minimum_args; + unsigned char maximum_args; + unsigned char expand_args:1; + unsigned char alloc_fn:1; + }; + +static unsigned long +function_table_entry_hash_1 (const void *keyv) +{ + const struct function_table_entry *key = keyv; + return_STRING_N_HASH_1 (key->name, key->len); +} + +static unsigned long +function_table_entry_hash_2 (const void *keyv) +{ + const struct function_table_entry *key = keyv; + return_STRING_N_HASH_2 (key->name, key->len); +} + +static int +function_table_entry_hash_cmp (const void *xv, const void *yv) +{ + const struct function_table_entry *x = xv; + const struct function_table_entry *y = yv; + int result = x->len - y->len; + if (result) + return result; + return_STRING_N_COMPARE (x->name, y->name, x->len); +} + +static struct hash_table function_table; + + +/* Store into VARIABLE_BUFFER at O the result of scanning TEXT and replacing + each occurrence of SUBST with REPLACE. TEXT is null-terminated. SLEN is + the length of SUBST and RLEN is the length of REPLACE. If BY_WORD is + nonzero, substitutions are done only on matches which are complete + whitespace-delimited words. */ + +char * +subst_expand (char *o, const char *text, const char *subst, const char *replace, + unsigned int slen, unsigned int rlen, int by_word) +{ + const char *t = text; + const char *p; + + if (slen == 0 && !by_word) + { + /* The first occurrence of "" in any string is its end. */ + o = variable_buffer_output (o, t, strlen (t)); + if (rlen > 0) + o = variable_buffer_output (o, replace, rlen); + return o; + } + + do + { + if (by_word && slen == 0) + /* When matching by words, the empty string should match + the end of each word, rather than the end of the whole text. */ + p = end_of_token (next_token (t)); + else + { + p = strstr (t, subst); + if (p == 0) + { + /* No more matches. Output everything left on the end. */ + o = variable_buffer_output (o, t, strlen (t)); + return o; + } + } + + /* Output everything before this occurrence of the string to replace. */ + if (p > t) + o = variable_buffer_output (o, t, p - t); + + /* If we're substituting only by fully matched words, + or only at the ends of words, check that this case qualifies. */ + if (by_word + && ((p > text && !isblank ((unsigned char)p[-1])) + || ! STOP_SET (p[slen], MAP_BLANK|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) +{ + unsigned int pattern_prepercent_len, pattern_postpercent_len; + unsigned int replace_prepercent_len, replace_postpercent_len; + const char *t; + unsigned int len; + int doneany = 0; + + /* Record the length of REPLACE before and after the % so we don't have to + compute these lengths more than once. */ + if (replace_percent) + { + replace_prepercent_len = replace_percent - replace - 1; + replace_postpercent_len = strlen (replace_percent); + } + else + { + replace_prepercent_len = strlen (replace); + replace_postpercent_len = 0; + } + + if (!pattern_percent) + /* With no % in the pattern, this is just a simple substitution. */ + return subst_expand (o, text, pattern, replace, + strlen (pattern), strlen (replace), 1); + + /* Record the length of PATTERN before and after the % + so we don't have to compute it more than once. */ + pattern_prepercent_len = pattern_percent - pattern - 1; + pattern_postpercent_len = strlen (pattern_percent); + + while ((t = find_next_token (&text, &len)) != 0) + { + int fail = 0; + + /* Is it big enough to match? */ + if (len < pattern_prepercent_len + pattern_postpercent_len) + fail = 1; + + /* Does the prefix match? */ + if (!fail && pattern_prepercent_len > 0 + && (*t != *pattern + || t[pattern_prepercent_len - 1] != pattern_percent[-2] + || !strneq (t + 1, pattern + 1, pattern_prepercent_len - 1))) + fail = 1; + + /* Does the suffix match? */ + if (!fail && pattern_postpercent_len > 0 + && (t[len - 1] != pattern_percent[pattern_postpercent_len - 1] + || t[len - pattern_postpercent_len] != *pattern_percent + || !strneq (&t[len - pattern_postpercent_len], + pattern_percent, pattern_postpercent_len - 1))) + fail = 1; + + if (fail) + /* It didn't match. Output the string. */ + o = variable_buffer_output (o, t, len); + else + { + /* It matched. Output the replacement. */ + + /* Output the part of the replacement before the %. */ + o = variable_buffer_output (o, replace, replace_prepercent_len); + + if (replace_percent != 0) + { + /* Output the part of the matched string that + matched the % in the pattern. */ + o = variable_buffer_output (o, t + pattern_prepercent_len, + len - (pattern_prepercent_len + + pattern_postpercent_len)); + /* Output the part of the replacement after the %. */ + o = variable_buffer_output (o, replace_percent, + replace_postpercent_len); + } + } + + /* Output a space, but not if the replacement is "". */ + if (fail || replace_prepercent_len > 0 + || (replace_percent != 0 && len + replace_postpercent_len > 0)) + { + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + } + if (doneany) + /* Kill the last space. */ + --o; + + return o; +} + +/* Store into VARIABLE_BUFFER at O the result of scanning TEXT + and replacing strings matching PATTERN with REPLACE. + If PATTERN_PERCENT is not nil, PATTERN has already been + run through find_percent, and PATTERN_PERCENT is the result. + If REPLACE_PERCENT is not nil, REPLACE has already been + run through find_percent, and REPLACE_PERCENT is the result. + Note that we expect PATTERN_PERCENT and REPLACE_PERCENT to point to the + character _AFTER_ the %, not to the % itself. +*/ + +char * +patsubst_expand (char *o, const char *text, char *pattern, char *replace) +{ + const char *pattern_percent = find_percent (pattern); + const char *replace_percent = find_percent (replace); + + /* If there's a percent in the pattern or replacement skip it. */ + if (replace_percent) + ++replace_percent; + if (pattern_percent) + ++pattern_percent; + + return patsubst_expand_pat (o, text, pattern, replace, + pattern_percent, replace_percent); +} + + +/* Look up a function by name. */ + +static const struct function_table_entry * +lookup_function (const char *s) +{ + struct function_table_entry function_table_entry_key; + const char *e = s; + + while (STOP_SET (*e, MAP_USERFUNC)) + e++; + + if (e == s || !STOP_SET(*e, MAP_NUL|MAP_SPACE)) + return NULL; + + function_table_entry_key.name = s; + function_table_entry_key.len = e - s; + + return hash_find_item (&function_table, &function_table_entry_key); +} + + +/* Return 1 if PATTERN matches STR, 0 if not. */ + +int +pattern_matches (const char *pattern, const char *percent, const char *str) +{ + unsigned int sfxlen, strlength; + + if (percent == 0) + { + unsigned int len = strlen (pattern) + 1; + char *new_chars = alloca (len); + memcpy (new_chars, pattern, len); + percent = find_percent (new_chars); + if (percent == 0) + return streq (new_chars, str); + pattern = new_chars; + } + + sfxlen = strlen (percent + 1); + strlength = strlen (str); + + if (strlength < (percent - pattern) + sfxlen + || !strneq (pattern, str, percent - pattern)) + return 0; + + return !strcmp (percent + 1, str + (strlength - sfxlen)); +} + + +/* Find the next comma or ENDPAREN (counting nested STARTPAREN and + ENDPARENtheses), starting at PTR before END. Return a pointer to + next character. + + If no next argument is found, return NULL. +*/ + +static char * +find_next_argument (char startparen, char endparen, + const char *ptr, const char *end) +{ + int count = 0; + + for (; ptr < end; ++ptr) + if (*ptr == startparen) + ++count; + + else if (*ptr == endparen) + { + --count; + if (count < 0) + return NULL; + } + + else if (*ptr == ',' && !count) + return (char *)ptr; + + /* We didn't find anything. */ + return NULL; +} + + +/* Glob-expand LINE. The returned pointer is + only good until the next call to string_glob. */ + +static char * +string_glob (char *line) +{ + static char *result = 0; + static unsigned int length; + struct nameseq *chain; + unsigned int idx; + + chain = PARSE_FILE_SEQ (&line, struct nameseq, MAP_NUL, NULL, + /* We do not want parse_file_seq to strip './'s. + That would break examples like: + $(patsubst ./%.c,obj/%.o,$(wildcard ./?*.c)). */ + PARSEFS_NOSTRIP|PARSEFS_NOCACHE|PARSEFS_EXISTS); + + if (result == 0) + { + length = 100; + result = xmalloc (100); + } + + idx = 0; + while (chain != 0) + { + struct nameseq *next = chain->next; + unsigned int len = strlen (chain->name); + + if (idx + len + 1 > length) + { + length += (len + 1) * 2; + result = xrealloc (result, length); + } + memcpy (&result[idx], chain->name, len); + idx += len; + result[idx++] = ' '; + + /* Because we used PARSEFS_NOCACHE above, we have to free() NAME. */ + free ((char *)chain->name); + free (chain); + chain = next; + } + + /* Kill the last space and terminate the string. */ + if (idx == 0) + result[0] = '\0'; + else + result[idx - 1] = '\0'; + + return result; +} + +/* + Builtin functions + */ + +static char * +func_patsubst (char *o, char **argv, const char *funcname UNUSED) +{ + o = patsubst_expand (o, argv[2], argv[0], argv[1]); + return o; +} + + +static char * +func_join (char *o, char **argv, const char *funcname UNUSED) +{ + int doneany = 0; + + /* Write each word of the first argument directly followed + by the corresponding word of the second argument. + If the two arguments have a different number of words, + the excess words are just output separated by blanks. */ + const char *tp; + const char *pp; + const char *list1_iterator = argv[0]; + const char *list2_iterator = argv[1]; + do + { + unsigned int len1, len2; + + tp = find_next_token (&list1_iterator, &len1); + if (tp != 0) + o = variable_buffer_output (o, tp, len1); + + pp = find_next_token (&list2_iterator, &len2); + if (pp != 0) + o = variable_buffer_output (o, pp, len2); + + if (tp != 0 || pp != 0) + { + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + } + while (tp != 0 || pp != 0); + if (doneany) + /* Kill the last blank. */ + --o; + + return o; +} + + +static char * +func_origin (char *o, char **argv, const char *funcname UNUSED) +{ + /* Expand the argument. */ + struct variable *v = lookup_variable (argv[0], strlen (argv[0])); + if (v == 0) + o = variable_buffer_output (o, "undefined", 9); + else + switch (v->origin) + { + default: + case o_invalid: + abort (); + break; + case o_default: + o = variable_buffer_output (o, "default", 7); + break; + case o_env: + o = variable_buffer_output (o, "environment", 11); + break; + case o_file: + o = variable_buffer_output (o, "file", 4); + break; + case o_env_override: + o = variable_buffer_output (o, "environment override", 20); + break; + case o_command: + o = variable_buffer_output (o, "command line", 12); + break; + case o_override: + o = variable_buffer_output (o, "override", 8); + break; + case o_automatic: + o = variable_buffer_output (o, "automatic", 9); + break; + } + + return o; +} + +static char * +func_flavor (char *o, char **argv, const char *funcname UNUSED) +{ + struct variable *v = lookup_variable (argv[0], strlen (argv[0])); + + if (v == 0) + o = variable_buffer_output (o, "undefined", 9); + else + if (v->recursive) + o = variable_buffer_output (o, "recursive", 9); + else + o = variable_buffer_output (o, "simple", 6); + + return o; +} + + +static char * +func_notdir_suffix (char *o, char **argv, const char *funcname) +{ + /* Expand the argument. */ + const char *list_iterator = argv[0]; + const char *p2; + int doneany =0; + unsigned int len=0; + + int is_suffix = funcname[0] == 's'; + int is_notdir = !is_suffix; + int stop = MAP_DIRSEP | (is_suffix ? MAP_DOT : 0); +#ifdef VMS + /* For VMS list_iterator points to a comma separated list. To use the common + [find_]next_token, create a local copy and replace the commas with + spaces. Obviously, there is a problem if there is a ',' in the VMS filename + (can only happen on ODS5), the same problem as with spaces in filenames, + which seems to be present in make on all platforms. */ + char *vms_list_iterator = alloca(strlen(list_iterator) + 1); + int i; + for (i = 0; list_iterator[i]; i++) + if (list_iterator[i] == ',') + vms_list_iterator[i] = ' '; + else + vms_list_iterator[i] = list_iterator[i]; + vms_list_iterator[i] = list_iterator[i]; + while ((p2 = find_next_token((const char**) &vms_list_iterator, &len)) != 0) +#else + while ((p2 = find_next_token (&list_iterator, &len)) != 0) +#endif + { + const char *p = p2 + len - 1; + + while (p >= p2 && ! STOP_SET (*p, stop)) + --p; + + if (p >= p2) + { + if (is_notdir) + ++p; + else if (*p != '.') + continue; + o = variable_buffer_output (o, p, len - (p - p2)); + } +#ifdef HAVE_DOS_PATHS + /* Handle the case of "d:foo/bar". */ + else if (is_notdir && p2[0] && p2[1] == ':') + { + p = p2 + 2; + o = variable_buffer_output (o, p, len - (p - p2)); + } +#endif + else if (is_notdir) + o = variable_buffer_output (o, p2, len); + + if (is_notdir || p >= p2) + { +#ifdef VMS + o = variable_buffer_output (o, ",", 1); +#else + o = variable_buffer_output (o, " ", 1); +#endif + doneany = 1; + } + } + + if (doneany) + /* Kill last space. */ + --o; + + return o; +} + + +static char * +func_basename_dir (char *o, char **argv, const char *funcname) +{ + /* Expand the argument. */ + const char *p3 = argv[0]; + const char *p2; + int doneany = 0; + unsigned int len = 0; + + int is_basename = funcname[0] == 'b'; + int is_dir = !is_basename; + int stop = MAP_DIRSEP | (is_basename ? MAP_DOT : 0) | MAP_NUL; +#ifdef VMS + /* As in func_notdir_suffix ... */ + char *vms_p3 = alloca(strlen(p3) + 1); + int i; + for (i = 0; p3[i]; i++) + if (p3[i] == ',') + vms_p3[i] = ' '; + else + vms_p3[i] = p3[i]; + vms_p3[i] = p3[i]; + while ((p2 = find_next_token((const char**) &vms_p3, &len)) != 0) +#else + while ((p2 = find_next_token (&p3, &len)) != 0) +#endif + { + const char *p = p2 + len - 1; + while (p >= p2 && ! STOP_SET (*p, stop)) + --p; + + if (p >= p2 && (is_dir)) + o = variable_buffer_output (o, p2, ++p - p2); + else if (p >= p2 && (*p == '.')) + o = variable_buffer_output (o, p2, p - p2); +#ifdef HAVE_DOS_PATHS + /* Handle the "d:foobar" case */ + else if (p2[0] && p2[1] == ':' && is_dir) + o = variable_buffer_output (o, p2, 2); +#endif + else if (is_dir) +#ifdef VMS + 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 + o = variable_buffer_output (o, ",", 1); +#else + o = variable_buffer_output (o, " ", 1); +#endif + doneany = 1; + } + + if (doneany) + /* Kill last space. */ + --o; + + return o; +} + +static char * +func_addsuffix_addprefix (char *o, char **argv, const char *funcname) +{ + int fixlen = strlen (argv[0]); + const char *list_iterator = argv[1]; + int is_addprefix = funcname[3] == 'p'; + int is_addsuffix = !is_addprefix; + + int doneany = 0; + const char *p; + unsigned int len; + + while ((p = find_next_token (&list_iterator, &len)) != 0) + { + if (is_addprefix) + o = variable_buffer_output (o, argv[0], fixlen); + o = variable_buffer_output (o, p, len); + if (is_addsuffix) + o = variable_buffer_output (o, argv[0], fixlen); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + + if (doneany) + /* Kill last space. */ + --o; + + return o; +} + +static char * +func_subst (char *o, char **argv, const char *funcname UNUSED) +{ + o = subst_expand (o, argv[2], argv[0], argv[1], strlen (argv[0]), + strlen (argv[1]), 0); + + return o; +} + + +static char * +func_firstword (char *o, char **argv, const char *funcname UNUSED) +{ + unsigned int i; + const char *words = argv[0]; /* Use a temp variable for find_next_token */ + const char *p = find_next_token (&words, &i); + + if (p != 0) + o = variable_buffer_output (o, p, i); + + return o; +} + +static char * +func_lastword (char *o, char **argv, const char *funcname UNUSED) +{ + unsigned int i; + const char *words = argv[0]; /* Use a temp variable for find_next_token */ + const char *p = NULL; + const char *t; + + while ((t = find_next_token (&words, &i))) + p = t; + + if (p != 0) + o = variable_buffer_output (o, p, i); + + return o; +} + +static char * +func_words (char *o, char **argv, const char *funcname UNUSED) +{ + int i = 0; + const char *word_iterator = argv[0]; + char buf[20]; + + while (find_next_token (&word_iterator, NULL) != 0) + ++i; + + sprintf (buf, "%d", i); + o = variable_buffer_output (o, buf, strlen (buf)); + + return o; +} + +/* Set begpp to point to the first non-whitespace character of the string, + * and endpp to point to the last non-whitespace character of the string. + * If the string is empty or contains nothing but whitespace, endpp will be + * begpp-1. + */ +char * +strip_whitespace (const char **begpp, const char **endpp) +{ + while (*begpp <= *endpp && isspace ((unsigned char)**begpp)) + (*begpp) ++; + while (*endpp >= *begpp && isspace ((unsigned char)**endpp)) + (*endpp) --; + return (char *)*begpp; +} + +static void +check_numeric (const char *s, const char *msg) +{ + const char *end = s + strlen (s) - 1; + const char *beg = s; + strip_whitespace (&s, &end); + + for (; s <= end; ++s) + if (!ISDIGIT (*s)) /* ISDIGIT only evals its arg once: see makeint.h. */ + break; + + if (s <= end || end - beg < 0) + OSS (fatal, *expanding_var, "%s: '%s'", msg, beg); +} + + + +static char * +func_word (char *o, char **argv, const char *funcname UNUSED) +{ + const char *end_p; + const char *p; + int i; + + /* Check the first argument. */ + check_numeric (argv[0], _("non-numeric first argument to 'word' function")); + i = atoi (argv[0]); + + if (i == 0) + O (fatal, *expanding_var, + _("first argument to 'word' function must be greater than 0")); + + end_p = argv[1]; + while ((p = find_next_token (&end_p, 0)) != 0) + if (--i == 0) + break; + + if (i == 0) + o = variable_buffer_output (o, p, end_p - p); + + return o; +} + +static char * +func_wordlist (char *o, char **argv, const char *funcname UNUSED) +{ + int start, count; + + /* Check the arguments. */ + check_numeric (argv[0], + _("non-numeric first argument to 'wordlist' function")); + check_numeric (argv[1], + _("non-numeric second argument to 'wordlist' function")); + + start = atoi (argv[0]); + if (start < 1) + ON (fatal, *expanding_var, + "invalid first argument to 'wordlist' function: '%d'", start); + + count = atoi (argv[1]) - start + 1; + + if (count > 0) + { + const char *p; + const char *end_p = argv[2]; + + /* Find the beginning of the "start"th word. */ + while (((p = find_next_token (&end_p, 0)) != 0) && --start) + ; + + if (p) + { + /* Find the end of the "count"th word from start. */ + while (--count && (find_next_token (&end_p, 0) != 0)) + ; + + /* Return the stuff in the middle. */ + o = variable_buffer_output (o, p, end_p - p); + } + } + + return o; +} + +static char * +func_findstring (char *o, char **argv, const char *funcname UNUSED) +{ + /* Find the first occurrence of the first string in the second. */ + if (strstr (argv[1], argv[0]) != 0) + o = variable_buffer_output (o, argv[0], strlen (argv[0])); + + return o; +} + +static char * +func_foreach (char *o, char **argv, const char *funcname UNUSED) +{ + /* expand only the first two. */ + char *varname = expand_argument (argv[0], NULL); + char *list = expand_argument (argv[1], NULL); + const char *body = argv[2]; + + int doneany = 0; + const char *list_iterator = list; + const char *p; + unsigned int len; + struct variable *var; + + push_new_variable_scope (); + var = define_variable (varname, strlen (varname), "", o_automatic, 0); + + /* loop through LIST, put the value in VAR and expand BODY */ + while ((p = find_next_token (&list_iterator, &len)) != 0) + { + char *result = 0; + + free (var->value); + var->value = xstrndup (p, len); + + result = allocated_variable_expand (body); + + o = variable_buffer_output (o, result, strlen (result)); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + free (result); + } + + if (doneany) + /* Kill the last space. */ + --o; + + pop_variable_scope (); + free (varname); + free (list); + + return o; +} + +struct a_word +{ + struct a_word *next; + struct a_word *chain; + char *str; + int length; + int matched; +}; + +static unsigned long +a_word_hash_1 (const void *key) +{ + return_STRING_HASH_1 (((struct a_word const *) key)->str); +} + +static unsigned long +a_word_hash_2 (const void *key) +{ + return_STRING_HASH_2 (((struct a_word const *) key)->str); +} + +static int +a_word_hash_cmp (const void *x, const void *y) +{ + int result = ((struct a_word const *) x)->length - ((struct a_word const *) y)->length; + if (result) + return result; + return_STRING_COMPARE (((struct a_word const *) x)->str, + ((struct a_word const *) y)->str); +} + +struct a_pattern +{ + struct a_pattern *next; + char *str; + char *percent; + int length; +}; + +static char * +func_filter_filterout (char *o, char **argv, const char *funcname) +{ + struct a_word *wordhead; + struct a_word **wordtail; + struct a_word *wp; + struct a_pattern *pathead; + struct a_pattern **pattail; + struct a_pattern *pp; + + struct hash_table a_word_table; + int is_filter = funcname[CSTRLEN ("filter")] == '\0'; + const char *pat_iterator = argv[0]; + const char *word_iterator = argv[1]; + int literals = 0; + int words = 0; + int hashing = 0; + char *p; + unsigned int len; + + /* Chop ARGV[0] up into patterns to match against the words. + We don't need to preserve it because our caller frees all the + argument memory anyway. */ + + pattail = &pathead; + while ((p = find_next_token (&pat_iterator, &len)) != 0) + { + struct a_pattern *pat = alloca (sizeof (struct a_pattern)); + + *pattail = pat; + pattail = &pat->next; + + if (*pat_iterator != '\0') + ++pat_iterator; + + pat->str = p; + p[len] = '\0'; + pat->percent = find_percent (p); + if (pat->percent == 0) + literals++; + + /* find_percent() might shorten the string so LEN is wrong. */ + pat->length = strlen (pat->str); + } + *pattail = 0; + + /* Chop ARGV[1] up into words to match against the patterns. */ + + wordtail = &wordhead; + while ((p = find_next_token (&word_iterator, &len)) != 0) + { + struct a_word *word = alloca (sizeof (struct a_word)); + + *wordtail = word; + wordtail = &word->next; + + if (*word_iterator != '\0') + ++word_iterator; + + p[len] = '\0'; + word->str = p; + word->length = len; + word->matched = 0; + word->chain = 0; + words++; + } + *wordtail = 0; + + /* Only use a hash table if arg list lengths justifies the cost. */ + hashing = (literals >= 2 && (literals * words) >= 10); + if (hashing) + { + hash_init (&a_word_table, words, a_word_hash_1, a_word_hash_2, + a_word_hash_cmp); + for (wp = wordhead; wp != 0; wp = wp->next) + { + struct a_word *owp = hash_insert (&a_word_table, wp); + if (owp) + wp->chain = owp; + } + } + + if (words) + { + int doneany = 0; + + /* Run each pattern through the words, killing words. */ + for (pp = pathead; pp != 0; pp = pp->next) + { + if (pp->percent) + for (wp = wordhead; wp != 0; wp = wp->next) + wp->matched |= pattern_matches (pp->str, pp->percent, wp->str); + else if (hashing) + { + struct a_word a_word_key; + a_word_key.str = pp->str; + a_word_key.length = pp->length; + wp = hash_find_item (&a_word_table, &a_word_key); + while (wp) + { + wp->matched |= 1; + wp = wp->chain; + } + } + else + for (wp = wordhead; wp != 0; wp = wp->next) + wp->matched |= (wp->length == pp->length + && strneq (pp->str, wp->str, wp->length)); + } + + /* Output the words that matched (or didn't, for filter-out). */ + for (wp = wordhead; wp != 0; wp = wp->next) + if (is_filter ? wp->matched : !wp->matched) + { + o = variable_buffer_output (o, wp->str, strlen (wp->str)); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + + if (doneany) + /* Kill the last space. */ + --o; + } + + if (hashing) + hash_free (&a_word_table, 0); + + return o; +} + + +static char * +func_strip (char *o, char **argv, const char *funcname UNUSED) +{ + const char *p = argv[0]; + int doneany = 0; + + while (*p != '\0') + { + int i=0; + const char *word_start; + + while (isspace ((unsigned char)*p)) + ++p; + word_start = p; + for (i=0; *p != '\0' && !isspace ((unsigned char)*p); ++p, ++i) + {} + if (!i) + break; + o = variable_buffer_output (o, word_start, i); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + + if (doneany) + /* Kill the last space. */ + --o; + + return o; +} + +/* + Print a warning or fatal message. +*/ +static char * +func_error (char *o, char **argv, const char *funcname) +{ + char **argvp; + char *msg, *p; + int len; + + /* The arguments will be broken on commas. Rather than create yet + another special case where function arguments aren't broken up, + just create a format string that puts them back together. */ + for (len=0, argvp=argv; *argvp != 0; ++argvp) + len += strlen (*argvp) + 2; + + p = msg = alloca (len + 1); + + for (argvp=argv; argvp[1] != 0; ++argvp) + { + strcpy (p, *argvp); + p += strlen (*argvp); + *(p++) = ','; + *(p++) = ' '; + } + strcpy (p, *argvp); + + switch (*funcname) + { + case 'e': + OS (fatal, reading_file, "%s", msg); + + case 'w': + OS (error, reading_file, "%s", msg); + break; + + case 'i': + outputs (0, msg); + outputs (0, "\n"); + break; + + default: + OS (fatal, *expanding_var, "Internal error: func_error: '%s'", funcname); + } + + /* The warning function expands to the empty string. */ + return o; +} + + +/* + chop argv[0] into words, and sort them. + */ +static char * +func_sort (char *o, char **argv, const char *funcname UNUSED) +{ + const char *t; + char **words; + int wordi; + char *p; + unsigned int len; + + /* Find the maximum number of words we'll have. */ + t = argv[0]; + wordi = 0; + while ((p = find_next_token (&t, NULL)) != 0) + { + ++t; + ++wordi; + } + + words = xmalloc ((wordi == 0 ? 1 : wordi) * sizeof (char *)); + + /* Now assign pointers to each string in the array. */ + t = argv[0]; + wordi = 0; + while ((p = find_next_token (&t, &len)) != 0) + { + ++t; + p[len] = '\0'; + words[wordi++] = p; + } + + if (wordi) + { + int i; + + /* Now sort the list of words. */ + qsort (words, wordi, sizeof (char *), alpha_compare); + + /* Now write the sorted list, uniquified. */ + for (i = 0; i < wordi; ++i) + { + len = strlen (words[i]); + if (i == wordi - 1 || strlen (words[i + 1]) != len + || strcmp (words[i], words[i + 1])) + { + o = variable_buffer_output (o, words[i], len); + o = variable_buffer_output (o, " ", 1); + } + } + + /* Kill the last space. */ + --o; + } + + free (words); + + return o; +} + +/* + $(if condition,true-part[,false-part]) + + CONDITION is false iff it evaluates to an empty string. White + space before and after condition are stripped before evaluation. + + If CONDITION is true, then TRUE-PART is evaluated, otherwise FALSE-PART is + evaluated (if it exists). Because only one of the two PARTs is evaluated, + you can use $(if ...) to create side-effects (with $(shell ...), for + example). +*/ + +static char * +func_if (char *o, char **argv, const char *funcname UNUSED) +{ + const char *begp = argv[0]; + const char *endp = begp + strlen (argv[0]) - 1; + int result = 0; + + /* Find the result of the condition: if we have a value, and it's not + empty, the condition is true. If we don't have a value, or it's the + empty string, then it's false. */ + + strip_whitespace (&begp, &endp); + + if (begp <= endp) + { + char *expansion = expand_argument (begp, endp+1); + + result = strlen (expansion); + free (expansion); + } + + /* If the result is true (1) we want to eval the first argument, and if + it's false (0) we want to eval the second. If the argument doesn't + exist we do nothing, otherwise expand it and add to the buffer. */ + + argv += 1 + !result; + + if (*argv) + { + char *expansion = expand_argument (*argv, NULL); + + o = variable_buffer_output (o, expansion, strlen (expansion)); + + free (expansion); + } + + return o; +} + +/* + $(or condition1[,condition2[,condition3[...]]]) + + A CONDITION is false iff it evaluates to an empty string. White + space before and after CONDITION are stripped before evaluation. + + CONDITION1 is evaluated. If it's true, then this is the result of + expansion. If it's false, CONDITION2 is evaluated, and so on. If none of + the conditions are true, the expansion is the empty string. + + Once a CONDITION is true no further conditions are evaluated + (short-circuiting). +*/ + +static char * +func_or (char *o, char **argv, const char *funcname UNUSED) +{ + for ( ; *argv ; ++argv) + { + const char *begp = *argv; + const char *endp = begp + strlen (*argv) - 1; + char *expansion; + int result = 0; + + /* Find the result of the condition: if it's false keep going. */ + + strip_whitespace (&begp, &endp); + + if (begp > endp) + continue; + + expansion = expand_argument (begp, endp+1); + result = strlen (expansion); + + /* If the result is false keep going. */ + if (!result) + { + free (expansion); + continue; + } + + /* It's true! Keep this result and return. */ + o = variable_buffer_output (o, expansion, result); + free (expansion); + break; + } + + return o; +} + +/* + $(and condition1[,condition2[,condition3[...]]]) + + A CONDITION is false iff it evaluates to an empty string. White + space before and after CONDITION are stripped before evaluation. + + CONDITION1 is evaluated. If it's false, then this is the result of + expansion. If it's true, CONDITION2 is evaluated, and so on. If all of + the conditions are true, the expansion is the result of the last condition. + + Once a CONDITION is false no further conditions are evaluated + (short-circuiting). +*/ + +static char * +func_and (char *o, char **argv, const char *funcname UNUSED) +{ + char *expansion; + + while (1) + { + const char *begp = *argv; + const char *endp = begp + strlen (*argv) - 1; + int result; + + /* An empty condition is always false. */ + strip_whitespace (&begp, &endp); + if (begp > endp) + return o; + + expansion = expand_argument (begp, endp+1); + result = strlen (expansion); + + /* If the result is false, stop here: we're done. */ + if (!result) + break; + + /* Otherwise the result is true. If this is the last one, keep this + result and quit. Otherwise go on to the next one! */ + + if (*(++argv)) + free (expansion); + else + { + o = variable_buffer_output (o, expansion, result); + break; + } + } + + free (expansion); + + return o; +} + +static char * +func_wildcard (char *o, char **argv, const char *funcname UNUSED) +{ +#ifdef _AMIGA + o = wildcard_expansion (argv[0], o); +#else + char *p = string_glob (argv[0]); + o = variable_buffer_output (o, p, strlen (p)); +#endif + return o; +} + +/* + $(eval ) + + Always resolves to the empty string. + + Treat the arguments as a segment of makefile, and parse them. +*/ + +static char * +func_eval (char *o, char **argv, const char *funcname UNUSED) +{ + char *buf; + unsigned int len; + + /* Eval the buffer. Pop the current variable buffer setting so that the + eval'd code can use its own without conflicting. */ + + install_variable_buffer (&buf, &len); + + eval_buffer (argv[0], NULL); + + restore_variable_buffer (buf, len); + + return o; +} + + +static char * +func_value (char *o, char **argv, const char *funcname UNUSED) +{ + /* Look up the variable. */ + struct variable *v = lookup_variable (argv[0], strlen (argv[0])); + + /* Copy its value into the output buffer without expanding it. */ + if (v) + o = variable_buffer_output (o, v->value, strlen (v->value)); + + return o; +} + +/* + \r is replaced on UNIX as well. Is this desirable? + */ +static void +fold_newlines (char *buffer, unsigned int *length, int trim_newlines) +{ + char *dst = buffer; + char *src = buffer; + char *last_nonnl = buffer - 1; + src[*length] = 0; + for (; *src != '\0'; ++src) + { + if (src[0] == '\r' && src[1] == '\n') + continue; + if (*src == '\n') + { + *dst++ = ' '; + } + else + { + last_nonnl = dst; + *dst++ = *src; + } + } + + if (!trim_newlines && (last_nonnl < (dst - 2))) + last_nonnl = dst - 2; + + *(++last_nonnl) = '\0'; + *length = last_nonnl - buffer; +} + + + +int shell_function_pid = 0, shell_function_completed; + + +#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. */ + while (isblank ((unsigned char)*text)) + ++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; + shell_function_completed = -1; + } + else + { + pipedes[0] = fileno (fpipe); + *pidp = 42; /* Yes, the Meaning of Life, the Universe, and Everything! */ + errno = e; + shell_function_completed = 1; + } + return fpipe; +} +#endif + +/* + Do shell spawning, with the naughty bits for different OSes. + */ + +#ifdef VMS + +/* VMS can't do $(shell ...) */ + +char * +func_shell_base (char *o, char **argv, int trim_newlines) +{ + fprintf (stderr, "This platform does not support shell\n"); + die (MAKE_TROUBLE); + return NULL; +} + +#define func_shell 0 + +#else +#ifndef _AMIGA +char * +func_shell_base (char *o, char **argv, int trim_newlines) +{ + char *batch_filename = NULL; + int errfd; +#ifdef __MSDOS__ + FILE *fpipe; +#endif + char **command_argv; + const char *error_prefix; + char **envp; + int pipedes[2]; + pid_t pid; + +#ifndef __MSDOS__ +#ifdef WINDOWS32 + /* Reset just_print_flag. This is needed on Windows when batch files + are used to run the commands, because we normally refrain from + creating batch files under -n. */ + int j_p_f = just_print_flag; + just_print_flag = 0; +#endif + + /* Construct the argument list. */ + command_argv = construct_command_argv (argv[0], NULL, NULL, 0, + &batch_filename); + if (command_argv == 0) + { +#ifdef WINDOWS32 + just_print_flag = j_p_f; +#endif + return o; + } +#endif + + /* Using a target environment for 'shell' loses in cases like: + export var = $(shell echo foobie) + bad := $(var) + because target_environment hits a loop trying to expand $(var) to put it + in the environment. This is even more confusing when 'var' was not + explicitly exported, but just appeared in the calling environment. + + See Savannah bug #10593. + + envp = target_environment (NULL); + */ + + envp = environ; + + /* For error messages. */ + if (reading_file && reading_file->filenm) + { + char *p = alloca (strlen (reading_file->filenm)+11+4); + sprintf (p, "%s:%lu: ", reading_file->filenm, reading_file->lineno); + error_prefix = p; + } + else + error_prefix = ""; + + /* Set up the output in case the shell writes something. */ + output_start (); + + errfd = (output_context && output_context->err >= 0 + ? output_context->err : FD_STDERR); + +#if defined(__MSDOS__) + fpipe = msdos_openpipe (pipedes, &pid, argv[0]); + if (pipedes[0] < 0) + { + perror_with_name (error_prefix, "pipe"); + return o; + } +#elif defined(WINDOWS32) + windows32_openpipe (pipedes, errfd, &pid, command_argv, envp); + /* Restore the value of just_print_flag. */ + just_print_flag = j_p_f; + + if (pipedes[0] < 0) + { + /* Open of the pipe failed, mark as failed execution. */ + shell_function_completed = -1; + perror_with_name (error_prefix, "pipe"); + return o; + } + else +#else + if (pipe (pipedes) < 0) + { + perror_with_name (error_prefix, "pipe"); + return o; + } + +# ifdef __EMX__ + /* close some handles that are unnecessary for the child process */ + CLOSE_ON_EXEC(pipedes[1]); + CLOSE_ON_EXEC(pipedes[0]); + /* Never use fork()/exec() here! Use spawn() instead in exec_command() */ + pid = child_execute_job (FD_STDIN, pipedes[1], errfd, command_argv, envp); + if (pid < 0) + perror_with_name (error_prefix, "spawn"); +# else /* ! __EMX__ */ + pid = fork (); + if (pid < 0) + perror_with_name (error_prefix, "fork"); + else if (pid == 0) + { +# ifdef SET_STACK_SIZE + /* Reset limits, if necessary. */ + if (stack_limit.rlim_cur) + setrlimit (RLIMIT_STACK, &stack_limit); +# endif + child_execute_job (FD_STDIN, pipedes[1], errfd, command_argv, envp); + } + else +# endif +#endif + { + /* We are the parent. */ + char *buffer; + unsigned int maxlen, i; + int cc; + + /* Record the PID for reap_children. */ + shell_function_pid = pid; +#ifndef __MSDOS__ + shell_function_completed = 0; + + /* Free the storage only the child needed. */ + free (command_argv[0]); + free (command_argv); + + /* Close the write side of the pipe. We test for -1, since + pipedes[1] is -1 on MS-Windows, and some versions of MS + libraries barf when 'close' is called with -1. */ + if (pipedes[1] >= 0) + close (pipedes[1]); +#endif + + /* Set up and read from the pipe. */ + + maxlen = 200; + buffer = xmalloc (maxlen + 1); + + /* Read from the pipe until it gets EOF. */ + for (i = 0; ; i += cc) + { + if (i == maxlen) + { + maxlen += 512; + buffer = xrealloc (buffer, maxlen + 1); + } + + EINTRLOOP (cc, read (pipedes[0], &buffer[i], maxlen - i)); + if (cc <= 0) + break; + } + buffer[i] = '\0'; + + /* Close the read side of the pipe. */ +#ifdef __MSDOS__ + if (fpipe) + (void) pclose (fpipe); +#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; + + /* The child_handler function will set shell_function_completed + to 1 when the child dies normally, or to -1 if it + dies with status 127, which is most likely an exec fail. */ + + if (shell_function_completed == -1) + { + /* This likely means that the execvp failed, so we should just + write the error message in the pipe from the child. */ + fputs (buffer, stderr); + fflush (stderr); + } + else + { + /* The child finished normally. Replace all newlines in its output + with spaces, and put that in the variable output buffer. */ + fold_newlines (buffer, &i, trim_newlines); + o = variable_buffer_output (o, buffer, i); + } + + free (buffer); + } + + return o; +} + +#else /* _AMIGA */ + +/* Do the Amiga version of func_shell. */ + +char * +func_shell_base (char *o, char **argv, int trim_newlines) +{ + /* Amiga can't fork nor spawn, but I can start a program with + redirection of my choice. However, this means that we + don't have an opportunity to reopen stdout to trap it. Thus, + we save our own stdout onto a new descriptor and dup a temp + file's descriptor onto our stdout temporarily. After we + spawn the shell program, we dup our own stdout back to the + stdout descriptor. The buffer reading is the same as above, + except that we're now reading from a file. */ + +#include +#include + + BPTR child_stdout; + char tmp_output[FILENAME_MAX]; + unsigned int maxlen = 200, i; + int cc; + char * buffer, * ptr; + char ** aptr; + int len = 0; + char* batch_filename = NULL; + + /* Construct the argument list. */ + command_argv = construct_command_argv (argv[0], NULL, NULL, 0, + &batch_filename); + if (command_argv == 0) + return o; + + /* Note the mktemp() is a security hole, but this only runs on Amiga. + Ideally we would use output_tmpfile(), but this uses a special + Open(), not fopen(), and I'm not familiar enough with the code to mess + with it. */ + strcpy (tmp_output, "t:MakeshXXXXXXXX"); + mktemp (tmp_output); + child_stdout = Open (tmp_output, MODE_NEWFILE); + + for (aptr=command_argv; *aptr; aptr++) + len += strlen (*aptr) + 1; + + buffer = xmalloc (len + 1); + ptr = buffer; + + for (aptr=command_argv; *aptr; aptr++) + { + strcpy (ptr, *aptr); + ptr += strlen (ptr) + 1; + *ptr ++ = ' '; + *ptr = 0; + } + + ptr[-1] = '\n'; + + Execute (buffer, NULL, child_stdout); + free (buffer); + + Close (child_stdout); + + child_stdout = Open (tmp_output, MODE_OLDFILE); + + buffer = xmalloc (maxlen); + i = 0; + do + { + if (i == maxlen) + { + maxlen += 512; + buffer = xrealloc (buffer, maxlen + 1); + } + + cc = Read (child_stdout, &buffer[i], maxlen - i); + if (cc > 0) + i += cc; + } while (cc > 0); + + Close (child_stdout); + + fold_newlines (buffer, &i, trim_newlines); + o = variable_buffer_output (o, buffer, i); + free (buffer); + return o; +} +#endif /* _AMIGA */ + +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; + while (isspace ((unsigned char)*s)) + 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' || apath == NULL) + return NULL; + + apath_limit = apath + GET_PATH_MAX; + + if (!IS_ABSOLUTE(name)) + { + /* It is unlikely we would make it until here but just to make sure. */ + if (!starting_directory) + return NULL; + + strcpy (apath, starting_directory); + +#ifdef HAVE_DOS_PATHS + if (STOP_SET (name[0], MAP_DIRSEP)) + { + if (STOP_SET (name[1], MAP_DIRSEP)) + { + /* A UNC. Don't prepend a drive letter. */ + apath[0] = name[0]; + apath[1] = name[1]; + root_len = 2; + } + /* We have /foo, an absolute file name except for the drive + letter. Assume the missing drive letter is the current + drive, which we can get if we remove from starting_directory + everything past the root directory. */ + apath[root_len] = '\0'; + } +#endif + + dest = strchr (apath, '\0'); + } + else + { +#if defined(__CYGWIN__) && defined(HAVE_DOS_PATHS) + if (STOP_SET (name[0], MAP_DIRSEP)) + root_len = 1; +#endif + strncpy (apath, name, root_len); + apath[root_len] = '\0'; + dest = apath + root_len; + /* Get past the root, since we already copied it. */ + name += root_len; +#ifdef HAVE_DOS_PATHS + if (! STOP_SET (apath[root_len - 1], MAP_DIRSEP)) + { + /* Convert d:foo into d:./foo and increase root_len. */ + apath[2] = '.'; + apath[3] = '/'; + dest++; + root_len++; + /* strncpy above copied one character too many. */ + name--; + } + else + apath[root_len - 1] = '/'; /* make sure it's a forward slash */ +#endif + } + + for (start = end = name; *start != '\0'; start = end) + { + unsigned long len; + + /* Skip sequence of multiple path-separators. */ + while (STOP_SET (*start, MAP_DIRSEP)) + ++start; + + /* Find end of path component. */ + for (end = start; ! STOP_SET (*end, MAP_DIRSEP|MAP_NUL); ++end) + ; + + len = end - start; + + if (len == 0) + break; + else if (len == 1 && start[0] == '.') + /* nothing */; + else if (len == 2 && start[0] == '.' && start[1] == '.') + { + /* Back up to previous component, ignore if at root already. */ + if (dest > apath + root_len) + for (--dest; ! STOP_SET (dest[-1], MAP_DIRSEP); --dest) + ; + } + else + { + if (! STOP_SET (dest[-1], MAP_DIRSEP)) + *dest++ = '/'; + + if (dest + len >= apath_limit) + return NULL; + + dest = memcpy (dest, start, len); + dest += len; + *dest = '\0'; + } + } + + /* Unless it is root strip trailing separator. */ + if (dest > apath + root_len && STOP_SET (dest[-1], MAP_DIRSEP)) + --dest; + + *dest = '\0'; + + return apath; +} + + +static char * +func_realpath (char *o, char **argv, const char *funcname UNUSED) +{ + /* Expand the argument. */ + const char *p = argv[0]; + const char *path = 0; + int doneany = 0; + unsigned int len = 0; + + while ((path = find_next_token (&p, &len)) != 0) + { + if (len < GET_PATH_MAX) + { + char *rp; + struct stat st; + PATH_VAR (in); + PATH_VAR (out); + + strncpy (in, path, len); + in[len] = '\0'; + +#ifdef HAVE_REALPATH + ENULLLOOP (rp, realpath (in, out)); +#else + rp = abspath (in, out); +#endif + + if (rp) + { + int r; + EINTRLOOP (r, stat (out, &st)); + if (r == 0) + { + o = variable_buffer_output (o, out, strlen (out)); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + } + } + } + + /* Kill last space. */ + if (doneany) + --o; + + return o; +} + +static char * +func_file (char *o, char **argv, const char *funcname UNUSED) +{ + char *fn = argv[0]; + + if (fn[0] == '>') + { + FILE *fp; + const char *mode = "w"; + + /* We are writing a file. */ + ++fn; + if (fn[0] == '>') + { + mode = "a"; + ++fn; + } + fn = next_token (fn); + + fp = fopen (fn, mode); + if (fp == NULL) + { + const char *err = strerror (errno); + OSS (fatal, reading_file, _("open: %s: %s"), fn, err); + } + if (argv[1]) + { + int l = strlen (argv[1]); + int nl = l == 0 || argv[1][l-1] != '\n'; + + if (fputs (argv[1], fp) == EOF || (nl && fputc ('\n', fp) == EOF)) + { + const char *err = strerror (errno); + OSS (fatal, reading_file, _("write: %s: %s"), fn, err); + } + } + fclose (fp); + } + else + OS (fatal, reading_file, _("Invalid file operation: %s"), fn); + + return o; +} + +static char * +func_abspath (char *o, char **argv, const char *funcname UNUSED) +{ + /* Expand the argument. */ + const char *p = argv[0]; + const char *path = 0; + int doneany = 0; + unsigned int len = 0; + + while ((path = find_next_token (&p, &len)) != 0) + { + if (len < GET_PATH_MAX) + { + PATH_VAR (in); + PATH_VAR (out); + + strncpy (in, path, len); + in[len] = '\0'; + + if (abspath (in, out)) + { + o = variable_buffer_output (o, out, strlen (out)); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + } + } + + /* Kill last space. */ + if (doneany) + --o; + + return o; +} + +/* Lookup table for builtin functions. + + This doesn't have to be sorted; we use a straight lookup. We might gain + some efficiency by moving most often used functions to the start of the + table. + + If MAXIMUM_ARGS is 0, that means there is no maximum and all + comma-separated values are treated as arguments. + + EXPAND_ARGS means that all arguments should be expanded before invocation. + Functions that do namespace tricks (foreach) don't automatically expand. */ + +static char *func_call (char *o, char **argv, const char *funcname); + +#define FT_ENTRY(_name, _min, _max, _exp, _func) \ + { { (_func) }, STRING_SIZE_TUPLE(_name), (_min), (_max), (_exp), 0 } + +static struct function_table_entry function_table_init[] = +{ + /* Name MIN MAX EXP? Function */ + FT_ENTRY ("abspath", 0, 1, 1, func_abspath), + FT_ENTRY ("addprefix", 2, 2, 1, func_addsuffix_addprefix), + FT_ENTRY ("addsuffix", 2, 2, 1, func_addsuffix_addprefix), + FT_ENTRY ("basename", 0, 1, 1, func_basename_dir), + FT_ENTRY ("dir", 0, 1, 1, func_basename_dir), + FT_ENTRY ("notdir", 0, 1, 1, func_notdir_suffix), + FT_ENTRY ("subst", 3, 3, 1, func_subst), + FT_ENTRY ("suffix", 0, 1, 1, func_notdir_suffix), + FT_ENTRY ("filter", 2, 2, 1, func_filter_filterout), + FT_ENTRY ("filter-out", 2, 2, 1, func_filter_filterout), + FT_ENTRY ("findstring", 2, 2, 1, func_findstring), + FT_ENTRY ("firstword", 0, 1, 1, func_firstword), + FT_ENTRY ("flavor", 0, 1, 1, func_flavor), + FT_ENTRY ("join", 2, 2, 1, func_join), + FT_ENTRY ("lastword", 0, 1, 1, func_lastword), + FT_ENTRY ("patsubst", 3, 3, 1, func_patsubst), + FT_ENTRY ("realpath", 0, 1, 1, func_realpath), + FT_ENTRY ("shell", 0, 1, 1, func_shell), + FT_ENTRY ("sort", 0, 1, 1, func_sort), + FT_ENTRY ("strip", 0, 1, 1, func_strip), + FT_ENTRY ("wildcard", 0, 1, 1, func_wildcard), + FT_ENTRY ("word", 2, 2, 1, func_word), + FT_ENTRY ("wordlist", 3, 3, 1, func_wordlist), + FT_ENTRY ("words", 0, 1, 1, func_words), + FT_ENTRY ("origin", 0, 1, 1, func_origin), + FT_ENTRY ("foreach", 3, 3, 0, func_foreach), + FT_ENTRY ("call", 1, 0, 1, func_call), + FT_ENTRY ("info", 0, 1, 1, func_error), + FT_ENTRY ("error", 0, 1, 1, func_error), + FT_ENTRY ("warning", 0, 1, 1, func_error), + FT_ENTRY ("if", 2, 3, 0, func_if), + FT_ENTRY ("or", 1, 0, 0, func_or), + FT_ENTRY ("and", 1, 0, 0, func_and), + FT_ENTRY ("value", 0, 1, 1, func_value), + FT_ENTRY ("eval", 0, 1, 1, func_eval), + FT_ENTRY ("file", 1, 2, 1, func_file), +#ifdef EXPERIMENTAL + FT_ENTRY ("eq", 2, 2, 1, func_eq), + FT_ENTRY ("not", 0, 1, 1, func_not), +#endif +}; + +#define FUNCTION_TABLE_ENTRIES (sizeof (function_table_init) / sizeof (struct function_table_entry)) + + +/* 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 = next_token (beg + entry_p->len); + + /* Find the end of the function invocation, counting nested use of + whichever kind of parens we use. Since we're looking, count commas + to get a rough estimate of how many arguments we might have. The + count might be high, but it'll never be low. */ + + for (nargs=1, end=beg; *end != '\0'; ++end) + if (*end == ',') + ++nargs; + else if (*end == openparen) + ++count; + else if (*end == closeparen && --count < 0) + break; + + if (count >= 0) + fatal (*expanding_var, strlen (entry_p->name), + _("unterminated call to function '%s': missing '%c'"), + entry_p->name, closeparen); + + *stringp = end; + + /* Get some memory to store the arg pointers. */ + argvp = argv = alloca (sizeof (char *) * (nargs + 2)); + + /* Chop the string into arguments, then a nul. As soon as we hit + MAXIMUM_ARGS (if it's >0) assume the rest of the string is part of the + last argument. + + If we're expanding, store pointers to the expansion of each one. If + not, make a duplicate of the string and point into that, nul-terminating + each argument. */ + + if (entry_p->expand_args) + { + const char *p; + for (p=beg, nargs=0; p <= end; ++argvp) + { + const char *next; + + ++nargs; + + if (nargs == entry_p->maximum_args + || (! (next = find_next_argument (openparen, closeparen, p, end)))) + next = end; + + *argvp = expand_argument (p, next); + p = next + 1; + } + } + else + { + int len = end - beg; + char *p, *aend; + + abeg = xmalloc (len+1); + memcpy (abeg, beg, len); + abeg[len] = '\0'; + aend = abeg + len; + + for (p=abeg, nargs=0; p <= aend; ++argvp) + { + char *next; + + ++nargs; + + if (nargs == entry_p->maximum_args + || (! (next = find_next_argument (openparen, closeparen, p, aend)))) + next = aend; + + *argvp = p; + *next = '\0'; + p = next + 1; + } + } + *argvp = NULL; + + /* Finally! Run the function... */ + *op = expand_builtin_function (*op, nargs, argv, entry_p); + + /* Free memory. */ + if (entry_p->expand_args) + for (argvp=argv; *argvp != 0; ++argvp) + free (*argvp); + else + free (abeg); + + return 1; +} + + +/* 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 *cp; + char *body; + int flen; + int i; + int saved_args; + const struct function_table_entry *entry_p; + struct variable *v; + + /* There is no way to define a variable with a space in the name, so strip + leading and trailing whitespace as a favor to the user. */ + fname = argv[0]; + while (isspace ((unsigned char)*fname)) + ++fname; + + cp = fname + strlen (fname) - 1; + while (cp > fname && isspace ((unsigned char)*cp)) + --cp; + cp[1] = '\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 gmk_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 (%d) for function %s"), min, name); + if (max > 255 || (max && max < min)) + ONS (fatal, flocp, + _("Invalid maximum argument count (%d) for function %s"), max, name); + + ent = xmalloc (sizeof (struct function_table_entry)); + ent->name = name; + ent->len = len; + ent->minimum_args = min; + ent->maximum_args = max; + ent->expand_args = ANY_SET(flags, GMK_FUNC_NOEXPAND) ? 0 : 1; + ent->alloc_fn = 1; + ent->fptr.alloc_func_ptr = func; + + hash_insert (&function_table, ent); +} + +void +hash_init_function_table (void) +{ + hash_init (&function_table, FUNCTION_TABLE_ENTRIES * 2, + function_table_entry_hash_1, function_table_entry_hash_2, + function_table_entry_hash_cmp); + hash_load (&function_table, function_table_init, + FUNCTION_TABLE_ENTRIES, sizeof (struct function_table_entry)); +} diff --git a/getloadavg.c b/getloadavg.c new file mode 100644 index 0000000..a755b6d --- /dev/null +++ b/getloadavg.c @@ -0,0 +1,1026 @@ +/* Get the system load averages. +Copyright (C) 1985-2014 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 . */ + +/* Compile-time symbols that this file uses: + + HAVE_PSTAT_GETDYNAMIC Define this if your system has the + pstat_getdynamic function. I think it + is unique to HPUX9. The best way to get the + definition is through the AC_FUNC_GETLOADAVG + macro that comes with autoconf 2.13 or newer. + If that isn't an option, then just put + AC_CHECK_FUNCS(pstat_getdynamic) in your + configure.in file. + FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist. + KERNEL_FILE Pathname of the kernel to nlist. + LDAV_CVT() Scale the load average from the kernel. + Returns a double. + LDAV_SYMBOL Name of kernel symbol giving load average. + LOAD_AVE_TYPE Type of the load average array in the kernel. + Must be defined unless one of + apollo, DGUX, NeXT, or UMAX is defined; + or we have libkstat; + otherwise, no load average is available. + NLIST_STRUCT Include nlist.h, not a.out.h, and + the nlist n_name element is a pointer, + not an array. + HAVE_STRUCT_NLIST_N_UN_N_NAME struct nlist has an n_un member, not n_name. + LINUX_LDAV_FILE [__linux__]: File containing load averages. + + Specific system predefines this file uses, aside from setting + default values if not emacs: + + apollo + BSD Real BSD, not just BSD-like. + convex + DGUX + eunice UNIX emulator under VMS. + hpux + __MSDOS__ No-op for MSDOS. + NeXT + sgi + sequent Sequent Dynix 3.x.x (BSD) + _SEQUENT_ Sequent DYNIX/ptx 1.x.x (SYSV) + sony_news NEWS-OS (works at least for 4.1C) + UMAX + UMAX4_3 + VMS + WINDOWS32 No-op for Windows95/NT. + __linux__ Linux: assumes /proc filesystem mounted. + Support from Michael K. Johnson. + __NetBSD__ NetBSD: assumes /kern filesystem mounted. + + In addition, to avoid nesting many #ifdefs, we internally set + LDAV_DONE to indicate that the load average has been computed. + + We also #define LDAV_PRIVILEGED if a program will require + special installation to be able to call getloadavg. */ + +/* This should always be first. */ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +/* Both the Emacs and non-Emacs sections want this. Some + configuration files' definitions for the LOAD_AVE_CVT macro (like + sparc.h's) use macros like FSCALE, defined here. */ +#if defined (unix) || defined (__unix) +# include +#endif + + +/* Exclude all the code except the test program at the end + if the system has its own 'getloadavg' function. + + The declaration of 'errno' is needed by the test program + as well as the function itself, so it comes first. */ + +#include + +#ifndef errno +extern int errno; +#endif + +#if HAVE_LOCALE_H +# include +#endif +#if !HAVE_SETLOCALE +# define setlocale(Category, Locale) /* empty */ +#endif + +#ifndef HAVE_GETLOADAVG + + +/* The existing Emacs configuration files define a macro called + LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and + returns the load average multiplied by 100. What we actually want + is a macro called LDAV_CVT, which returns the load average as an + unmultiplied double. + + For backwards compatibility, we'll define LDAV_CVT in terms of + LOAD_AVE_CVT, but future machine config files should just define + LDAV_CVT directly. */ + +# if !defined(LDAV_CVT) && defined(LOAD_AVE_CVT) +# define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0) +# endif + +# if !defined (BSD) && defined (ultrix) +/* Ultrix behaves like BSD on Vaxen. */ +# define BSD +# endif + +# ifdef NeXT +/* NeXT in the 2.{0,1,2} releases defines BSD in , 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(ultrix) && defined(mips) +# define decstation +# endif + +# if defined (__SVR4) && !defined (SVR4) +# define SVR4 +# endif + +# if (defined(sun) && defined(SVR4)) || defined (SOLARIS2) +# define SUNOS_5 +# endif + +# if defined (__osf__) && (defined (__alpha) || defined (__alpha__)) +# define OSF_ALPHA +# include +# include +# include +# include +# endif + +# if defined (__osf__) && (defined (mips) || defined (__mips__)) +# define OSF_MIPS +# include +# endif + +/* UTek's /bin/cc on the 4300 has no architecture specific cpp define by + default, but _MACH_IND_SYS_TYPES is defined in . Combine + that with a couple of other things and we'll have a unique match. */ +# if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES) +# define tek4300 /* Define by emacs, but not by other users. */ +# endif + +/* AC_FUNC_GETLOADAVG thinks QNX is SVR4, but it isn't. */ +# if defined(__QNX__) +# undef SVR4 +# endif + +/* VAX C can't handle multi-line #ifs, or lines longer than 256 chars. */ +# ifndef LOAD_AVE_TYPE + +# ifdef MORE_BSD +# define LOAD_AVE_TYPE long +# endif + +# ifdef sun +# define LOAD_AVE_TYPE long +# endif + +# ifdef decstation +# define LOAD_AVE_TYPE long +# endif + +# ifdef _SEQUENT_ +# define LOAD_AVE_TYPE long +# endif + +# ifdef sgi +# define LOAD_AVE_TYPE long +# endif + +# ifdef SVR4 +# define LOAD_AVE_TYPE long +# endif + +# ifdef sony_news +# define LOAD_AVE_TYPE long +# endif + +# ifdef sequent +# define LOAD_AVE_TYPE long +# endif + +# ifdef OSF_ALPHA +# define LOAD_AVE_TYPE long +# endif + +# if defined (ardent) && defined (titan) +# define LOAD_AVE_TYPE long +# endif + +# ifdef tek4300 +# define LOAD_AVE_TYPE long +# endif + +# if defined(alliant) && defined(i860) /* Alliant FX/2800 */ +# define LOAD_AVE_TYPE long +# endif + +# ifdef _AIX +# define LOAD_AVE_TYPE long +# endif + +# ifdef convex +# define LOAD_AVE_TYPE double +# ifndef LDAV_CVT +# define LDAV_CVT(n) (n) +# endif +# endif + +# endif /* No LOAD_AVE_TYPE. */ + +# ifdef OSF_ALPHA +/* defines an incorrect value for FSCALE on Alpha OSF/1, + according to ghazi@noc.rutgers.edu. */ +# undef FSCALE +# define FSCALE 1024.0 +# endif + +# if defined(alliant) && defined(i860) /* Alliant FX/2800 */ +/* defines an incorrect value for FSCALE on an + Alliant FX/2800 Concentrix 2.2, according to ghazi@noc.rutgers.edu. */ +# undef FSCALE +# define FSCALE 100.0 +# endif + + +# ifndef FSCALE + +/* SunOS and some others define FSCALE in sys/param.h. */ + +# ifdef MORE_BSD +# define FSCALE 2048.0 +# endif + +# if defined(MIPS) || defined(SVR4) || defined(decstation) +# define FSCALE 256 +# endif + +# if defined (sgi) || defined (sequent) +/* Sometimes both MIPS and sgi are defined, so FSCALE was just defined + above under #ifdef MIPS. But we want the sgi value. */ +# undef FSCALE +# define FSCALE 1000.0 +# endif + +# if defined (ardent) && defined (titan) +# define FSCALE 65536.0 +# endif + +# ifdef tek4300 +# define FSCALE 100.0 +# endif + +# ifdef _AIX +# define FSCALE 65536.0 +# endif + +# endif /* Not FSCALE. */ + +# if !defined (LDAV_CVT) && defined (FSCALE) +# define LDAV_CVT(n) (((double) (n)) / FSCALE) +# endif + + +# if defined(sgi) || (defined(mips) && !defined(BSD)) +# define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31)) +# endif + + +# if !defined (KERNEL_FILE) && defined (sequent) +# define KERNEL_FILE "/dynix" +# endif + +# if !defined (KERNEL_FILE) && defined (hpux) +# define KERNEL_FILE "/hp-ux" +# endif + +# if !defined(KERNEL_FILE) && (defined(_SEQUENT_) || defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || (defined (ardent) && defined (titan))) +# define KERNEL_FILE "/unix" +# endif + + +# if !defined (LDAV_SYMBOL) && defined (alliant) +# define LDAV_SYMBOL "_Loadavg" +# endif + +# if !defined(LDAV_SYMBOL) && ((defined(hpux) && !defined(hp9000s300)) || defined(_SEQUENT_) || defined(SVR4) || defined(ISC) || defined(sgi) || (defined (ardent) && defined (titan)) || defined (_AIX)) +# define LDAV_SYMBOL "avenrun" +# endif + +# ifdef HAVE_UNISTD_H +# include +# endif + +# include + +/* LOAD_AVE_TYPE should only get defined if we're going to use the + nlist method. */ +# if !defined(LOAD_AVE_TYPE) && (defined(BSD) || defined(LDAV_CVT) || defined(KERNEL_FILE) || defined(LDAV_SYMBOL)) && !defined(__riscos__) +# define LOAD_AVE_TYPE double +# endif + +# ifdef LOAD_AVE_TYPE + +# ifndef VMS +# ifndef __linux__ +# ifdef HAVE_NLIST_H +# include +# else +# include +# endif + +# ifdef SUNOS_5 +# include +# 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__ */ + +# 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(__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 +# 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(HAVE_FCNTL_H) || defined(_POSIX_VERSION) +# include +# else +# include +# endif + + +/* Avoid static vars inside a function since in HPUX they dump as pure. */ + +# ifdef NeXT +static processor_set_t default_set; +static int getloadavg_initialized; +# endif /* NeXT */ + +# ifdef UMAX +static unsigned int cpus = 0; +static unsigned int samples; +# endif /* UMAX */ + +# ifdef DGUX +static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */ +# endif /* DGUX */ + +#if !defined(HAVE_LIBKSTAT) && defined(LOAD_AVE_TYPE) +/* File descriptor open to /dev/kmem or VMS load ave driver. */ +static int channel; +/* Nonzero iff channel is valid. */ +static int getloadavg_initialized; +/* Offset in kmem to seek to read load average, or 0 means invalid. */ +static long offset; + +#if !defined(VMS) && !defined(sgi) && !defined(__linux__) +static struct nlist nl[2]; +#endif /* Not VMS or sgi */ + +#ifdef SUNOS_5 +static kvm_t *kd; +#endif /* SUNOS_5 */ + +#endif /* LOAD_AVE_TYPE && !HAVE_LIBKSTAT */ + +/* Put the 1 minute, 5 minute and 15 minute load averages + into the first NELEM elements of LOADAVG. + Return the number written (never more than 3, but may be less than NELEM), + or -1 if an error occurred. */ + +int +getloadavg (double loadavg[], int nelem) +{ + int elem = 0; /* Return value. */ + +# ifdef NO_GET_LOAD_AVG +# define LDAV_DONE + /* Set errno to zero to indicate that there was no particular error; + this function just can't work at all on this system. */ + errno = 0; + elem = -1; +# endif + +# if !defined (LDAV_DONE) && defined (HAVE_LIBKSTAT) +/* Use libkstat because we don't have to be root. */ +# define LDAV_DONE + kstat_ctl_t *kc; + kstat_t *ksp; + kstat_named_t *kn; + + kc = kstat_open (); + if (kc == 0) + return -1; + ksp = kstat_lookup (kc, "unix", 0, "system_misc"); + if (ksp == 0 ) + return -1; + if (kstat_read (kc, ksp, 0) == -1) + return -1; + + + kn = kstat_data_lookup (ksp, "avenrun_1min"); + if (kn == 0) + { + /* Return -1 if no load average information is available. */ + nelem = 0; + elem = -1; + } + + if (nelem >= 1) + loadavg[elem++] = (double) kn->value.ul/FSCALE; + + if (nelem >= 2) + { + kn = kstat_data_lookup (ksp, "avenrun_5min"); + if (kn != 0) + { + loadavg[elem++] = (double) kn->value.ul/FSCALE; + + if (nelem >= 3) + { + kn = kstat_data_lookup (ksp, "avenrun_15min"); + if (kn != 0) + loadavg[elem++] = (double) kn->value.ul/FSCALE; + } + } + } + + kstat_close (kc); +# endif /* HAVE_LIBKSTAT */ + +# if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) +/* Use pstat_getdynamic() because we don't have to be root. */ +# define LDAV_DONE +# undef LOAD_AVE_TYPE + + struct pst_dynamic dyn_info; + if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0) + return -1; + if (nelem > 0) + loadavg[elem++] = dyn_info.psd_avg_1_min; + if (nelem > 1) + loadavg[elem++] = dyn_info.psd_avg_5_min; + if (nelem > 2) + loadavg[elem++] = dyn_info.psd_avg_15_min; + +# endif /* hpux && HAVE_PSTAT_GETDYNAMIC */ + +# if !defined (LDAV_DONE) && defined (__linux__) +# define LDAV_DONE +# undef LOAD_AVE_TYPE + +# ifndef LINUX_LDAV_FILE +# define LINUX_LDAV_FILE "/proc/loadavg" +# endif + + char ldavgbuf[40]; + double load_ave[3]; + int fd, count; + + fd = open (LINUX_LDAV_FILE, O_RDONLY); + if (fd == -1) + return -1; + count = read (fd, ldavgbuf, 40); + (void) close (fd); + if (count <= 0) + return -1; + + /* The following sscanf must use the C locale. */ + setlocale (LC_NUMERIC, "C"); + count = sscanf (ldavgbuf, "%lf %lf %lf", + &load_ave[0], &load_ave[1], &load_ave[2]); + setlocale (LC_NUMERIC, ""); + if (count < 1) + return -1; + + for (elem = 0; elem < nelem && elem < count; elem++) + loadavg[elem] = load_ave[elem]; + + return elem; + +# endif /* __linux__ */ + +# if !defined (LDAV_DONE) && defined (__NetBSD__) +# define LDAV_DONE +# undef LOAD_AVE_TYPE + +# ifndef NETBSD_LDAV_FILE +# define NETBSD_LDAV_FILE "/kern/loadavg" +# endif + + unsigned long int load_ave[3], scale; + int count; + FILE *fp; + + fp = fopen (NETBSD_LDAV_FILE, "r"); + if (fp == NULL) + return -1; + count = fscanf (fp, "%lu %lu %lu %lu\n", + &load_ave[0], &load_ave[1], &load_ave[2], + &scale); + (void) fclose (fp); + if (count != 4) + return -1; + + for (elem = 0; elem < nelem; elem++) + loadavg[elem] = (double) load_ave[elem] / (double) scale; + + return elem; + +# endif /* __NetBSD__ */ + +# if !defined (LDAV_DONE) && defined (NeXT) +# define LDAV_DONE + /* The NeXT code was adapted from iscreen 3.2. */ + + host_t host; + struct processor_set_basic_info info; + unsigned info_count; + + /* We only know how to get the 1-minute average for this system, + so even if the caller asks for more than 1, we only return 1. */ + + if (!getloadavg_initialized) + { + if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS) + getloadavg_initialized = 1; + } + + if (getloadavg_initialized) + { + info_count = PROCESSOR_SET_BASIC_INFO_COUNT; + if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host, + (processor_set_info_t) &info, &info_count) + != KERN_SUCCESS) + getloadavg_initialized = 0; + else + { + if (nelem > 0) + loadavg[elem++] = (double) info.load_average / LOAD_SCALE; + } + } + + if (!getloadavg_initialized) + return -1; +# endif /* NeXT */ + +# if !defined (LDAV_DONE) && defined (UMAX) +# define LDAV_DONE +/* UMAX 4.2, which runs on the Encore Multimax multiprocessor, does not + have a /dev/kmem. Information about the workings of the running kernel + can be gathered with inq_stats system calls. + We only know how to get the 1-minute average for this system. */ + + struct proc_summary proc_sum_data; + struct stat_descr proc_info; + double load; + register unsigned int i, j; + + if (cpus == 0) + { + register unsigned int c, i; + struct cpu_config conf; + struct stat_descr desc; + + desc.sd_next = 0; + desc.sd_subsys = SUBSYS_CPU; + desc.sd_type = CPUTYPE_CONFIG; + desc.sd_addr = (char *) &conf; + desc.sd_size = sizeof conf; + + if (inq_stats (1, &desc)) + return -1; + + c = 0; + for (i = 0; i < conf.config_maxclass; ++i) + { + struct class_stats stats; + memset (&stats, '\0', sizeof stats); + + desc.sd_type = CPUTYPE_CLASS; + desc.sd_objid = i; + desc.sd_addr = (char *) &stats; + desc.sd_size = sizeof stats; + + if (inq_stats (1, &desc)) + return -1; + + c += stats.class_numcpus; + } + cpus = c; + samples = cpus < 2 ? 3 : (2 * cpus / 3); + } + + proc_info.sd_next = 0; + proc_info.sd_subsys = SUBSYS_PROC; + proc_info.sd_type = PROCTYPE_SUMMARY; + proc_info.sd_addr = (char *) &proc_sum_data; + proc_info.sd_size = sizeof (struct proc_summary); + proc_info.sd_sizeused = 0; + + if (inq_stats (1, &proc_info) != 0) + return -1; + + load = proc_sum_data.ps_nrunnable; + j = 0; + for (i = samples - 1; i > 0; --i) + { + load += proc_sum_data.ps_nrun[j]; + if (j++ == PS_NRUNSIZE) + j = 0; + } + + if (nelem > 0) + loadavg[elem++] = load / samples / cpus; +# endif /* UMAX */ + +# if !defined (LDAV_DONE) && defined (DGUX) +# define LDAV_DONE + /* This call can return -1 for an error, but with good args + it's not supposed to fail. The first argument is for no + apparent reason of type 'long int *'. */ + dg_sys_info ((long int *) &load_info, + DG_SYS_INFO_LOAD_INFO_TYPE, + DG_SYS_INFO_LOAD_VERSION_0); + + if (nelem > 0) + loadavg[elem++] = load_info.one_minute; + if (nelem > 1) + loadavg[elem++] = load_info.five_minute; + if (nelem > 2) + loadavg[elem++] = load_info.fifteen_minute; +# endif /* DGUX */ + +# if !defined (LDAV_DONE) && defined (apollo) +# define LDAV_DONE +/* Apollo code from lisch@mentorg.com (Ray Lischner). + + This system call is not documented. The load average is obtained as + three long integers, for the load average over the past minute, + five minutes, and fifteen minutes. Each value is a scaled integer, + with 16 bits of integer part and 16 bits of fraction part. + + I'm not sure which operating system first supported this system call, + but I know that SR10.2 supports it. */ + + extern void proc1_$get_loadav (); + unsigned long load_ave[3]; + + proc1_$get_loadav (load_ave); + + if (nelem > 0) + loadavg[elem++] = load_ave[0] / 65536.0; + if (nelem > 1) + loadavg[elem++] = load_ave[1] / 65536.0; + if (nelem > 2) + loadavg[elem++] = load_ave[2] / 65536.0; +# endif /* apollo */ + +# if !defined (LDAV_DONE) && defined (OSF_MIPS) +# define LDAV_DONE + + struct tbl_loadavg load_ave; + table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave)); + loadavg[elem++] + = (load_ave.tl_lscale == 0 + ? load_ave.tl_avenrun.d[0] + : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale)); +# endif /* OSF_MIPS */ + +# if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32)) +# define LDAV_DONE + + /* A faithful emulation is going to have to be saved for a rainy day. */ + for ( ; elem < nelem; elem++) + { + loadavg[elem] = 0.0; + } +# endif /* __MSDOS__ || WINDOWS32 */ + +# if !defined (LDAV_DONE) && defined (OSF_ALPHA) +# define LDAV_DONE + + struct tbl_loadavg load_ave; + table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave)); + for (elem = 0; elem < nelem; elem++) + loadavg[elem] + = (load_ave.tl_lscale == 0 + ? load_ave.tl_avenrun.d[elem] + : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale)); +# endif /* OSF_ALPHA */ + +# if !defined (LDAV_DONE) && defined (VMS) + /* VMS specific code -- read from the Load Ave driver. */ + + LOAD_AVE_TYPE load_ave[3]; + static int getloadavg_initialized = 0; +# ifdef eunice + struct + { + int dsc$w_length; + char *dsc$a_pointer; + } descriptor; +# endif + + /* Ensure that there is a channel open to the load ave device. */ + if (!getloadavg_initialized) + { + /* Attempt to open the channel. */ +# ifdef eunice + descriptor.dsc$w_length = 18; + descriptor.dsc$a_pointer = "$$VMS_LOAD_AVERAGE"; +# else + $DESCRIPTOR (descriptor, "LAV0:"); +# endif + if (sys$assign (&descriptor, &channel, 0, 0) & 1) + getloadavg_initialized = 1; + } + + /* Read the load average vector. */ + if (getloadavg_initialized + && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0, + load_ave, 12, 0, 0, 0, 0) & 1)) + { + sys$dassgn (channel); + getloadavg_initialized = 0; + } + + if (!getloadavg_initialized) + return -1; +# endif /* VMS */ + +# if !defined (LDAV_DONE) && defined(LOAD_AVE_TYPE) && !defined(VMS) + + /* UNIX-specific code -- read the average from /dev/kmem. */ + +# define LDAV_PRIVILEGED /* This code requires special installation. */ + + LOAD_AVE_TYPE load_ave[3]; + + /* Get the address of LDAV_SYMBOL. */ + if (offset == 0) + { +# ifndef sgi +# ifndef NLIST_STRUCT + strcpy (nl[0].n_name, LDAV_SYMBOL); + strcpy (nl[1].n_name, ""); +# else /* NLIST_STRUCT */ +# ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME + nl[0].n_un.n_name = LDAV_SYMBOL; + nl[1].n_un.n_name = 0; +# else /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */ + nl[0].n_name = LDAV_SYMBOL; + nl[1].n_name = 0; +# endif /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */ +# endif /* NLIST_STRUCT */ + +# ifndef SUNOS_5 + if ( +# if !(defined (_AIX) && !defined (ps2)) + nlist (KERNEL_FILE, nl) +# else /* _AIX */ + knlist (nl, 1, sizeof (nl[0])) +# endif + >= 0) + /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i. */ + { +# ifdef FIXUP_KERNEL_SYMBOL_ADDR + FIXUP_KERNEL_SYMBOL_ADDR (nl); +# endif + offset = nl[0].n_value; + } +# endif /* !SUNOS_5 */ +# else /* sgi */ + int ldav_off; + + ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN); + if (ldav_off != -1) + offset = (long) ldav_off & 0x7fffffff; +# endif /* sgi */ + } + + /* Make sure we have /dev/kmem open. */ + if (!getloadavg_initialized) + { +# ifndef SUNOS_5 + channel = open ("/dev/kmem", 0); + if (channel >= 0) + { + /* Set the channel to close on exec, so it does not + litter any child's descriptor table. */ +# ifdef F_SETFD +# ifndef FD_CLOEXEC +# define FD_CLOEXEC 1 +# endif + (void) fcntl (channel, F_SETFD, FD_CLOEXEC); +# endif + getloadavg_initialized = 1; + } +# else /* SUNOS_5 */ + /* We pass 0 for the kernel, corefile, and swapfile names + to use the currently running kernel. */ + kd = kvm_open (0, 0, 0, O_RDONLY, 0); + if (kd != 0) + { + /* nlist the currently running kernel. */ + kvm_nlist (kd, nl); + offset = nl[0].n_value; + getloadavg_initialized = 1; + } +# endif /* SUNOS_5 */ + } + + /* If we can, get the load average values. */ + if (offset && getloadavg_initialized) + { + /* Try to read the load. */ +# ifndef SUNOS_5 + if (lseek (channel, offset, 0) == -1L + || read (channel, (char *) load_ave, sizeof (load_ave)) + != sizeof (load_ave)) + { + close (channel); + getloadavg_initialized = 0; + } +# else /* SUNOS_5 */ + if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave)) + != sizeof (load_ave)) + { + kvm_close (kd); + getloadavg_initialized = 0; + } +# endif /* SUNOS_5 */ + } + + if (offset == 0 || !getloadavg_initialized) + return -1; +# endif /* LOAD_AVE_TYPE and not VMS */ + +# if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE) /* Including VMS. */ + if (nelem > 0) + loadavg[elem++] = LDAV_CVT (load_ave[0]); + if (nelem > 1) + loadavg[elem++] = LDAV_CVT (load_ave[1]); + if (nelem > 2) + loadavg[elem++] = LDAV_CVT (load_ave[2]); + +# define LDAV_DONE +# endif /* !LDAV_DONE && LOAD_AVE_TYPE */ + +# ifdef LDAV_DONE + return elem; +# else + /* Set errno to zero to indicate that there was no particular error; + this function just can't work at all on this system. */ + errno = 0; + return -1; +# endif +} + +#endif /* ! HAVE_GETLOADAVG */ + +#ifdef TEST +#include "makeint.h" + +int +main (int argc, char **argv) +{ + int naptime = 0; + + if (argc > 1) + naptime = atoi (argv[1]); + + while (1) + { + double avg[3]; + int loads; + + errno = 0; /* Don't be misled if it doesn't set errno. */ + loads = getloadavg (avg, 3); + if (loads == -1) + { + perror ("Error getting load average"); + exit (1); + } + if (loads > 0) + printf ("1-minute: %f ", avg[0]); + if (loads > 1) + printf ("5-minute: %f ", avg[1]); + if (loads > 2) + printf ("15-minute: %f ", avg[2]); + if (loads > 0) + putchar ('\n'); + + if (naptime == 0) + break; + sleep (naptime); + } + + exit (0); +} +#endif /* TEST */ diff --git a/getopt.c b/getopt.c new file mode 100644 index 0000000..a8051fc --- /dev/null +++ b/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-2014 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/getopt.h b/getopt.h new file mode 100644 index 0000000..adef9a5 --- /dev/null +++ b/getopt.h @@ -0,0 +1,130 @@ +/* Declarations for getopt. +Copyright (C) 1989-2014 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/getopt1.c b/getopt1.c new file mode 100644 index 0000000..42dea22 --- /dev/null +++ b/getopt1.c @@ -0,0 +1,176 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. +Copyright (C) 1987-1994, 1996-2014 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/gettext.h b/gettext.h new file mode 100644 index 0000000..c2030ff --- /dev/null +++ b/gettext.h @@ -0,0 +1,57 @@ +/* Convenience header for conditional use of GNU . +Copyright (C) 1995-2014 Free 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/glob/COPYING.LIB b/glob/COPYING.LIB new file mode 100644 index 0000000..bbe3fe1 --- /dev/null +++ b/glob/COPYING.LIB @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/glob/ChangeLog b/glob/ChangeLog new file mode 100644 index 0000000..c543c85 --- /dev/null +++ b/glob/ChangeLog @@ -0,0 +1,191 @@ +2013-10-20 Paul Smith + + * glob.c (glob): Cherry-pick a471e96a5352a5f0bde6d32dd36d33524811a2b1 + from git://sourceware.org/git/glibc.git to fix SV 18123, + https://sourceware.org/bugzilla/show_bug.cgi?id=10278 + +2008-09-28 Juan Manuel Guerrero + + * glob.c (my_realloc) [__DJGPP__]: Don't define, and don't + redefine realloc to call it, since the DJGPP's realloc handles + NULL pointers correctly. + +2007-12-22 Juan Manuel Guerrero (tiny change) + + * glob.c [__GNU_LIBRARY__ && __DJGPP__]: Add a realloc + declaration that matches the one in the DJGPP libc. + +2006-02-24 Eli Zaretskii + + * glob.c (my_malloc) [WINDOWS32]: Provide a full ISO C prototype, + to avoid compiler warnings. + +2005-06-25 Paul D. Smith + + * fnmatch.h, glob.h [WINDOWS32]: Fix ifdefs in headers. + Fixes Savannah bug #13477. + +2005-03-11 Paul D. Smith + + * glob.c (glob_in_dir): Change FNM_CASEFOLD to be enabled if + HAVE_CASE_INSENSITIVE_FS is defined. + +2003-01-30 Paul D. Smith + + * glob.h: Patch for FreeBSD by Mike Barcroft + Reported by Gerald Pfeifer . On + FreeBSD, declare __size_t to simply size_t. + +2002-04-22 Paul D. Smith + + * Makefile.am: Use automake 1.6. + Use new automake condition USE_LOCAL_GLOB to decide whether or not + to build the local GNU glob library or use the system one. + +1999-09-12 Paul D. Smith + + * fnmatch.c: Last GLIBC version wouldn't compile outside of GLIBC + (undefined reference to internal_function). Update to the latest + version + +1999-09-11 Paul Eggert + + * glob.h (glob): If #defining to glob64, do this before + declaring it, so that all declarations and uses match, and + do not declare glob64, to avoid a declaration clash. + (globfree): Likewise with globfree64. + +1999-09-08 Eli Zaretskii + + * glob.c (prefix_array) [__MSDOS__,WINDOWS32]: Keep the trailing + slash unless DIRNAME is just "x:/". + +1999-09-06 Paul D. Smith + + * fnmatch.c: Update to latest version from GLIBC. + +1999-07-21 Paul D. Smith + + * glob.c, glob.h, fnmatch.c, fnmatch.h: Update to latest version + from GLIBC. + + * fnmatch.c (internal_fnmatch): Use K&R definition syntax, not ANSI. + (__strchrnul): This won't exist outside GLIBC, so create one. + + * glob.c: Move getlogin{,_r} prototypes below glob.h to get __P() + macro. + +1998-08-05 Paul D. Smith + + * configure.in: Remove; configuration for glob is handled by the + make configure.in. + +1998-07-29 Paul D. Smith + + * glob.c, fnmatch.c: New versions from the GLIBC folks (Ulrich + Drepper). Fixes a bug reported by Eli Zaretski. Integrates + DOS/Windows32 support. + +1998-07-27 Kaveh R. Ghazi + + * glob.c (glob): Cast away const on assignment of pattern to dirname. + Cast the return type of __alloca() for traditional C compilers. + +1998-07-23 Paul D. Smith + + * glob.c, fnmatch.c: New versions of these files from the GLIBC + folks (Ulrich Drepper). Had to re-integrate some DOS/Windows + code. + +1998-07-10 Paul D. Smith + + * glob.c (glob_in_dir): If no meta chars exist in PATTERN and + GLOB_NOCHECK is present, don't look for the file--whether it's + found or not, we'll always return it, so why bother searching? + + Also, if we are searching and there are no meta chars, don't + bother trying fnmatch() if the strcmp() fails. + +1998-05-30 Eli Zaretskii + + * glob.c (glob) [__MSDOS__, WINDOWS32]: Compute the directory and + filename parts of the pattern correctly when it includes a drive + spec. Disallow wildcards in the drive spec. Prevent recursion + when dirname is of the form "d:/" or "d:". + (prefix_array) [__MSDOS__, WINDOWS32]: Don't append a slash to + "d:/" and "d:". + +1998-05-13 Paul D. Smith + + * SMakefile, Makefile.ami, glob.c, glob.h, fnmatch.c: Updated from + the latest glibc version. + +1998-04-17 Paul D. Smith + + * configure.in: Create a config.h file instead of setting things + on the compile line. This is because when build.sh runs it merely + passes -DHAVE_CONFIG_H to the glob files, just as it does to the + make files. + * config.h.in: Created by autoheader. + +Tue Aug 12 10:52:34 1997 Paul D. Smith + + * configure.in: Require autoconf 2.12. + + * glob: Updates from latest GNU libc glob code. + + * glob.c,glob.h,fnmatch.h: Change all WIN32 references to WINDOWS32. + + * glob.h: OSF4 defines macros in such a way that GLOB_ALTDIRFUNC + is not defined. Added a test to the #if which defines it if + _GNU_SOURCE is defined; that's set by both glob.c and GNU make. + + * glob.c: SunOS4 w/ cc needs #include , since assert.h + requires stderr but doesn't include stdio.h :-/. + (next_brace_sub): De-protoize function definition. + (glob): Cast __alloca(); on SunOS4 it uses the default return type + of int. + (glob): Irix defines getlogin_r() to return a char*; move the + extern for that into the _LIBC area since it isn't used except in + LIBC anyway. Likewise, move extern getlogin() into the "else". + +Sat Jul 20 21:55:31 1996 Roland McGrath + + Win32 hacks from . + * posix/glob.c [WIN32]: Don't include ; don't use d_ino; + use void * for my_realloc; include for alloca. + (glob) [WIN32]: Use "c:/users/default" for ~ if no HOME variable. + * posix/fnmatch.h [WIN32]: Use prototypes even if [!__STDC__]. + * posix/glob.h: Likewise. + +Fri Jul 19 16:56:41 1996 Roland McGrath + + * posix/glob.h [!_AMIGA && !VMS]: Check this instead of just [!_AMIGA] + for `struct stat;' forward decl. + +Sat Jun 22 10:44:09 1996 Roland McGrath + + * posix/glob.c: Include only [HAVE_ALLOCA_H], not [sparc]. + +Fri Jun 21 00:27:51 1996 Roland McGrath + + * posix/fnmatch.c (fnmatch): Fix \*[*?]+ case to increment name ptr + only for ?s, not for *s. Fix from Chet Ramey. + + +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software +Foundation, Inc. +This file is part of GNU Make. + +GNU Make is free software; you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation; either version 3 of the License, or (at your option) any later +version. + +GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see . diff --git a/glob/Makefile.am b/glob/Makefile.am new file mode 100644 index 0000000..93fd60a --- /dev/null +++ b/glob/Makefile.am @@ -0,0 +1,30 @@ +# -*-Makefile-*-, or close enough +# Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program. If not, see . + +AUTOMAKE_OPTIONS = foreign + +# Only build the library when the system doesn't already have GNU glob. +if USE_LOCAL_GLOB + noinst_LIBRARIES = libglob.a +endif + +libglob_a_SOURCES = glob.c glob.h fnmatch.c fnmatch.h + + +EXTRA_DIST = COPYING.LIB Makefile.ami SCOPTIONS SMakefile \ + configure.bat diff --git a/glob/Makefile.ami b/glob/Makefile.ami new file mode 100644 index 0000000..3fbf7e5 --- /dev/null +++ b/glob/Makefile.ami @@ -0,0 +1,67 @@ +# Makefile for standalone libglob.a (fnmatch, glob). -*-Makefile-*- +# Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program. If not, see . + +# Ultrix 2.2 make doesn't expand the value of VPATH. +VPATH = /glob/ +# This must repeat the value, because configure will remove `VPATH = .'. +srcdir = /glob/ + +CC = sc +RM = delete +CPPFLAGS = +CFLAGS = + +# Information determined by configure. +DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \ + Define HAVE_DIRENT_H + +# How to invoke ar. +AR = join +ARFLAGS = as + +# How to invoke ranlib. +RANLIB = ; + +.PHONY: all +all: glob.lib + +glob.lib : glob.o fnmatch.o + $(AR) $(ARFLAGS) $@ glob.o fnmatch.o + $(RANLIB) $@ + +# For some reason, Unix make wants the dependencies on the source files. +# Otherwise it refuses to use an implicit rule! +# And, get this: it doesn't work to use $(srcdir)foo.c!! +glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c +fnmatch.o: $(srcdir)fnmatch.h fnmatch.c + +OUTPUT_OPTION = +.c.o: + $(CC) IDir "" \ + $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) + +.PHONY: clean realclean glob-clean glob-realclean distclean +clean glob-clean: + -$(RM) glob.lib "#?.o" core +distclean glob-realclean: clean + -$(RM) TAGS tags Makefile config.status config.h config.log +realcean: distclean + +# For inside the C library. +glob.tar glob.tar.Z: + $(MAKE) -C .. $@ diff --git a/glob/Makefile.in b/glob/Makefile.in new file mode 100644 index 0000000..7a63861 --- /dev/null +++ b/glob/Makefile.in @@ -0,0 +1,589 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# -*-Makefile-*-, or close enough +# Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program. If not, see . + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = glob +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/config/depcomp COPYING.LIB ChangeLog +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/intlmacosx.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libglob_a_AR = $(AR) $(ARFLAGS) +libglob_a_LIBADD = +am_libglob_a_OBJECTS = glob.$(OBJEXT) fnmatch.$(OBJEXT) +libglob_a_OBJECTS = $(am_libglob_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libglob_a_SOURCES) +DIST_SOURCES = $(libglob_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLOBINC = @GLOBINC@ +GLOBLIB = @GLOBLIB@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GUILE_CFLAGS = @GUILE_CFLAGS@ +GUILE_LIBS = @GUILE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +KMEM_GROUP = @KMEM_GROUP@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_HOST = @MAKE_HOST@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEED_SETGID = @NEED_SETGID@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +REMOTE = @REMOTE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign + +# Only build the library when the system doesn't already have GNU glob. +@USE_LOCAL_GLOB_TRUE@noinst_LIBRARIES = libglob.a +libglob_a_SOURCES = glob.c glob.h fnmatch.c fnmatch.h +EXTRA_DIST = COPYING.LIB Makefile.ami SCOPTIONS SMakefile \ + configure.bat + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glob/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign glob/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libglob.a: $(libglob_a_OBJECTS) $(libglob_a_DEPENDENCIES) $(EXTRA_libglob_a_DEPENDENCIES) + $(AM_V_at)-rm -f libglob.a + $(AM_V_AR)$(libglob_a_AR) libglob.a $(libglob_a_OBJECTS) $(libglob_a_LIBADD) + $(AM_V_at)$(RANLIB) libglob.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnmatch.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glob.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/glob/SCOPTIONS b/glob/SCOPTIONS new file mode 100644 index 0000000..f89daae --- /dev/null +++ b/glob/SCOPTIONS @@ -0,0 +1,13 @@ +ERRORREXX +OPTIMIZE +NOVERSION +OPTIMIZERTIME +OPTIMIZERALIAS +DEFINE INCLUDEDIR="include:" +DEFINE LIBDIR="lib:" +DEFINE NO_ALLOCA +DEFINE NO_FLOAT +DEFINE NO_ARCHIVES +IGNORE=161 +IGNORE=100 +STARTUP=cres diff --git a/glob/SMakefile b/glob/SMakefile new file mode 100644 index 0000000..0476a15 --- /dev/null +++ b/glob/SMakefile @@ -0,0 +1,67 @@ +# Makefile for standalone distribution of libglob.a (fnmatch, glob). +# Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program. If not, see . + +# Ultrix 2.2 make doesn't expand the value of VPATH. +VPATH = /glob/ +# This must repeat the value, because configure will remove `VPATH = .'. +srcdir = /glob/ + +CC = sc +CPPFLAGS = +CFLAGS = +MAKE = smake +RM = delete + +# Information determined by configure. +DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \ + Define HAVE_DIRENT_H + +# How to invoke ar. +AR = join +ARFLAGS = as + +# How to invoke ranlib. +RANLIB = ; + +.PHONY: all +all: glob.lib + +glob.lib : glob.o fnmatch.o + $(AR) $(ARFLAGS) $@ glob.o fnmatch.o + $(RANLIB) $@ + +# For some reason, Unix make wants the dependencies on the source files. +# Otherwise it refuses to use an implicit rule! +# And, get this: it doesn't work to use $(srcdir)foo.c!! +glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c +fnmatch.o: $(srcdir)fnmatch.h fnmatch.c + +.c.o: + $(CC) IDir "" \ + $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) + +.PHONY: clean realclean glob-clean glob-realclean distclean +clean glob-clean: + -$(RM) -f glob.lib *.o core +distclean glob-realclean: clean + -$(RM) -f TAGS tags Makefile config.status config.h config.log +realcean: distclean + +# For inside the C library. +glob.tar glob.tar.Z: + $(MAKE) -C .. $@ diff --git a/glob/configure.bat b/glob/configure.bat new file mode 100644 index 0000000..672d733 --- /dev/null +++ b/glob/configure.bat @@ -0,0 +1,43 @@ +@echo off +rem Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, +rem 2004, 2005, 2006, 2007 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 Configuring glob for DJGPP +rem This batch file assumes a unix-type "sed" program + +echo # Makefile generated by "configure.bat"> Makefile + +if exist config.sed del config.sed + +echo "s/@srcdir@/./ ">> config.sed +echo "s/@CC@/gcc/ ">> config.sed +echo "s/@CFLAGS@/-O2 -g/ ">> config.sed +echo "s/@CPPFLAGS@/-DHAVE_CONFIG_H -I../ ">> config.sed +echo "s/@AR@/ar/ ">> config.sed +echo "s/@RANLIB@/ranlib/ ">> config.sed +echo "s/@LDFLAGS@// ">> config.sed +echo "s/@DEFS@// ">> config.sed +echo "s/@ALLOCA@// ">> config.sed +echo "s/@LIBS@// ">> config.sed +echo "s/@LIBOBJS@// ">> config.sed +echo "s/^Makefile *:/_Makefile:/ ">> config.sed +echo "s/^config.h *:/_config.h:/ ">> config.sed + +sed -e "s/^\"//" -e "s/\"$//" -e "s/[ ]*$//" config.sed > config2.sed +sed -f config2.sed Makefile.in >> Makefile +del config.sed +del config2.sed diff --git a/glob/fnmatch.c b/glob/fnmatch.c new file mode 100644 index 0000000..4da8c5f --- /dev/null +++ b/glob/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/glob/fnmatch.h b/glob/fnmatch.h new file mode 100644 index 0000000..a788c8e --- /dev/null +++ b/glob/fnmatch.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/glob/glob.c b/glob/glob.c new file mode 100644 index 0000000..f3911bc --- /dev/null +++ b/glob/glob.c @@ -0,0 +1,1432 @@ +/* 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. */ +#ifdef _DIRENT_HAVE_D_TYPE +# define HAVE_D_TYPE 1 +#endif + + +#if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__ +/* Posix does not require that the d_ino field be present, and some + systems do not provide it. */ +# define REAL_DIR_ENTRY(dp) 1 +#else +# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) +#endif /* POSIX */ + +#if defined STDC_HEADERS || defined __GNU_LIBRARY__ +# include +# 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. */ + +# define __alloca alloca + +#endif + +#ifndef __GNU_LIBRARY__ +# define __stat stat +# ifdef STAT_MACROS_BROKEN +# undef S_ISDIR +# endif +# ifndef S_ISDIR +# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +# endif +#endif + +#ifdef _LIBC +# undef strdup +# define strdup(str) __strdup (str) +# define sysconf(id) __sysconf (id) +# define closedir(dir) __closedir (dir) +# define opendir(name) __opendir (name) +# define readdir(str) __readdir (str) +# define getpwnam_r(name, bufp, buf, len, res) \ + __getpwnam_r (name, bufp, buf, len, res) +# ifndef __stat +# define __stat(fname, buf) __xstat (_STAT_VER, fname, buf) +# endif +#endif + +#if !(defined STDC_HEADERS || defined __GNU_LIBRARY__) +# undef size_t +# define size_t unsigned int +#endif + +/* Some system header files erroneously define these. + We want our own definitions from 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 + +#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; + int oldcount; + + if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) + { + __set_errno (EINVAL); + return -1; + } + + /* POSIX requires all slashes to be matched. This means that with + a trailing slash we must match only directories. */ + if (pattern[0] && pattern[strlen (pattern) - 1] == '/') + flags |= GLOB_ONLYDIR; + + if (flags & GLOB_BRACE) + { + const char *begin = strchr (pattern, '{'); + if (begin != NULL) + { + /* Allocate working buffer large enough for our work. Note that + we have at least an opening and closing brace. */ + int firstc; + char *alt_start; + const char *p; + const char *next; + const char *rest; + size_t rest_len; +#ifdef __GNUC__ + char onealt[strlen (pattern) - 1]; +#else + char *onealt = (char *) malloc (strlen (pattern) - 1); + if (onealt == NULL) + { + if (!(flags & GLOB_APPEND)) + globfree (pglob); + return GLOB_NOSPACE; + } +#endif + + /* We know the prefix for all sub-patterns. */ +#ifdef HAVE_MEMPCPY + alt_start = mempcpy (onealt, pattern, begin - pattern); +#else + memcpy (onealt, pattern, begin - pattern); + alt_start = &onealt[begin - pattern]; +#endif + + /* Find the first sub-pattern and at the same time find the + rest after the closing brace. */ + next = next_brace_sub (begin + 1); + if (next == NULL) + { + /* It is an illegal expression. */ +#ifndef __GNUC__ + free (onealt); +#endif + return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob); + } + + /* Now find the end of the whole brace expression. */ + rest = next; + while (*rest != '}') + { + rest = next_brace_sub (rest + 1); + if (rest == NULL) + { + /* It is an illegal expression. */ +#ifndef __GNUC__ + free (onealt); +#endif + return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob); + } + } + /* Please note that we now can be sure the brace expression + is well-formed. */ + rest_len = strlen (++rest) + 1; + + /* We have a brace expression. BEGIN points to the opening {, + NEXT points past the terminator of the first element, and END + points past the final }. We will accumulate result names from + recursive runs for each brace alternative in the buffer using + GLOB_APPEND. */ + + if (!(flags & GLOB_APPEND)) + { + /* This call is to set a new vector, so clear out the + vector so we can append to it. */ + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; + } + firstc = pglob->gl_pathc; + + p = begin + 1; + while (1) + { + int result; + + /* Construct the new glob expression. */ +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len); +#else + memcpy (alt_start, p, next - p); + memcpy (&alt_start[next - p], rest, rest_len); +#endif + + result = glob (onealt, + ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC)) + | GLOB_APPEND), errfunc, pglob); + + /* If we got an error, return it. */ + if (result && result != GLOB_NOMATCH) + { +#ifndef __GNUC__ + free (onealt); +#endif + if (!(flags & GLOB_APPEND)) + globfree (pglob); + return result; + } + + if (*next == '}') + /* We saw the last entry. */ + break; + + p = next + 1; + next = next_brace_sub (p); + assert (next != NULL); + } + +#ifndef __GNUC__ + free (onealt); +#endif + + if (pglob->gl_pathc != firstc) + /* We found some entries. */ + return 0; + else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC))) + return GLOB_NOMATCH; + } + } + + /* Find the filename. */ + filename = strrchr (pattern, '/'); +#if defined __MSDOS__ || defined WINDOWS32 + /* The case of "d:pattern". Since `:' is not allowed in + file names, we can safely assume that wherever it + happens in pattern, it signals the filename part. This + is so we could some day support patterns like "[a-z]:foo". */ + if (filename == NULL) + filename = strchr (pattern, ':'); +#endif /* __MSDOS__ || WINDOWS32 */ + if (filename == NULL) + { + /* This can mean two things: a simple name or "~name". The later + case is nothing but a notation for a directory. */ + if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~') + { + dirname = pattern; + dirlen = strlen (pattern); + + /* Set FILENAME to NULL as a special flag. This is ugly but + other solutions would require much more code. We test for + this special case below. */ + filename = NULL; + } + else + { + filename = pattern; +#ifdef _AMIGA + dirname = ""; +#else + dirname = "."; +#endif + dirlen = 0; + } + } + else if (filename == pattern) + { + /* "/pattern". */ + dirname = "/"; + dirlen = 1; + ++filename; + } + else + { + char *newp; + dirlen = filename - pattern; +#if defined __MSDOS__ || defined WINDOWS32 + if (*filename == ':' + || (filename > pattern + 1 && filename[-1] == ':')) + { + char *drive_spec; + + ++dirlen; + drive_spec = (char *) __alloca (dirlen + 1); +#ifdef HAVE_MEMPCPY + *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0'; +#else + memcpy (drive_spec, pattern, dirlen); + drive_spec[dirlen] = '\0'; +#endif + /* For now, disallow wildcards in the drive spec, to + prevent infinite recursion in glob. */ + if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE))) + return GLOB_NOMATCH; + /* If this is "d:pattern", we need to copy `:' to DIRNAME + as well. If it's "d:/pattern", don't remove the slash + from "d:/", since "d:" and "d:/" are not the same.*/ + } +#endif + newp = (char *) __alloca (dirlen + 1); +#ifdef HAVE_MEMPCPY + *((char *) mempcpy (newp, pattern, dirlen)) = '\0'; +#else + memcpy (newp, pattern, dirlen); + newp[dirlen] = '\0'; +#endif + dirname = newp; + ++filename; + + if (filename[0] == '\0' +#if defined __MSDOS__ || defined WINDOWS32 + && dirname[dirlen - 1] != ':' + && (dirlen < 3 || dirname[dirlen - 2] != ':' + || dirname[dirlen - 1] != '/') +#endif + && dirlen > 1) + /* "pattern/". Expand "pattern", appending slashes. */ + { + int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob); + if (val == 0) + pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK) + | (flags & GLOB_MARK)); + return val; + } + } + + if (!(flags & GLOB_APPEND)) + { + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; + } + + oldcount = pglob->gl_pathc; + +#ifndef VMS + if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~') + { + if (dirname[1] == '\0' || dirname[1] == '/') + { + /* Look up home directory. */ +#ifdef VMS +/* This isn't obvious, RTLs of DECC and VAXC know about "HOME" */ + const char *home_dir = getenv ("SYS$LOGIN"); +#else + const char *home_dir = getenv ("HOME"); +#endif +# ifdef _AMIGA + if (home_dir == NULL || home_dir[0] == '\0') + home_dir = "SYS:"; +# else +# ifdef WINDOWS32 + if (home_dir == NULL || home_dir[0] == '\0') + home_dir = "c:/users/default"; /* poor default */ +# else +# ifdef VMS +/* Again, this isn't obvious, if "HOME" isn't known "SYS$LOGIN" should be set */ + if (home_dir == NULL || home_dir[0] == '\0') + home_dir = "SYS$DISK:[]"; +# else + if (home_dir == NULL || home_dir[0] == '\0') + { + int success; + char *name; +# if defined HAVE_GETLOGIN_R || defined _LIBC + size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1; + + if (buflen == 0) + /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try + a moderate value. */ + buflen = 20; + name = (char *) __alloca (buflen); + + success = getlogin_r (name, buflen) >= 0; +# else + success = (name = getlogin ()) != NULL; +# endif + if (success) + { + struct passwd *p; +# if defined HAVE_GETPWNAM_R || defined _LIBC + size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX); + char *pwtmpbuf; + struct passwd pwbuf; + int save = errno; + + if (pwbuflen == -1) + /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. + Try a moderate value. */ + pwbuflen = 1024; + pwtmpbuf = (char *) __alloca (pwbuflen); + + while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p) + != 0) + { + if (errno != ERANGE) + { + p = NULL; + break; + } + pwbuflen *= 2; + pwtmpbuf = (char *) __alloca (pwbuflen); + __set_errno (save); + } +# else + p = getpwnam (name); +# endif + if (p != NULL) + home_dir = p->pw_dir; + } + } + if (home_dir == NULL || home_dir[0] == '\0') + { + if (flags & GLOB_TILDE_CHECK) + return GLOB_NOMATCH; + else + home_dir = "~"; /* No luck. */ + } +# endif /* VMS */ +# endif /* WINDOWS32 */ +# endif + /* Now construct the full directory. */ + if (dirname[1] == '\0') + dirname = home_dir; + else + { + char *newp; + size_t home_len = strlen (home_dir); + newp = (char *) __alloca (home_len + dirlen); +# ifdef HAVE_MEMPCPY + mempcpy (mempcpy (newp, home_dir, home_len), + &dirname[1], dirlen); +# else + memcpy (newp, home_dir, home_len); + memcpy (&newp[home_len], &dirname[1], dirlen); +# endif + dirname = newp; + } + } +# if !defined _AMIGA && !defined WINDOWS32 && !defined VMS + else + { + char *end_name = strchr (dirname, '/'); + const char *user_name; + const char *home_dir; + + if (end_name == NULL) + user_name = dirname + 1; + else + { + char *newp; + newp = (char *) __alloca (end_name - dirname); +# ifdef HAVE_MEMPCPY + *((char *) mempcpy (newp, dirname + 1, end_name - dirname)) + = '\0'; +# else + memcpy (newp, dirname + 1, end_name - dirname); + newp[end_name - dirname - 1] = '\0'; +# endif + user_name = newp; + } + + /* Look up specific user's home directory. */ + { + struct passwd *p; +# if defined HAVE_GETPWNAM_R || defined _LIBC + size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX); + char *pwtmpbuf; + struct passwd pwbuf; + int save = errno; + + if (buflen == -1) + /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a + moderate value. */ + buflen = 1024; + pwtmpbuf = (char *) __alloca (buflen); + + while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0) + { + if (errno != ERANGE) + { + p = NULL; + break; + } + buflen *= 2; + pwtmpbuf = __alloca (buflen); + __set_errno (save); + } +# else + p = getpwnam (user_name); +# endif + if (p != NULL) + home_dir = p->pw_dir; + else + home_dir = NULL; + } + /* If we found a home directory use this. */ + if (home_dir != NULL) + { + char *newp; + size_t home_len = strlen (home_dir); + size_t rest_len = end_name == NULL ? 0 : strlen (end_name); + newp = (char *) __alloca (home_len + rest_len + 1); +# ifdef HAVE_MEMPCPY + *((char *) mempcpy (mempcpy (newp, home_dir, home_len), + end_name, rest_len)) = '\0'; +# else + memcpy (newp, home_dir, home_len); + memcpy (&newp[home_len], end_name, rest_len); + newp[home_len + rest_len] = '\0'; +# endif + dirname = newp; + } + else + if (flags & GLOB_TILDE_CHECK) + /* We have to regard it as an error if we cannot find the + home directory. */ + return GLOB_NOMATCH; + } +# endif /* Not Amiga && not WINDOWS32 && not VMS. */ + } +#endif /* Not VMS. */ + + /* Now test whether we looked for "~" or "~NAME". In this case we + can give the answer now. */ + if (filename == NULL) + { + struct stat st; + + /* Return the directory if we don't check for error or if it exists. */ + if ((flags & GLOB_NOCHECK) + || (((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_stat) (dirname, &st) + : __stat (dirname, &st)) == 0 + && S_ISDIR (st.st_mode))) + { + pglob->gl_pathv + = (char **) realloc (pglob->gl_pathv, + (pglob->gl_pathc + + ((flags & GLOB_DOOFFS) ? + pglob->gl_offs : 0) + + 1 + 1) * + sizeof (char *)); + if (pglob->gl_pathv == NULL) + return GLOB_NOSPACE; + + if (flags & GLOB_DOOFFS) + while (pglob->gl_pathc < pglob->gl_offs) + pglob->gl_pathv[pglob->gl_pathc++] = NULL; + +#if defined HAVE_STRDUP || defined _LIBC + pglob->gl_pathv[pglob->gl_pathc] = strdup (dirname); +#else + { + size_t len = strlen (dirname) + 1; + char *dircopy = malloc (len); + if (dircopy != NULL) + pglob->gl_pathv[pglob->gl_pathc] = memcpy (dircopy, dirname, + len); + } +#endif + if (pglob->gl_pathv[pglob->gl_pathc] == NULL) + { + free (pglob->gl_pathv); + return GLOB_NOSPACE; + } + pglob->gl_pathv[++pglob->gl_pathc] = NULL; + pglob->gl_flags = flags; + + return 0; + } + + /* Not found. */ + return GLOB_NOMATCH; + } + + if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE))) + { + /* The directory name contains metacharacters, so we + have to glob for the directory, and then glob for + the pattern in each directory found. */ + glob_t dirs; + register int i; + + status = glob (dirname, + ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE)) + | GLOB_NOSORT | GLOB_ONLYDIR), + errfunc, &dirs); + if (status != 0) + return status; + + /* We have successfully globbed the preceding directory name. + For each name we found, call glob_in_dir on it and FILENAME, + appending the results to PGLOB. */ + for (i = 0; i < dirs.gl_pathc; ++i) + { + int old_pathc; + +#ifdef SHELL + { + /* Make globbing interruptible in the bash shell. */ + extern int interrupt_state; + + if (interrupt_state) + { + globfree (&dirs); + globfree (&files); + return GLOB_ABORTED; + } + } +#endif /* SHELL. */ + + old_pathc = pglob->gl_pathc; + status = glob_in_dir (filename, dirs.gl_pathv[i], + ((flags | GLOB_APPEND) + & ~(GLOB_NOCHECK | GLOB_ERR)), + errfunc, pglob); + if (status == GLOB_NOMATCH) + /* No matches in this directory. Try the next. */ + continue; + + if (status != 0) + { + globfree (&dirs); + globfree (pglob); + return status; + } + + /* Stick the directory on the front of each name. */ + if (prefix_array (dirs.gl_pathv[i], + &pglob->gl_pathv[old_pathc], + pglob->gl_pathc - old_pathc)) + { + globfree (&dirs); + globfree (pglob); + return GLOB_NOSPACE; + } + } + + flags |= GLOB_MAGCHAR; + + /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls. + But if we have not found any matching entry and thie GLOB_NOCHECK + flag was set we must return the list consisting of the disrectory + names followed by the filename. */ + if (pglob->gl_pathc == oldcount) + { + /* No matches. */ + if (flags & GLOB_NOCHECK) + { + size_t filename_len = strlen (filename) + 1; + char **new_pathv; + struct stat st; + + /* This is an pessimistic guess about the size. */ + pglob->gl_pathv + = (char **) realloc (pglob->gl_pathv, + (pglob->gl_pathc + + ((flags & GLOB_DOOFFS) ? + pglob->gl_offs : 0) + + dirs.gl_pathc + 1) * + sizeof (char *)); + if (pglob->gl_pathv == NULL) + { + globfree (&dirs); + return GLOB_NOSPACE; + } + + if (flags & GLOB_DOOFFS) + while (pglob->gl_pathc < pglob->gl_offs) + pglob->gl_pathv[pglob->gl_pathc++] = NULL; + + for (i = 0; i < dirs.gl_pathc; ++i) + { + const char *dir = dirs.gl_pathv[i]; + size_t dir_len = strlen (dir); + + /* First check whether this really is a directory. */ + if (((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_stat) (dir, &st) : __stat (dir, &st)) != 0 + || !S_ISDIR (st.st_mode)) + /* No directory, ignore this entry. */ + continue; + + pglob->gl_pathv[pglob->gl_pathc] = malloc (dir_len + 1 + + filename_len); + if (pglob->gl_pathv[pglob->gl_pathc] == NULL) + { + globfree (&dirs); + globfree (pglob); + return GLOB_NOSPACE; + } + +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (mempcpy (pglob->gl_pathv[pglob->gl_pathc], + dir, dir_len), + "/", 1), + filename, filename_len); +#else + memcpy (pglob->gl_pathv[pglob->gl_pathc], dir, dir_len); + pglob->gl_pathv[pglob->gl_pathc][dir_len] = '/'; + memcpy (&pglob->gl_pathv[pglob->gl_pathc][dir_len + 1], + filename, filename_len); +#endif + ++pglob->gl_pathc; + } + + pglob->gl_pathv[pglob->gl_pathc] = NULL; + pglob->gl_flags = flags; + + /* Now we know how large the gl_pathv vector must be. */ + new_pathv = (char **) realloc (pglob->gl_pathv, + ((pglob->gl_pathc + 1) + * sizeof (char *))); + if (new_pathv != NULL) + pglob->gl_pathv = new_pathv; + } + else + return GLOB_NOMATCH; + } + + globfree (&dirs); + } + else + { + status = glob_in_dir (filename, dirname, flags, errfunc, pglob); + if (status != 0) + return status; + + if (dirlen > 0) + { + /* Stick the directory on the front of each name. */ + int ignore = oldcount; + + if ((flags & GLOB_DOOFFS) && ignore < pglob->gl_offs) + ignore = pglob->gl_offs; + + if (prefix_array (dirname, + &pglob->gl_pathv[ignore], + pglob->gl_pathc - ignore)) + { + globfree (pglob); + return GLOB_NOSPACE; + } + } + } + + if (flags & GLOB_MARK) + { + /* Append slashes to directory names. */ + int i; + struct stat st; + for (i = oldcount; i < pglob->gl_pathc; ++i) + if (((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st) + : __stat (pglob->gl_pathv[i], &st)) == 0 + && S_ISDIR (st.st_mode)) + { + size_t len = strlen (pglob->gl_pathv[i]) + 2; + char *new = realloc (pglob->gl_pathv[i], len); + if (new == NULL) + { + globfree (pglob); + return GLOB_NOSPACE; + } + strcpy (&new[len - 2], "/"); + pglob->gl_pathv[i] = new; + } + } + + if (!(flags & GLOB_NOSORT)) + { + /* Sort the vector. */ + int non_sort = oldcount; + + if ((flags & GLOB_DOOFFS) && pglob->gl_offs > oldcount) + non_sort = pglob->gl_offs; + + qsort ((__ptr_t) &pglob->gl_pathv[non_sort], + pglob->gl_pathc - non_sort, + sizeof (char *), collated_compare); + } + + return 0; +} + + +/* Free storage allocated in PGLOB by a previous `glob' call. */ +void +globfree (pglob) + register glob_t *pglob; +{ + if (pglob->gl_pathv != NULL) + { + register int i; + for (i = 0; i < pglob->gl_pathc; ++i) + if (pglob->gl_pathv[i] != NULL) + free ((__ptr_t) pglob->gl_pathv[i]); + free ((__ptr_t) pglob->gl_pathv); + } +} + + +/* Do a collated comparison of A and B. */ +static int +collated_compare (a, b) + const __ptr_t a; + const __ptr_t b; +{ + const char *const s1 = *(const char *const * const) a; + const char *const s2 = *(const char *const * const) b; + + if (s1 == s2) + return 0; + if (s1 == NULL) + return 1; + if (s2 == NULL) + return -1; + return strcoll (s1, s2); +} + + +/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's + elements in place. Return nonzero if out of memory, zero if successful. + A slash is inserted between DIRNAME and each elt of ARRAY, + unless DIRNAME is just "/". Each old element of ARRAY is freed. */ +static int +prefix_array (dirname, array, n) + const char *dirname; + char **array; + size_t n; +{ + register size_t i; + size_t dirlen = strlen (dirname); +#if defined __MSDOS__ || defined WINDOWS32 + int sep_char = '/'; +# define DIRSEP_CHAR sep_char +#else +# define DIRSEP_CHAR '/' +#endif + + if (dirlen == 1 && dirname[0] == '/') + /* DIRNAME is just "/", so normal prepending would get us "//foo". + We want "/foo" instead, so don't prepend any chars from DIRNAME. */ + dirlen = 0; +#if defined __MSDOS__ || defined WINDOWS32 + else if (dirlen > 1) + { + if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':') + /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */ + --dirlen; + else if (dirname[dirlen - 1] == ':') + { + /* DIRNAME is "d:". Use `:' instead of `/'. */ + --dirlen; + sep_char = ':'; + } + } +#endif + + for (i = 0; i < n; ++i) + { + size_t eltlen = strlen (array[i]) + 1; + char *new = (char *) malloc (dirlen + 1 + eltlen); + if (new == NULL) + { + while (i > 0) + free ((__ptr_t) array[--i]); + return 1; + } + +#ifdef HAVE_MEMPCPY + { + char *endp = (char *) mempcpy (new, dirname, dirlen); + *endp++ = DIRSEP_CHAR; + mempcpy (endp, array[i], eltlen); + } +#else + memcpy (new, dirname, dirlen); + new[dirlen] = DIRSEP_CHAR; + memcpy (&new[dirlen + 1], array[i], eltlen); +#endif + free ((__ptr_t) array[i]); + array[i] = new; + } + + return 0; +} + + +/* We must not compile this function twice. */ +#if !defined _LIBC || !defined NO_GLOB_PATTERN_P +/* Return nonzero if PATTERN contains any metacharacters. + Metacharacters can be quoted with backslashes if QUOTE is nonzero. */ +int +__glob_pattern_p (pattern, quote) + const char *pattern; + int quote; +{ + register const char *p; + int open = 0; + + for (p = pattern; *p != '\0'; ++p) + switch (*p) + { + case '?': + case '*': + return 1; + + case '\\': + if (quote && p[1] != '\0') + ++p; + break; + + case '[': + open = 1; + break; + + case ']': + if (open) + return 1; + break; + } + + return 0; +} +# ifdef _LIBC +weak_alias (__glob_pattern_p, glob_pattern_p) +# endif +#endif + + +/* Like `glob', but PATTERN is a final pathname component, + and matches are searched for in DIRECTORY. + The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done. + The GLOB_APPEND flag is assumed to be set (always appends). */ +static int +glob_in_dir (pattern, directory, flags, errfunc, pglob) + const char *pattern; + const char *directory; + int flags; + int (*errfunc) __P ((const char *, int)); + glob_t *pglob; +{ + __ptr_t stream = NULL; + + struct globlink + { + struct globlink *next; + char *name; + }; + struct globlink *names = NULL; + size_t nfound; + int meta; + int save; + +#ifdef VMS + if (*directory == 0) + directory = "[]"; +#endif + meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)); + if (meta == 0) + { + if (flags & (GLOB_NOCHECK|GLOB_NOMAGIC)) + /* We need not do any tests. The PATTERN contains no meta + characters and we must not return an error therefore the + result will always contain exactly one name. */ + flags |= GLOB_NOCHECK; + else + { + /* Since we use the normal file functions we can also use stat() + to verify the file is there. */ + struct stat st; + size_t patlen = strlen (pattern); + size_t dirlen = strlen (directory); + char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1); + +# ifdef HAVE_MEMPCPY + mempcpy (mempcpy (mempcpy (fullname, directory, dirlen), + "/", 1), + pattern, patlen + 1); +# else + memcpy (fullname, directory, dirlen); + fullname[dirlen] = '/'; + memcpy (&fullname[dirlen + 1], pattern, patlen + 1); +# endif + if (((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_stat) (fullname, &st) + : __stat (fullname, &st)) == 0) + /* We found this file to be existing. Now tell the rest + of the function to copy this name into the result. */ + flags |= GLOB_NOCHECK; + } + + nfound = 0; + } + else + { + if (pattern[0] == '\0') + { + /* This is a special case for matching directories like in + "*a/". */ + names = (struct globlink *) __alloca (sizeof (struct globlink)); + names->name = (char *) malloc (1); + if (names->name == NULL) + goto memory_error; + names->name[0] = '\0'; + names->next = NULL; + nfound = 1; + meta = 0; + } + else + { + stream = ((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_opendir) (directory) + : (__ptr_t) opendir (directory)); + if (stream == NULL) + { + if (errno != ENOTDIR + && ((errfunc != NULL && (*errfunc) (directory, errno)) + || (flags & GLOB_ERR))) + return GLOB_ABORTED; + nfound = 0; + meta = 0; + } + else + { + int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) + | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0) +#if defined HAVE_CASE_INSENSITIVE_FS + | FNM_CASEFOLD +#endif + ); + nfound = 0; + flags |= GLOB_MAGCHAR; + + while (1) + { + const char *name; + size_t len; + struct dirent *d = ((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_readdir) (stream) + : readdir ((DIR *) stream)); + if (d == NULL) + break; + if (! REAL_DIR_ENTRY (d)) + continue; + +#ifdef HAVE_D_TYPE + /* If we shall match only directories use the information + provided by the dirent call if possible. */ + if ((flags & GLOB_ONLYDIR) + && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR) + continue; +#endif + + name = d->d_name; + + if (fnmatch (pattern, name, fnm_flags) == 0) + { + struct globlink *new = (struct globlink *) + __alloca (sizeof (struct globlink)); + len = NAMLEN (d); + new->name = (char *) malloc (len + 1); + if (new->name == NULL) + goto memory_error; +#ifdef HAVE_MEMPCPY + *((char *) mempcpy ((__ptr_t) new->name, name, len)) + = '\0'; +#else + memcpy ((__ptr_t) new->name, name, len); + new->name[len] = '\0'; +#endif + new->next = names; + names = new; + ++nfound; + } + } + } + } + } + + if (nfound == 0 && (flags & GLOB_NOCHECK)) + { + size_t len = strlen (pattern); + nfound = 1; + names = (struct globlink *) __alloca (sizeof (struct globlink)); + names->next = NULL; + names->name = (char *) malloc (len + 1); + if (names->name == NULL) + goto memory_error; +#ifdef HAVE_MEMPCPY + *((char *) mempcpy (names->name, pattern, len)) = '\0'; +#else + memcpy (names->name, pattern, len); + names->name[len] = '\0'; +#endif + } + + if (nfound != 0) + { + pglob->gl_pathv + = (char **) realloc (pglob->gl_pathv, + (pglob->gl_pathc + + ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) + + nfound + 1) * + sizeof (char *)); + if (pglob->gl_pathv == NULL) + goto memory_error; + + if (flags & GLOB_DOOFFS) + while (pglob->gl_pathc < pglob->gl_offs) + pglob->gl_pathv[pglob->gl_pathc++] = NULL; + + for (; names != NULL; names = names->next) + pglob->gl_pathv[pglob->gl_pathc++] = names->name; + pglob->gl_pathv[pglob->gl_pathc] = NULL; + + pglob->gl_flags = flags; + } + + save = errno; + if (stream != NULL) + { + if (flags & GLOB_ALTDIRFUNC) + (*pglob->gl_closedir) (stream); + else + closedir ((DIR *) stream); + } + __set_errno (save); + + return nfound == 0 ? GLOB_NOMATCH : 0; + + memory_error: + { + int save = errno; + if (flags & GLOB_ALTDIRFUNC) + (*pglob->gl_closedir) (stream); + else + closedir ((DIR *) stream); + __set_errno (save); + } + while (names != NULL) + { + if (names->name != NULL) + free ((__ptr_t) names->name); + names = names->next; + } + return GLOB_NOSPACE; +} + +#endif /* Not ELIDE_CODE. */ diff --git a/glob/glob.h b/glob/glob.h new file mode 100644 index 0000000..0992de3 --- /dev/null +++ b/glob/glob.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/gmk-default.h b/gmk-default.h new file mode 100644 index 0000000..9fa09a6 --- /dev/null +++ b/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/gmk-default.scm b/gmk-default.scm new file mode 100644 index 0000000..fa19d3c --- /dev/null +++ b/gmk-default.scm @@ -0,0 +1,53 @@ +;; Contents of the (gnu make) Guile module +;; Copyright (C) 2011-2014 Free 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/gnumake.h b/gnumake.h new file mode 100644 index 0000000..fd0b3a4 --- /dev/null +++ b/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-2014 Free 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/guile.c b/guile.c new file mode 100644 index 0000000..7c9a015 --- /dev/null +++ b/guile.c @@ -0,0 +1,159 @@ +/* GNU Guile interface for GNU Make. +Copyright (C) 2011-2014 Free 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 gmk_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 gmk_floc *flocp UNUSED) +{ + return 1; +} + +#endif diff --git a/hash.c b/hash.c new file mode 100644 index 0000000..7b4b271 --- /dev/null +++ b/hash.c @@ -0,0 +1,330 @@ +/* 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" + +#define CALLOC(t, n) ((t *) xcalloc (sizeof (t) * (n))) +#define MALLOC(t, n) ((t *) xmalloc (sizeof (t) * (n))) +#define REALLOC(o, t, n) ((t *) xrealloc ((o), sizeof (t) * (n))) +#define CLONE(o, t, n) ((t *) memcpy (MALLOC (t, (n)), (o), sizeof (t) * (n))) + +static void hash_rehash __P((struct hash_table* ht)); +static unsigned long round_up_2 __P((unsigned long rough)); + +/* Implement double hashing with open addressing. The table size is + always a power of two. The secondary ('increment') hash function + is forced to return an odd-value, in order to be relatively prime + to the table size. This guarantees that the increment can + potentially hit every slot in the table during collision + resolution. */ + +void *hash_deleted_item = &hash_deleted_item; + +/* Force the table size to be a power of two, possibly rounding up the + given size. */ + +void +hash_init (struct hash_table *ht, unsigned long size, + hash_func_t hash_1, hash_func_t hash_2, hash_cmp_func_t hash_cmp) +{ + ht->ht_size = round_up_2 (size); + ht->ht_empty_slots = ht->ht_size; + ht->ht_vec = (void**) CALLOC (struct token *, ht->ht_size); + if (ht->ht_vec == 0) + { + fprintf (stderr, _("can't allocate %lu bytes for hash table: memory exhausted"), + ht->ht_size * (unsigned long) sizeof (struct token *)); + exit (MAKE_TROUBLE); + } + + ht->ht_capacity = ht->ht_size - (ht->ht_size / 16); /* 93.75% loading factor */ + ht->ht_fill = 0; + ht->ht_collisions = 0; + ht->ht_lookups = 0; + ht->ht_rehashes = 0; + ht->ht_hash_1 = hash_1; + ht->ht_hash_2 = hash_2; + ht->ht_compare = hash_cmp; +} + +/* Load an array of items into 'ht'. */ + +void +hash_load (struct hash_table *ht, void *item_table, + unsigned long cardinality, unsigned long size) +{ + char *items = (char *) item_table; + while (cardinality--) + { + hash_insert (ht, items); + items += size; + } +} + +/* Returns the address of the table slot matching 'key'. If 'key' is + not found, return the address of an empty slot suitable for + inserting 'key'. The caller is responsible for incrementing + ht_fill on insertion. */ + +void ** +hash_find_slot (struct hash_table *ht, const void *key) +{ + void **slot; + void **deleted_slot = 0; + unsigned int hash_2 = 0; + unsigned int hash_1 = (*ht->ht_hash_1) (key); + + ht->ht_lookups++; + for (;;) + { + hash_1 &= (ht->ht_size - 1); + slot = &ht->ht_vec[hash_1]; + + if (*slot == 0) + return (deleted_slot ? deleted_slot : slot); + if (*slot == hash_deleted_item) + { + if (deleted_slot == 0) + deleted_slot = slot; + } + else + { + if (key == *slot) + return slot; + if ((*ht->ht_compare) (key, *slot) == 0) + return slot; + ht->ht_collisions++; + } + if (!hash_2) + hash_2 = (*ht->ht_hash_2) (key) | 1; + hash_1 += hash_2; + } +} + +void * +hash_find_item (struct hash_table *ht, const void *key) +{ + void **slot = hash_find_slot (ht, key); + return ((HASH_VACANT (*slot)) ? 0 : *slot); +} + +void * +hash_insert (struct hash_table *ht, const void *item) +{ + void **slot = hash_find_slot (ht, item); + const void *old_item = *slot; + hash_insert_at (ht, item, slot); + return (void *)((HASH_VACANT (old_item)) ? 0 : old_item); +} + +void * +hash_insert_at (struct hash_table *ht, const void *item, const void *slot) +{ + const void *old_item = *(void **) slot; + if (HASH_VACANT (old_item)) + { + ht->ht_fill++; + if (old_item == 0) + ht->ht_empty_slots--; + old_item = item; + } + *(void const **) slot = item; + if (ht->ht_empty_slots < ht->ht_size - ht->ht_capacity) + { + hash_rehash (ht); + return (void *) hash_find_slot (ht, item); + } + else + return (void *) slot; +} + +void * +hash_delete (struct hash_table *ht, const void *item) +{ + void **slot = hash_find_slot (ht, item); + return hash_delete_at (ht, slot); +} + +void * +hash_delete_at (struct hash_table *ht, const void *slot) +{ + void *item = *(void **) slot; + if (!HASH_VACANT (item)) + { + *(void const **) slot = hash_deleted_item; + ht->ht_fill--; + return item; + } + else + return 0; +} + +void +hash_free_items (struct hash_table *ht) +{ + void **vec = ht->ht_vec; + void **end = &vec[ht->ht_size]; + for (; vec < end; vec++) + { + void *item = *vec; + if (!HASH_VACANT (item)) + free (item); + *vec = 0; + } + ht->ht_fill = 0; + ht->ht_empty_slots = ht->ht_size; +} + +void +hash_delete_items (struct hash_table *ht) +{ + void **vec = ht->ht_vec; + void **end = &vec[ht->ht_size]; + for (; vec < end; vec++) + *vec = 0; + ht->ht_fill = 0; + ht->ht_collisions = 0; + ht->ht_lookups = 0; + ht->ht_rehashes = 0; + ht->ht_empty_slots = ht->ht_size; +} + +void +hash_free (struct hash_table *ht, int free_items) +{ + if (free_items) + hash_free_items (ht); + else + { + ht->ht_fill = 0; + ht->ht_empty_slots = ht->ht_size; + } + free (ht->ht_vec); + ht->ht_vec = 0; + ht->ht_capacity = 0; +} + +void +hash_map (struct hash_table *ht, hash_map_func_t map) +{ + void **slot; + void **end = &ht->ht_vec[ht->ht_size]; + + for (slot = ht->ht_vec; slot < end; slot++) + { + if (!HASH_VACANT (*slot)) + (*map) (*slot); + } +} + +void +hash_map_arg (struct hash_table *ht, hash_map_arg_func_t map, void *arg) +{ + void **slot; + void **end = &ht->ht_vec[ht->ht_size]; + + for (slot = ht->ht_vec; slot < end; slot++) + { + if (!HASH_VACANT (*slot)) + (*map) (*slot, arg); + } +} + +/* Double the size of the hash table in the event of overflow... */ + +static void +hash_rehash (struct hash_table *ht) +{ + unsigned long old_ht_size = ht->ht_size; + void **old_vec = ht->ht_vec; + void **ovp; + + if (ht->ht_fill >= ht->ht_capacity) + { + ht->ht_size *= 2; + ht->ht_capacity = ht->ht_size - (ht->ht_size >> 4); + } + ht->ht_rehashes++; + ht->ht_vec = (void **) CALLOC (struct token *, ht->ht_size); + + for (ovp = old_vec; ovp < &old_vec[old_ht_size]; ovp++) + { + if (! HASH_VACANT (*ovp)) + { + void **slot = hash_find_slot (ht, *ovp); + *slot = *ovp; + } + } + ht->ht_empty_slots = ht->ht_size - ht->ht_fill; + free (old_vec); +} + +void +hash_print_stats (struct hash_table *ht, FILE *out_FILE) +{ + /* GKM FIXME: honor NO_FLOAT */ + fprintf (out_FILE, _("Load=%ld/%ld=%.0f%%, "), ht->ht_fill, ht->ht_size, + 100.0 * (double) ht->ht_fill / (double) ht->ht_size); + fprintf (out_FILE, _("Rehash=%d, "), ht->ht_rehashes); + fprintf (out_FILE, _("Collisions=%ld/%ld=%.0f%%"), ht->ht_collisions, ht->ht_lookups, + (ht->ht_lookups + ? (100.0 * (double) ht->ht_collisions / (double) ht->ht_lookups) + : 0)); +} + +/* Dump all items into a NULL-terminated vector. Use the + user-supplied vector, or malloc one. */ + +void ** +hash_dump (struct hash_table *ht, void **vector_0, qsort_cmp_t compare) +{ + void **vector; + void **slot; + void **end = &ht->ht_vec[ht->ht_size]; + + if (vector_0 == 0) + vector_0 = MALLOC (void *, ht->ht_fill + 1); + vector = vector_0; + + for (slot = ht->ht_vec; slot < end; slot++) + if (!HASH_VACANT (*slot)) + *vector++ = *slot; + *vector = 0; + + if (compare) + qsort (vector_0, ht->ht_fill, sizeof (void *), compare); + return vector_0; +} + +/* Round a given number up to the nearest power of 2. */ + +static unsigned long +round_up_2 (unsigned long n) +{ + n |= (n >> 1); + n |= (n >> 2); + n |= (n >> 4); + n |= (n >> 8); + n |= (n >> 16); + +#if !defined(HAVE_LIMITS_H) || ULONG_MAX > 4294967295 + /* We only need this on systems where unsigned long is >32 bits. */ + n |= (n >> 32); +#endif + + return n + 1; +} diff --git a/hash.h b/hash.h new file mode 100644 index 0000000..960cbd7 --- /dev/null +++ b/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 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) - 1; \ + while (*++_key_) \ + (RESULT) += (*_key_ << (_key_[1] & 0xf)); \ +} while (0) +#define return_STRING_HASH_1(KEY) do { \ + unsigned long _result_ = 0; \ + STRING_HASH_1 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define STRING_HASH_2(KEY, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + while (*++_key_) \ + (RESULT) += (*_key_ << (_key_[1] & 0x7)); \ +} while (0) +#define return_STRING_HASH_2(KEY) do { \ + unsigned long _result_ = 0; \ + STRING_HASH_2 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define STRING_COMPARE(X, Y, RESULT) do { \ + RESULT = (X) == (Y) ? 0 : strcmp ((X), (Y)); \ +} while (0) +#define return_STRING_COMPARE(X, Y) do { \ + return (X) == (Y) ? 0 : strcmp ((X), (Y)); \ +} while (0) + + +#define STRING_N_HASH_1(KEY, N, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + int _n_ = (N); \ + if (_n_) \ + while (--_n_ && *++_key_) \ + (RESULT) += (*_key_ << (_key_[1] & 0xf)); \ + (RESULT) += *++_key_; \ +} while (0) +#define return_STRING_N_HASH_1(KEY, N) do { \ + unsigned long _result_ = 0; \ + STRING_N_HASH_1 ((KEY), (N), _result_); \ + return _result_; \ +} while (0) + +#define STRING_N_HASH_2(KEY, N, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + int _n_ = (N); \ + if (_n_) \ + while (--_n_ && *++_key_) \ + (RESULT) += (*_key_ << (_key_[1] & 0x7)); \ + (RESULT) += *++_key_; \ +} while (0) +#define return_STRING_N_HASH_2(KEY, N) do { \ + unsigned long _result_ = 0; \ + STRING_N_HASH_2 ((KEY), (N), _result_); \ + return _result_; \ +} while (0) + +#define STRING_N_COMPARE(X, Y, N, RESULT) do { \ + RESULT = (X) == (Y) ? 0 : strncmp ((X), (Y), (N)); \ +} while (0) +#define return_STRING_N_COMPARE(X, Y, N) do { \ + return (X) == (Y) ? 0 : strncmp ((X), (Y), (N)); \ +} while (0) + +#ifdef HAVE_CASE_INSENSITIVE_FS + +/* hash and comparison macros for case-insensitive string _key_s. */ + +#define ISTRING_HASH_1(KEY, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + while (*++_key_) \ + (RESULT) += ((isupper (*_key_) ? tolower (*_key_) : *_key_) << (_key_[1] & 0xf)); \ +} while (0) +#define return_ISTRING_HASH_1(KEY) do { \ + unsigned long _result_ = 0; \ + ISTRING_HASH_1 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define ISTRING_HASH_2(KEY, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + while (*++_key_) \ + (RESULT) += ((isupper (*_key_) ? tolower (*_key_) : *_key_) << (_key_[1] & 0x7)); \ +} while (0) +#define return_ISTRING_HASH_2(KEY) do { \ + unsigned long _result_ = 0; \ + ISTRING_HASH_2 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define ISTRING_COMPARE(X, Y, RESULT) do { \ + RESULT = (X) == (Y) ? 0 : strcasecmp ((X), (Y)); \ +} while (0) +#define return_ISTRING_COMPARE(X, Y) do { \ + return (X) == (Y) ? 0 : strcasecmp ((X), (Y)); \ +} while (0) + +#else + +#define ISTRING_HASH_1(KEY, RESULT) STRING_HASH_1 ((KEY), (RESULT)) +#define return_ISTRING_HASH_1(KEY) return_STRING_HASH_1 (KEY) + +#define ISTRING_HASH_2(KEY, RESULT) STRING_HASH_2 ((KEY), (RESULT)) +#define return_ISTRING_HASH_2(KEY) return_STRING_HASH_2 (KEY) + +#define ISTRING_COMPARE(X, Y, RESULT) STRING_COMPARE ((X), (Y), (RESULT)) +#define return_ISTRING_COMPARE(X, Y) return_STRING_COMPARE ((X), (Y)) + +#endif + +/* hash and comparison macros for integer _key_s. */ + +#define INTEGER_HASH_1(KEY, RESULT) do { \ + (RESULT) += ((unsigned long)(KEY)); \ +} while (0) +#define return_INTEGER_HASH_1(KEY) do { \ + unsigned long _result_ = 0; \ + INTEGER_HASH_1 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define INTEGER_HASH_2(KEY, RESULT) do { \ + (RESULT) += ~((unsigned long)(KEY)); \ +} while (0) +#define return_INTEGER_HASH_2(KEY) do { \ + unsigned long _result_ = 0; \ + INTEGER_HASH_2 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define INTEGER_COMPARE(X, Y, RESULT) do { \ + (RESULT) = X - Y; \ +} while (0) +#define return_INTEGER_COMPARE(X, Y) do { \ + int _result_; \ + INTEGER_COMPARE (X, Y, _result_); \ + return _result_; \ +} while (0) + +/* hash and comparison macros for address keys. */ + +#define ADDRESS_HASH_1(KEY, RESULT) INTEGER_HASH_1 (((unsigned long)(KEY)) >> 3, (RESULT)) +#define ADDRESS_HASH_2(KEY, RESULT) INTEGER_HASH_2 (((unsigned long)(KEY)) >> 3, (RESULT)) +#define ADDRESS_COMPARE(X, Y, RESULT) INTEGER_COMPARE ((X), (Y), (RESULT)) +#define return_ADDRESS_HASH_1(KEY) return_INTEGER_HASH_1 (((unsigned long)(KEY)) >> 3) +#define return_ADDRESS_HASH_2(KEY) return_INTEGER_HASH_2 (((unsigned long)(KEY)) >> 3) +#define return_ADDRESS_COMPARE(X, Y) return_INTEGER_COMPARE ((X), (Y)) + +#endif /* not _hash_h_ */ diff --git a/implicit.c b/implicit.c new file mode 100644 index 0000000..8e1d541 --- /dev/null +++ b/implicit.c @@ -0,0 +1,998 @@ +/* Implicit rule searching for GNU Make. +Copyright (C) 1988-2014 Free 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, unsigned int *length) +{ + const char *p = buffer, *beg; + char c; + + /* Skip any leading whitespace. */ + while (isblank ((unsigned char)*p)) + ++p; + + beg = p; + c = *(p++); + + if (c == '\0') + return 0; + + + /* We already found the first value of "c", above. */ + while (1) + { + char closeparen; + int count; + + switch (c) + { + case '\0': + case ' ': + case '\t': + goto done_word; + + case '$': + c = *(p++); + if (c == '$') + break; + + /* This is a variable reference, so read it to the matching + close paren. */ + + if (c == '(') + closeparen = ')'; + else if (c == '{') + closeparen = '}'; + else + /* This is a single-letter variable reference. */ + break; + + for (count = 0; *p != '\0'; ++p) + { + if (*p == c) + ++count; + else if (*p == closeparen && --count < 0) + { + ++p; + break; + } + } + break; + + case '|': + goto done; + + default: + break; + } + + c = *(p++); + } + done_word: + --p; + + done: + if (length) + *length = p - beg; + + return beg; +} + +/* This structure stores information about the expanded prerequisites for a + pattern rule. NAME is always set to the strcache'd name of the prereq. + FILE and PATTERN will be set for intermediate files only. IGNORE_MTIME is + copied from the prerequisite we expanded. + */ +struct patdeps + { + const char *name; + const char *pattern; + struct file *file; + unsigned int ignore_mtime : 1; + }; + +/* This structure stores information about pattern rules that we need + to try. +*/ +struct tryrule + { + struct rule *rule; + + /* Index of the target in this rule that matched the file. */ + unsigned int matches; + + /* Stem length for this match. */ + unsigned int stemlen; + + /* Definition order of this rule. Used to implement stable sort.*/ + unsigned int order; + + /* Nonzero if the LASTSLASH logic was used in matching this rule. */ + char checked_lastslash; + }; + +int +stemlen_compare (const void *v1, const void *v2) +{ + const struct tryrule *r1 = v1; + const struct tryrule *r2 = v2; + int r = r1->stemlen - r2->stemlen; + return r != 0 ? r : (int)(r1->order - r2->order); +} + +/* Search the pattern rules for a rule with an existing dependency to make + FILE. If a rule is found, the appropriate commands and deps are put in FILE + and 1 is returned. If not, 0 is returned. + + If ARCHIVE is nonzero, FILE->name is of the form "LIB(MEMBER)". A rule for + "(MEMBER)" will be searched for, and "(MEMBER)" will not be chopped up into + directory and filename parts. + + If an intermediate file is found by pattern search, the intermediate file + is set up as a target by the recursive call and is also made a dependency + of FILE. + + DEPTH is used for debugging messages. */ + +static int +pattern_search (struct file *file, int archive, + unsigned int depth, unsigned int recursions) +{ + /* Filename we are searching for a rule for. */ + const char *filename = archive ? strchr (file->name, '(') : file->name; + + /* Length of FILENAME. */ + unsigned int namelen = strlen (filename); + + /* The last slash in FILENAME (or nil if there is none). */ + const char *lastslash; + + /* This is a file-object used as an argument in + recursive calls. It never contains any data + except during a recursive call. */ + struct file *int_file = 0; + + /* List of dependencies found recursively. */ + unsigned int max_deps = max_pattern_deps; + struct patdeps *deplist = xmalloc (max_deps * sizeof (struct patdeps)); + struct patdeps *pat = deplist; + + /* Names of possible dependencies are constructed in this buffer. */ + char *depname = alloca (namelen + max_pattern_dep_length); + + /* The start and length of the stem of FILENAME for the current rule. */ + const char *stem = 0; + unsigned int stemlen = 0; + unsigned int fullstemlen = 0; + + /* Buffer in which we store all the rules that are possibly applicable. */ + struct tryrule *tryrules = xmalloc (num_pattern_rules * max_pattern_targets + * sizeof (struct tryrule)); + + /* Number of valid elements in TRYRULES. */ + unsigned int nrules; + + /* The index in TRYRULES of the rule we found. */ + unsigned int foundrule; + + /* Nonzero if should consider intermediate files as dependencies. */ + int intermed_ok; + + /* Nonzero if we have initialized file variables for this target. */ + int file_vars_initialized = 0; + + /* Nonzero if we have matched a pattern-rule target + that is not just '%'. */ + int specific_rule_matched = 0; + + unsigned int ri; /* uninit checks OK */ + struct rule *rule; + + char *pathdir = NULL; + unsigned long pathlen; + + PATH_VAR (stem_str); /* @@ Need to get rid of stem, stemlen, etc. */ + +#ifndef NO_ARCHIVES + if (archive || ar_name (filename)) + lastslash = 0; + else +#endif + { + /* Set LASTSLASH to point at the last slash in FILENAME + but not counting any slash at the end. (foo/bar/ counts as + bar/ in directory foo/, not empty in directory foo/bar/.) */ +#ifdef VMS + lastslash = strrchr (filename, ']'); + if (lastslash == 0) + lastslash = strrchr (filename, ':'); +#else + lastslash = strrchr (filename, '/'); +#ifdef HAVE_DOS_PATHS + /* Handle backslashes (possibly mixed with forward slashes) + and the case of "d:file". */ + { + char *bslash = strrchr (filename, '\\'); + if (lastslash == 0 || bslash > lastslash) + lastslash = bslash; + if (lastslash == 0 && filename[0] && filename[1] == ':') + lastslash = filename + 1; + } +#endif +#endif + if (lastslash != 0 && lastslash[1] == '\0') + lastslash = 0; + } + + pathlen = lastslash - filename + 1; + + /* First see which pattern rules match this target and may be considered. + Put them in TRYRULES. */ + + nrules = 0; + for (rule = pattern_rules; rule != 0; rule = rule->next) + { + unsigned int ti; + + /* If the pattern rule has deps but no commands, ignore it. + Users cancel built-in rules by redefining them without commands. */ + if (rule->deps != 0 && rule->cmds == 0) + continue; + + /* If this rule is in use by a parent pattern_search, + don't use it here. */ + if (rule->in_use) + { + DBS (DB_IMPLICIT, (_("Avoiding implicit rule recursion.\n"))); + continue; + } + + for (ti = 0; ti < rule->num; ++ti) + { + const char *target = rule->targets[ti]; + const char *suffix = rule->suffixes[ti]; + int 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 = (strchr (target, ']') == 0 + && strchr (target, ':') == 0); +#else + check_lastslash = strchr (target, '/') == 0; +#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 +#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; + int check_lastslash; + unsigned int failed = 0; + int file_variables_set = 0; + unsigned int deps_found = 0; + /* NPTR points to the part of the prereq we haven't processed. */ + const char *nptr = 0; + const char *dir = NULL; + int order_only = 0; + unsigned int matches; + + rule = tryrules[ri].rule; + + /* RULE is nil when we discover that a rule, already placed in + TRYRULES, should not be applied. */ + if (rule == 0) + continue; + + /* Reject any terminal rules if we're looking to make intermediate + files. */ + if (intermed_ok && rule->terminal) + continue; + + /* From the lengths of the filename and the matching pattern parts, + find the stem: the part of the filename that matches the %. */ + matches = tryrules[ri].matches; + stem = filename + (rule->suffixes[matches] + - rule->targets[matches]) - 1; + stemlen = (namelen - rule->lens[matches]) + 1; + check_lastslash = tryrules[ri].checked_lastslash; + if (check_lastslash) + { + stem += pathlen; + stemlen -= pathlen; + + /* We need to add the directory prefix, so set it up. */ + if (! pathdir) + { + pathdir = alloca (pathlen + 1); + memcpy (pathdir, filename, pathlen); + pathdir[pathlen] = '\0'; + } + dir = pathdir; + } + + if (stemlen > GET_PATH_MAX) + { + DBS (DB_IMPLICIT, (_("Stem too long: '%.*s'.\n"), + (int) stemlen, stem)); + continue; + } + + DBS (DB_IMPLICIT, (_("Trying pattern rule with stem '%.*s'.\n"), + (int) stemlen, stem)); + + strncpy (stem_str, stem, stemlen); + stem_str[stemlen] = '\0'; + + /* If there are no prerequisites, then this rule matches. */ + if (rule->deps == 0) + break; + + /* Temporary assign STEM to file->stem (needed to set file + variables below). */ + file->stem = stem_str; + + /* Mark this rule as in use so a recursive pattern_search won't try + to use it. */ + rule->in_use = 1; + + /* Try each prerequisite; see if it exists or can be created. We'll + build a list of prereq info in DEPLIST. Due to 2nd expansion we + may have to process multiple prereqs for a single dep entry. */ + + pat = deplist; + dep = rule->deps; + nptr = dep_name (dep); + while (1) + { + struct dep *dl, *d; + char *p; + + /* If we're out of name to parse, start the next prereq. */ + if (! nptr) + { + dep = dep->next; + if (dep == 0) + break; + nptr = dep_name (dep); + } + + /* If we don't need a second expansion, just replace the %. */ + if (! dep->need_2nd_expansion) + { + p = strchr (nptr, '%'); + if (p == 0) + strcpy (depname, nptr); + else + { + char *o = depname; + if (check_lastslash) + { + memcpy (o, filename, pathlen); + o += pathlen; + } + memcpy (o, nptr, p - nptr); + o += p - nptr; + memcpy (o, stem_str, stemlen); + o += stemlen; + strcpy (o, p + 1); + } + + /* Parse the expanded string. It might have wildcards. */ + p = depname; + dl = PARSE_SIMPLE_SEQ (&p, struct dep); + for (d = dl; d != NULL; d = d->next) + { + ++deps_found; + d->ignore_mtime = dep->ignore_mtime; + } + + /* We've used up this dep, so next time get a new one. */ + nptr = 0; + } + + /* We have to perform second expansion on this prereq. In an + ideal world we would take the dependency line, substitute the + stem, re-expand the whole line and chop it into individual + prerequisites. Unfortunately this won't work because of the + "check_lastslash" twist. Instead, we will have to go word by + word, taking $()'s into account. For each word we will + substitute the stem, re-expand, chop it up, and, if + check_lastslash != 0, add the directory part to each + resulting prerequisite. */ + else + { + int add_dir = 0; + unsigned int len; + struct dep **dptr; + + nptr = get_next_word (nptr, &len); + if (nptr == 0) + continue; + + /* See this is a transition to order-only prereqs. */ + if (! order_only && len == 1 && nptr[0] == '|') + { + order_only = 1; + nptr += len; + continue; + } + + /* If the dependency name has %, substitute the stem. If we + just replace % with the stem value then later, when we do + the 2nd expansion, we will re-expand this stem value + again. This is not good if you have certain characters + in your stem (like $). + + Instead, we will replace % with $* and allow the second + expansion to take care of it for us. This way (since $* + is a simple variable) there won't be additional + re-expansion of the stem. */ + + p = lindex (nptr, nptr + len, '%'); + if (p == 0) + { + memcpy (depname, nptr, len); + depname[len] = '\0'; + } + else + { + unsigned int i = p - nptr; + memcpy (depname, nptr, i); + memcpy (depname + i, "$*", 2); + memcpy (depname + i + 2, p + 1, len - i - 1); + depname[len + 2 - 1] = '\0'; + + if (check_lastslash) + add_dir = 1; + } + + /* Set up for the next word. */ + nptr += len; + + /* Initialize and set file variables if we haven't already + done so. */ + if (!file_vars_initialized) + { + initialize_file_variables (file, 0); + set_file_variables (file); + file_vars_initialized = 1; + } + /* Update the stem value in $* for this rule. */ + else if (!file_variables_set) + { + define_variable_for_file ( + "*", 1, file->stem, o_automatic, 0, file); + file_variables_set = 1; + } + + /* Perform the 2nd expansion. */ + p = variable_expand_for_file (depname, file); + dptr = &dl; + + /* Parse the results into a deps list. */ + do + { + /* Parse the expanded string. */ + struct dep *dp = PARSE_FILE_SEQ (&p, struct dep, + order_only ? MAP_NUL : MAP_PIPE, + add_dir ? dir : NULL, PARSEFS_NONE); + *dptr = dp; + + for (d = dp; d != NULL; d = d->next) + { + ++deps_found; + if (order_only) + d->ignore_mtime = 1; + dptr = &d->next; + } + + /* If we stopped due to an order-only token, note it. */ + if (*p == '|') + { + order_only = 1; + ++p; + } + } + while (*p != '\0'); + } + + /* If there are more than max_pattern_deps prerequisites (due to + 2nd expansion), reset it and realloc the arrays. */ + + if (deps_found > max_deps) + { + unsigned int l = pat - deplist; + /* This might have changed due to recursion. */ + max_pattern_deps = MAX(max_pattern_deps, deps_found); + max_deps = max_pattern_deps; + deplist = xrealloc (deplist, + max_deps * sizeof (struct patdeps)); + pat = deplist + l; + } + + /* Go through the nameseq and handle each as a prereq name. */ + for (d = dl; d != 0; d = d->next) + { + struct dep *expl_d; + int is_rule = d->name == dep_name (dep); + + if (file_impossible_p (d->name)) + { + /* If this prereq has already been ruled "impossible", + then the rule fails. Don't bother trying it on the + second pass either since we know that will fail. */ + DBS (DB_IMPLICIT, + (is_rule + ? _("Rejecting impossible rule prerequisite '%s'.\n") + : _("Rejecting impossible implicit prerequisite '%s'.\n"), + d->name)); + tryrules[ri].rule = 0; + + failed = 1; + break; + } + + memset (pat, '\0', sizeof (struct patdeps)); + pat->ignore_mtime = d->ignore_mtime; + + DBS (DB_IMPLICIT, + (is_rule + ? _("Trying rule prerequisite '%s'.\n") + : _("Trying implicit prerequisite '%s'.\n"), d->name)); + + /* If this prereq is also explicitly mentioned for FILE, + skip all tests below since it must be built no matter + which implicit rule we choose. */ + + for (expl_d = file->deps; expl_d != 0; expl_d = expl_d->next) + if (streq (dep_name (expl_d), d->name)) + break; + if (expl_d != 0) + { + (pat++)->name = d->name; + continue; + } + + /* The DEP->changed flag says that this dependency resides + in a nonexistent directory. So we normally can skip + looking for the file. However, if CHECK_LASTSLASH is + set, then the dependency file we are actually looking for + is in a different directory (the one gotten by prepending + FILENAME's directory), so it might actually exist. */ + + /* @@ dep->changed check is disabled. */ + if (lookup_file (d->name) != 0 + /*|| ((!dep->changed || check_lastslash) && */ + || file_exists_p (d->name)) + { + (pat++)->name = d->name; + continue; + } + + /* This code, given FILENAME = "lib/foo.o", dependency name + "lib/foo.c", and VPATH=src, searches for + "src/lib/foo.c". */ + { + const char *vname = vpath_search (d->name, 0, NULL, NULL); + if (vname) + { + DBS (DB_IMPLICIT, + (_("Found prerequisite '%s' as VPATH '%s'\n"), + d->name, vname)); + (pat++)->name = d->name; + continue; + } + } + + /* We could not find the file in any place we should look. + Try to make this dependency as an intermediate file, but + only on the second pass. */ + + if (intermed_ok) + { + DBS (DB_IMPLICIT, + (_("Looking for a rule with intermediate file '%s'.\n"), + d->name)); + + if (int_file == 0) + int_file = alloca (sizeof (struct file)); + memset (int_file, '\0', sizeof (struct file)); + int_file->name = d->name; + + if (pattern_search (int_file, + 0, + depth + 1, + recursions + 1)) + { + pat->pattern = int_file->name; + int_file->name = d->name; + pat->file = int_file; + int_file = 0; + (pat++)->name = d->name; + continue; + } + + /* If we have tried to find P as an intermediate file + and failed, mark that name as impossible so we won't + go through the search again later. */ + if (int_file->variables) + free_variable_set (int_file->variables); + if (int_file->pat_variables) + free_variable_set (int_file->pat_variables); + file_impossible (d->name); + } + + /* A dependency of this rule does not exist. Therefore, this + rule fails. */ + failed = 1; + break; + } + + /* Free the ns chain. */ + free_dep_chain (dl); + + if (failed) + break; + } + + /* Reset the stem in FILE. */ + + file->stem = 0; + + /* This rule is no longer 'in use' for recursive searches. */ + rule->in_use = 0; + + if (! failed) + /* This pattern rule does apply. Stop looking for one. */ + break; + + /* This pattern rule does not apply. Keep looking. */ + } + + /* If we found an applicable rule without intermediate files, don't try + with them. */ + if (ri < nrules) + break; + + rule = 0; + } + + /* RULE is nil if the loop went through the list but everything failed. */ + if (rule == 0) + goto done; + + foundrule = ri; + + /* If we are recursing, store the pattern that matched FILENAME in + FILE->name for use in upper levels. */ + + if (recursions > 0) + /* Kludge-o-matic */ + file->name = rule->targets[tryrules[foundrule].matches]; + + /* DEPLIST lists the prerequisites for the rule we found. This includes the + intermediate files, if any. Convert them into entries on the deps-chain + of FILE. */ + + while (pat-- > deplist) + { + struct dep *dep; + const char *s; + + if (pat->file != 0) + { + /* If we need to use an intermediate file, make sure it is entered + as a target, with the info that was found for it in the recursive + pattern_search call. We know that the intermediate file did not + already exist as a target; therefore we can assume that the deps + and cmds of F below are null before we change them. */ + + struct file *imf = pat->file; + struct file *f = lookup_file (imf->name); + + /* We don't want to delete an intermediate file that happened + to be a prerequisite of some (other) target. Mark it as + precious. */ + if (f != 0) + f->precious = 1; + else + f = enter_file (imf->name); + + f->deps = imf->deps; + f->cmds = imf->cmds; + f->stem = imf->stem; + f->variables = imf->variables; + f->pat_variables = imf->pat_variables; + f->pat_searched = imf->pat_searched; + f->also_make = imf->also_make; + f->is_target = 1; + f->intermediate = 1; + f->tried_implicit = 1; + + imf = lookup_file (pat->pattern); + if (imf != 0 && imf->precious) + f->precious = 1; + + for (dep = f->deps; dep != 0; dep = dep->next) + { + dep->file = enter_file (dep->name); + dep->name = 0; + dep->file->tried_implicit |= dep->changed; + } + } + + dep = alloc_dep (); + dep->ignore_mtime = pat->ignore_mtime; + s = strcache_add (pat->name); + if (recursions) + dep->name = s; + else + { + dep->file = lookup_file (s); + if (dep->file == 0) + dep->file = enter_file (s); + } + + if (pat->file == 0 && tryrules[foundrule].rule->terminal) + { + /* If the file actually existed (was not an intermediate file), and + the rule that found it was a terminal one, then we want to mark + the found file so that it will not have implicit rule search done + for it. If we are not entering a 'struct file' for it now, we + indicate this with the 'changed' flag. */ + if (dep->file == 0) + dep->changed = 1; + else + dep->file->tried_implicit = 1; + } + + dep->next = file->deps; + file->deps = dep; + } + + if (!tryrules[foundrule].checked_lastslash) + { + /* Always allocate new storage, since STEM might be on the stack for an + intermediate file. */ + file->stem = strcache_add_len (stem, stemlen); + fullstemlen = stemlen; + } + else + { + int dirlen = (lastslash + 1) - filename; + char *sp; + + /* We want to prepend the directory from + the original FILENAME onto the stem. */ + fullstemlen = dirlen + stemlen; + sp = alloca (fullstemlen + 1); + memcpy (sp, filename, dirlen); + memcpy (sp + dirlen, stem, stemlen); + sp[fullstemlen] = '\0'; + file->stem = strcache_add (sp); + } + + file->cmds = rule->cmds; + file->is_target = 1; + + /* Set precious flag. */ + { + struct file *f = lookup_file (rule->targets[tryrules[foundrule].matches]); + if (f && f->precious) + file->precious = 1; + } + + /* If this rule builds other targets, too, put the others into FILE's + 'also_make' member. */ + + if (rule->num > 1) + for (ri = 0; ri < rule->num; ++ri) + if (ri != tryrules[foundrule].matches) + { + char *nm = alloca (rule->lens[ri] + fullstemlen + 1); + char *p = nm; + struct file *f; + struct dep *new = alloc_dep (); + + /* GKM FIMXE: handle '|' here too */ + memcpy (p, rule->targets[ri], + rule->suffixes[ri] - rule->targets[ri] - 1); + p += rule->suffixes[ri] - rule->targets[ri] - 1; + memcpy (p, file->stem, fullstemlen); + p += fullstemlen; + memcpy (p, rule->suffixes[ri], + rule->lens[ri] - (rule->suffixes[ri] - rule->targets[ri])+1); + new->name = strcache_add (nm); + new->file = enter_file (new->name); + new->next = file->also_make; + + /* Set precious flag. */ + f = lookup_file (rule->targets[ri]); + if (f && f->precious) + new->file->precious = 1; + + /* Set the is_target flag so that this file is not treated as + intermediate by the pattern rule search algorithm and + file_exists_p cannot pick it up yet. */ + new->file->is_target = 1; + + file->also_make = new; + } + + done: + free (tryrules); + free (deplist); + + return rule != 0; +} diff --git a/job.c b/job.c new file mode 100644 index 0000000..2989249 --- /dev/null +++ b/job.c @@ -0,0 +1,3677 @@ +/* Job execution and handling for GNU Make. +Copyright (C) 1988-2014 Free 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 "job.h" +#include "debug.h" +#include "filedef.h" +#include "commands.h" +#include "variable.h" +#include "debug.h" + +#include + +/* Default shell to use. */ +#ifdef WINDOWS32 +#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 +const char *default_shell = ""; +int batch_mode_shell = 0; + +#elif defined (__riscos__) + +const char *default_shell = ""; +int batch_mode_shell = 0; + +#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. */ + +#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; +} + +int getloadavg (double loadavg[], int nelem); +int start_remote_job (char **argv, char **envp, int stdin_fd, int *is_remote, + int *id_ptr, int *used_stdin); +int start_remote_job_p (int); +int remote_status (int *exit_code_ptr, int *signal_ptr, int *coredump_ptr, + int block); + +RETSIGTYPE child_handler (int); +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 unsigned sizemax = strlen (base) + strlen (ext) + 10; + + if (path_size == 0) + { + path_size = GetCurrentDirectory (sizeof temp_path, temp_path); + path_is_dot = 1; + } + + ++uniq; + if (uniq >= 0x10000 && !second_loop) + { + /* If we already had 64K batch files in this + process, make a second loop through the numbers, + looking for free slots, i.e. files that were + deleted in the meantime. */ + second_loop = 1; + uniq = 1; + } + while (path_size > 0 && + path_size + sizemax < sizeof temp_path && + !(uniq >= 0x10000 && second_loop)) + { + unsigned size = sprintf (temp_path + path_size, + "%s%s-%x.%s", + temp_path[path_size - 1] == '\\' ? "" : "\\", + base, uniq, ext); + HANDLE h = CreateFile (temp_path, /* file name */ + GENERIC_READ | GENERIC_WRITE, /* desired access */ + 0, /* no share mode */ + NULL, /* default security attributes */ + CREATE_NEW, /* creation disposition */ + FILE_ATTRIBUTE_NORMAL | /* flags and attributes */ + FILE_ATTRIBUTE_TEMPORARY, /* we'll delete it */ + NULL); /* no template file */ + + if (h == INVALID_HANDLE_VALUE) + { + const DWORD er = GetLastError (); + + if (er == ERROR_FILE_EXISTS || er == ERROR_ALREADY_EXISTS) + { + ++uniq; + if (uniq == 0x10000 && !second_loop) + { + second_loop = 1; + uniq = 1; + } + } + + /* the temporary path is not guaranteed to exist */ + else if (path_is_dot == 0) + { + path_size = GetCurrentDirectory (sizeof temp_path, temp_path); + path_is_dot = 1; + } + + else + { + error_string = map_windows32_error_to_string (er); + break; + } + } + else + { + const unsigned final_size = path_size + size + 1; + char *const path = xmalloc (final_size); + memcpy (path, temp_path, final_size); + *fd = _open_osfhandle ((intptr_t)h, 0); + if (unixy) + { + char *p; + int ch; + for (p = path; (ch = *p) != 0; ++p) + if (ch == '\\') + *p = '/'; + } + return path; /* good return */ + } + } + + *fd = -1; + if (error_string == NULL) + error_string = _("Cannot create a temporary file\n"); + O (fatal, NILF, error_string); + + /* not reached */ + return NULL; +} +#endif /* WINDOWS32 */ + +#ifdef __EMX__ +/* returns whether path is assumed to be a unix like shell. */ +int +_is_unixy_shell (const char *path) +{ + /* list of non unix shells */ + const char *known_os2shells[] = { + "cmd.exe", + "cmd", + "4os2.exe", + "4os2", + "4dos.exe", + "4dos", + "command.com", + "command", + NULL + }; + + /* find the rightmost '/' or '\\' */ + const char *name = strrchr (path, '/'); + const char *p = strrchr (path, '\\'); + unsigned i; + + if (name && p) /* take the max */ + name = (name > p) ? name : p; + else if (p) /* name must be 0 */ + name = p; + else if (!name) /* name and p must be 0 */ + name = path; + + if (*name == '/' || *name == '\\') name++; + + i = 0; + while (known_os2shells[i] != NULL) + { + if (strcasecmp (name, known_os2shells[i]) == 0) + return 0; /* not a unix shell */ + i++; + } + + /* in doubt assume a unix like shell */ + return 1; +} +#endif /* __EMX__ */ + +/* determines whether path looks to be a Bourne-like shell. */ +int +is_bourne_compatible_shell (const char *path) +{ + /* List of known POSIX (or POSIX-ish) shells. */ + static const char *unix_shells[] = { + "sh", + "bash", + "ksh", + "rksh", + "zsh", + "ash", + "dash", + NULL + }; + const char **s; + + /* find the rightmost '/' or '\\' */ + const char *name = strrchr (path, '/'); + char *p = strrchr (path, '\\'); + + if (name && p) /* take the max */ + name = (name > p) ? name : p; + else if (p) /* name must be 0 */ + name = p; + else if (!name) /* name and p must be 0 */ + name = path; + + if (*name == '/' || *name == '\\') + ++name; + + /* this should be able to deal with extensions on Windows-like systems */ + for (s = unix_shells; *s != NULL; ++s) + { +#if defined(WINDOWS32) || defined(__MSDOS__) + unsigned int len = strlen (*s); + if ((strlen (name) >= len && STOP_SET (name[len], MAP_DOT|MAP_NUL)) + && strncasecmp (name, *s, len) == 0) +#else + if (strcmp (name, *s) == 0) +#endif + return 1; /* a known unix-style shell */ + } + + /* if not on the list, assume it's not a Bourne-like shell */ + return 0; +} + + +/* 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 gmk_floc *flocp = &f->cmds->fileinfo; + const char *nm; + size_t l = strlen (f->name); + + if (ignored && silent_flag) + return; + + if (exit_sig && coredump) + dump = _(" (core dumped)"); + + if (ignored) + { + pre = ""; + post = _(" (ignored)"); + } + + if (! flocp->filenm) + nm = _(""); + else + { + char *a = alloca (strlen (flocp->filenm) + 1 + 11 + 1); + sprintf (a, "%s:%lu", flocp->filenm, flocp->lineno); + nm = a; + } + + OUTPUT_SET (&child->output); + + message (0, l + strlen (nm), + _("%s: recipe for target '%s' failed"), nm, f->name); + + l += strlen (pre) + strlen (post); + +#ifdef VMS + if ((exit_code & 1) != 0) + { + OUTPUT_UNSET (); + return; + } + /* Check for a Posix compatible VMS style exit code: + decode and print the Posix exit code */ + if ((exit_code & 0x35a000) == 0x35a000) + error(NILF, l + INTSTR_LENGTH, _("%s[%s] Error %d%s"), pre, f->name, + ((exit_code & 0x7f8) >> 3), post); + else + error(NILF, l + INTSTR_LENGTH, _("%s[%s] Error 0x%x%s"), pre, f->name, + exit_code, post); +#else + if (exit_sig == 0) + error (NILF, l + INTSTR_LENGTH, + _("%s[%s] Error %d%s"), pre, f->name, exit_code, post); + else + { + const char *s = strsignal (exit_sig); + error (NILF, l + strlen (s) + strlen (dump), + _("%s[%s] %s%s%s"), pre, f->name, s, dump, post); + } +#endif /* VMS */ + + OUTPUT_UNSET (); +} + + +/* Handle a dead child. This handler may or may not ever be installed. + + If we're using the jobserver feature, 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; + + if (job_rfd >= 0) + { + close (job_rfd); + job_rfd = -1; + } + +#ifdef __EMX__ + /* The signal handler must called only once! */ + signal (SIGCHLD, SIG_DFL); +#endif + + /* This causes problems if the SIGCHLD interrupts a printf(). + DB (DB_JOBS, (_("Got a SIGCHLD; %u unreaped children.\n"), dead_children)); + */ +} + +extern int shell_function_pid, shell_function_completed; + +/* 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)) + { + int remote = 0; + pid_t pid; + int exit_code, exit_sig, coredump; + struct child *lastc, *c; + int child_failed; + int any_remote, any_local; + int dontcare; + + if (err && block) + { + static int printed = 0; + + /* We might block for a while, so let the user know why. + Only print this message once no matter how many jobs are left. */ + fflush (stdout); + if (!printed) + O (error, NILF, _("*** Waiting for unfinished jobs....")); + printed = 1; + } + + /* We have one less dead child to reap. As noted in + child_handler() above, this count is completely unimportant for + all modern, POSIX-y systems that support wait3() or waitpid(). + The rest of this comment below applies only to early, broken + pre-POSIX systems. We keep the count only because... it's there... + + The test and decrement are not atomic; if it is compiled into: + register = dead_children - 1; + dead_children = register; + a SIGCHLD could come between the two instructions. + child_handler increments dead_children. + The second instruction here would lose that increment. But the + only effect of dead_children being wrong is that we might wait + longer than necessary to reap a child, and lose some parallelism; + and we might print the "Waiting for unfinished jobs" message above + when not necessary. */ + + if (dead_children > 0) + --dead_children; + + any_remote = 0; + any_local = shell_function_pid != 0; + for (c = children; c != 0; c = c->next) + { + any_remote |= c->remote; + any_local |= ! c->remote; + DB (DB_JOBS, (_("Live child %p (%s) PID %s %s\n"), + c, c->file->name, pid2str (c->pid), + c->remote ? _(" (remote)") : "")); +#ifdef VMS + break; +#endif + } + + /* First, check for remote children. */ + if (any_remote) + pid = remote_status (&exit_code, &exit_sig, &coredump, 0); + else + pid = 0; + + if (pid > 0) + /* We got a remote child. */ + remote = 1; + else if (pid < 0) + { + /* A remote status command failed miserably. Punt. */ + remote_status_lose: + pfatal_with_name ("remote_status"); + } + else + { + /* No remote children. Check for local children. */ +#if !defined(__MSDOS__) && !defined(_AMIGA) && !defined(WINDOWS32) + if (any_local) + { +#ifdef VMS + vmsWaitForChildren (&status); + pid = c->pid; +#else +#ifdef WAIT_NOHANG + if (!block) + pid = WAIT_NOHANG (&status); + else +#endif + EINTRLOOP(pid, wait (&status)); +#endif /* !VMS */ + } + else + pid = 0; + + if (pid < 0) + { + /* The wait*() failed miserably. Punt. */ + pfatal_with_name ("wait"); + } + else if (pid > 0) + { + /* We got a child exit; chop the status word up. */ + exit_code = WEXITSTATUS (status); + exit_sig = WIFSIGNALED (status) ? WTERMSIG (status) : 0; + coredump = WCOREDUMP (status); + + /* If we have started jobs in this second, remove one. */ + if (job_counter) + --job_counter; + } + else + { + /* No local children are dead. */ + reap_more = 0; + + if (!block || !any_remote) + break; + + /* Now try a blocking wait for a remote child. */ + pid = remote_status (&exit_code, &exit_sig, &coredump, 1); + if (pid < 0) + goto remote_status_lose; + else if (pid == 0) + /* No remote children either. Finally give up. */ + break; + + /* We got a remote child. */ + remote = 1; + } +#endif /* !__MSDOS__, !Amiga, !WINDOWS32. */ + +#ifdef __MSDOS__ + /* Life is very different on MSDOS. */ + pid = dos_pid - 1; + status = dos_status; + exit_code = WEXITSTATUS (status); + if (exit_code == 0xff) + exit_code = -1; + exit_sig = WIFSIGNALED (status) ? WTERMSIG (status) : 0; + coredump = 0; +#endif /* __MSDOS__ */ +#ifdef _AMIGA + /* Same on Amiga */ + pid = amiga_pid - 1; + status = amiga_status; + exit_code = amiga_status; + exit_sig = 0; + coredump = 0; +#endif /* _AMIGA */ +#ifdef WINDOWS32 + { + HANDLE hPID; + HANDLE hcTID, hcPID; + DWORD dwWaitStatus = 0; + exit_code = 0; + exit_sig = 0; + coredump = 0; + + /* Record the thread ID of the main process, so that we + could suspend it in the signal handler. */ + if (!main_thread) + { + hcTID = GetCurrentThread (); + hcPID = GetCurrentProcess (); + if (!DuplicateHandle (hcPID, hcTID, hcPID, &main_thread, 0, + FALSE, DUPLICATE_SAME_ACCESS)) + { + DWORD e = GetLastError (); + fprintf (stderr, + "Determine main thread ID (Error %ld: %s)\n", + e, map_windows32_error_to_string (e)); + } + else + DB (DB_VERBOSE, ("Main thread handle = %p\n", main_thread)); + } + + /* wait for anything to finish */ + hPID = process_wait_for_any (block, &dwWaitStatus); + if (hPID) + { + /* was an error found on this process? */ + int werr = process_last_err (hPID); + + /* get exit data */ + exit_code = process_exit_code (hPID); + + if (werr) + fprintf (stderr, "make (e=%d): %s", exit_code, + map_windows32_error_to_string (exit_code)); + + /* signal */ + exit_sig = process_signal (hPID); + + /* cleanup process */ + process_cleanup (hPID); + + coredump = 0; + } + else if (dwWaitStatus == WAIT_FAILED) + { + /* The WaitForMultipleObjects() failed miserably. Punt. */ + pfatal_with_name ("WaitForMultipleObjects"); + } + else if (dwWaitStatus == WAIT_TIMEOUT) + { + /* No child processes are finished. Give up waiting. */ + reap_more = 0; + break; + } + + pid = (pid_t) hPID; + } +#endif /* WINDOWS32 */ + } + + /* Check if this is the child of the 'shell' function. */ + if (!remote && pid == shell_function_pid) + { + /* It is. Leave an indicator for the 'shell' function. */ + if (exit_sig == 0 && exit_code == 127) + shell_function_completed = -1; + else + shell_function_completed = 1; + break; + } + + child_failed = exit_sig != 0 || exit_code != 0; + + /* 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, (child_failed + ? _("Reaping losing child %p PID %s %s\n") + : _("Reaping winning child %p PID %s %s\n"), + c, pid2str (c->pid), c->remote ? _(" (remote)") : "")); + + if (c->sh_batch_file) + { + int rm_status; + + DB (DB_JOBS, (_("Cleaning up temp batch file %s\n"), + c->sh_batch_file)); + + errno = 0; + rm_status = remove (c->sh_batch_file); + if (rm_status) + DB (DB_JOBS, (_("Cleaning up temp batch file %s failed (%d)\n"), + c->sh_batch_file, errno)); + + /* all done with memory */ + free (c->sh_batch_file); + c->sh_batch_file = NULL; + } + + /* If this child had the good stdin, say it is now free. */ + if (c->good_stdin) + good_stdin_used = 0; + + dontcare = c->dontcare; + + if (child_failed && !c->noerror && !ignore_errors_flag) + { + /* The commands failed. Write an error message, + delete non-precious targets, and abort. */ + static int delete_on_error = -1; + + if (!dontcare) + child_error (c, exit_code, exit_sig, coredump, 0); + + c->file->update_status = us_failed; + if (delete_on_error == -1) + { + struct file *f = lookup_file (".DELETE_ON_ERROR"); + delete_on_error = f != 0 && f->is_target; + } + if (exit_sig != 0 || delete_on_error) + delete_child_targets (c); + } + else + { + if (child_failed) + { + /* The commands failed, but we don't care. */ + child_error (c, exit_code, exit_sig, coredump, 1); + child_failed = 0; + } + + /* If there are more commands to run, try to start them. */ + if (job_next_command (c)) + { + if (handling_fatal_signal) + { + /* Never start new commands while we are dying. + Since there are more commands that wanted to be run, + the target was not completely remade. So we treat + this as if a command had failed. */ + c->file->update_status = us_failed; + } + else + { +#ifndef NO_OUTPUT_SYNC + /* If we're sync'ing per line, write the previous line's + output before starting the next one. */ + if (output_sync == OUTPUT_SYNC_LINE) + output_dump (&c->output); +#endif + /* Check again whether to start remotely. + Whether or not we want to changes over time. + Also, start_remote_job may need state set up + by start_remote_job_p. */ + c->remote = start_remote_job_p (0); + start_job_command (c); + /* Fatal signals are left blocked in case we were + about to put that child on the chain. But it is + already there, so it is safe for a fatal signal to + arrive now; it will clean up this child's targets. */ + unblock_sigs (); + if (c->file->command_state == cs_running) + /* We successfully started the new command. + Loop to reap more children. */ + continue; + } + + if (c->file->update_status != us_success) + /* We failed to start the commands. */ + delete_child_targets (c); + } + else + /* There are no more commands. We got through them all + without an unignored error. Now the target has been + successfully updated. */ + c->file->update_status = us_success; + } + + /* When we get here, all the commands for c->file are finished. */ + +#ifndef NO_OUTPUT_SYNC + /* Synchronize any remaining parallel output. */ + output_dump (&c->output); +#endif + + /* At this point c->file->update_status is success or failed. But + c->file->command_state is still cs_running if all the commands + ran; notice_finish_file looks for cs_running to tell it that + it's interesting to check the file's modtime again now. */ + + if (! handling_fatal_signal) + /* Notice if the target of the commands has been changed. + This also propagates its values for command_state and + update_status to its also_make files. */ + notice_finished_file (c->file); + + DB (DB_JOBS, (_("Removing child %p PID %s%s from chain.\n"), + c, pid2str (c->pid), c->remote ? _(" (remote)") : "")); + + /* Block fatal signals while frobnicating the list, so that + children and job_slots_used are always consistent. Otherwise + a fatal signal arriving after the child is off the chain and + before job_slots_used is decremented would believe a child was + live and call reap_children again. */ + block_sigs (); + + /* There is now another slot open. */ + if (job_slots_used > 0) + --job_slots_used; + + /* Remove the child from the chain and free it. */ + if (lastc == 0) + children = c->next; + else + lastc->next = c->next; + + free_child (c); + + unblock_sigs (); + + /* If the job failed, and the -k flag was not given, die, + unless we are already in the process of dying. */ + if (!err && child_failed && !dontcare && !keep_going_flag && + /* fatal_error_signal will die with the right signal. */ + !handling_fatal_signal) + die (MAKE_FAILURE); + + /* 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. */ + +#ifdef WINDOWS32 + if (has_jobserver_semaphore () && jobserver_tokens > 1) + { + if (! release_jobserver_semaphore ()) + { + DWORD err = GetLastError (); + const char *estr = map_windows32_error_to_string (err); + ONS (fatal, NILF, + _("release jobserver semaphore: (Error %ld: %s)"), err, estr); + } + + DB (DB_JOBS, (_("Released token for child %p (%s).\n"), child, child->file->name)); + } +#else + if (job_fds[1] >= 0 && jobserver_tokens > 1) + { + char token = '+'; + int r; + + /* Write a job token back to the pipe. */ + + EINTRLOOP (r, write (job_fds[1], &token, 1)); + if (r != 1) + pfatal_with_name (_("write jobserver")); + + DB (DB_JOBS, (_("Released token for child %p (%s).\n"), + child, child->file->name)); + } +#endif + + --jobserver_tokens; + + if (handling_fatal_signal) /* Don't bother free'ing if about to die. */ + return; + + if (child->command_lines != 0) + { + register unsigned int i; + for (i = 0; i < child->file->cmds->ncommand_lines; ++i) + free (child->command_lines[i]); + free (child->command_lines); + } + + if (child->environment != 0) + { + register char **ep = child->environment; + while (*ep != 0) + free (*ep++); + free (child->environment); + } + + free (child); +} + +#ifdef POSIX +extern sigset_t fatal_signal_set; +#endif + +void +block_sigs (void) +{ +#ifdef POSIX + (void) sigprocmask (SIG_BLOCK, &fatal_signal_set, (sigset_t *) 0); +#else +# ifdef HAVE_SIGSETMASK + (void) sigblock (fatal_signal_mask); +# endif +#endif +} + +#ifdef POSIX +void +unblock_sigs (void) +{ + sigset_t empty; + sigemptyset (&empty); + sigprocmask (SIG_SETMASK, &empty, (sigset_t *) 0); +} +#endif + +#if defined(MAKE_JOBSERVER) && !defined(WINDOWS32) +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 + sigaction (SIGCHLD, &sa, NULL); +#endif +#if defined SIGCLD && SIGCLD != SIGCHLD + sigaction (SIGCLD, &sa, NULL); +#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; + sigaction (SIGALRM, &sa, NULL); + alarm (1); + } + else + { + alarm (0); + sa.sa_handler = SIG_DFL; + sa.sa_flags = 0; + sigaction (SIGALRM, &sa, NULL); + } + } +#endif +} +#endif + + +/* Start a job to run the commands specified in CHILD. + CHILD is updated to reflect the commands and ID of the child process. + + NOTE: On return fatal signals are blocked! The caller is responsible + for calling 'unblock_sigs', once the new child is safely on the chain so + it can be cleaned up in the event of a fatal signal. */ + +static void +start_job_command (struct child *child) +{ +#if !defined(_AMIGA) && !defined(WINDOWS32) + static int bad_stdin = -1; +#endif + int flags; + char *p; +#ifdef VMS + char *argv; +#else + char **argv; + int outfd = FD_STDOUT; + int errfd = FD_STDERR; +#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; + else if (!isblank ((unsigned char)*p)) + break; + ++p; + } + + /* 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 + argv = p; + /* Although construct_command_argv contains some code for VMS, it was/is + not called/used. Please note, for VMS argv is a string (not an array + of strings) which contains the complete command line, which for + multi-line variables still includes the newlines. So detect newlines + and set 'end' (which is used for child->command_ptr) instead of + (re-)writing construct_command_argv */ + if (!one_shell) + { + char *s = p; + int instring = 0; + while (*s) + { + if (*s == '"') + instring = !instring; + else if (*s == '\\' && !instring && *(s+1) != 0) + s++; + else if (*s == '\n' && !instring) + { + end = s; + break; + } + ++s; + } + } +#else + argv = construct_command_argv (p, &end, child->file, + child->file->cmds->lines_flags[child->command_line - 1], + &child->sh_batch_file); +#endif + if (end == NULL) + child->command_ptr = NULL; + else + { + *end++ = '\0'; + child->command_ptr = end; + } + } + + /* If -q was given, say that updating 'failed' if there was any text on the + command line, or 'succeeded' otherwise. The exit status of 1 tells the + user that -q is saying 'something to do'; the exit status for a random + error is 2. */ + if (argv != 0 && question_flag && !(flags & COMMANDS_RECURSE)) + { +#ifndef VMS + free (argv[0]); + free (argv); +#endif + child->file->update_status = us_question; + notice_finished_file (child->file); + return; + } + + if (touch_flag && !(flags & COMMANDS_RECURSE)) + { + /* Go on to the next command. It might be the recursive one. + We construct ARGV only to find the end of the command line. */ +#ifndef VMS + if (argv) + { + free (argv[0]); + free (argv); + } +#endif + argv = 0; + } + + if (argv == 0) + { + next_command: +#ifdef __MSDOS__ + execute_by_shell = 0; /* in case construct_command_argv sets it */ +#endif + /* This line has no commands. Go to the next. */ + if (job_next_command (child)) + start_job_command (child); + else + { + /* No more commands. Make sure we're "running"; we might not be if + (e.g.) all commands were skipped due to -n. */ + set_command_state (child->file, cs_running); + child->file->update_status = us_success; + notice_finished_file (child->file); + } + + OUTPUT_UNSET(); + return; + } + + /* Are we going to synchronize this command's output? Do so if either we're + in SYNC_RECURSE mode or this command is not recursive. We'll also check + output_sync separately below in case it changes due to error. */ + child->output.syncout = output_sync && (output_sync == OUTPUT_SYNC_RECURSE + || !(flags & COMMANDS_RECURSE)); + + OUTPUT_SET (&child->output); + +#ifndef NO_OUTPUT_SYNC + if (! child->output.syncout) + /* We don't want to sync this command: to avoid misordered + output ensure any already-synced content is written. */ + output_dump (&child->output); +#endif + + /* Print the command if appropriate. */ + if (just_print_flag || trace_flag + || (!(flags & COMMANDS_SILENT) && !silent_flag)) + OS (message, 0, "%s", p); + + /* Tell update_goal_chain that a command has been started on behalf of + this target. It is important that this happens here and not in + reap_children (where we used to do it), because reap_children might be + reaping children from a different target. We want this increment to + guaranteedly indicate that a command was started for the dependency + chain (i.e., update_file recursion chain) we are processing. */ + + ++commands_started; + + /* Optimize an empty command. People use this for timestamp rules, + so avoid forking a useless shell. Do this after we increment + commands_started so make still treats this special case as if it + performed some action (makes a difference as to what messages are + printed, etc. */ + +#if !defined(VMS) && !defined(_AMIGA) + if ( +#if defined __MSDOS__ || defined (__EMX__) + unixy_shell /* the test is complicated and we already did it */ +#else + (argv[0] && is_bourne_compatible_shell (argv[0])) +#endif + && (argv[1] && argv[1][0] == '-' + && + ((argv[1][1] == 'c' && argv[1][2] == '\0') + || + (argv[1][1] == 'e' && argv[1][2] == 'c' && argv[1][3] == '\0'))) + && (argv[2] && argv[2][0] == ':' && argv[2][1] == '\0') + && argv[3] == NULL) + { + free (argv[0]); + free (argv); + goto next_command; + } +#endif /* !VMS && !_AMIGA */ + + /* If -n was given, recurse to get the next line in the sequence. */ + + if (just_print_flag && !(flags & COMMANDS_RECURSE)) + { +#ifndef VMS + free (argv[0]); + free (argv); +#endif + goto next_command; + } + + /* We're sure we're going to invoke a command: set up the output. */ + output_start (); + + /* Flush the output streams so they won't have things written twice. */ + + fflush (stdout); + fflush (stderr); + +#ifndef VMS +#if !defined(WINDOWS32) && !defined(_AMIGA) && !defined(__MSDOS__) + + /* Set up a bad standard input that reads from a broken pipe. */ + + if (bad_stdin == -1) + { + /* Make a file descriptor that is the read end of a broken pipe. + This will be used for some children's standard inputs. */ + int pd[2]; + if (pipe (pd) == 0) + { + /* Close the write side. */ + (void) close (pd[1]); + /* Save the read side. */ + bad_stdin = pd[0]; + + /* Set the descriptor to close on exec, so it does not litter any + child's descriptor table. When it is dup2'd onto descriptor 0, + that descriptor will not close on exec. */ + CLOSE_ON_EXEC (bad_stdin); + } + } + +#endif /* !WINDOWS32 && !_AMIGA && !__MSDOS__ */ + + /* 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; + +#endif /* !VMS */ + + child->deleted = 0; + +#ifndef _AMIGA + /* Set up the environment for the child. */ + if (child->environment == 0) + child->environment = target_environment (child->file); +#endif + +#if !defined(__MSDOS__) && !defined(_AMIGA) && !defined(WINDOWS32) + +#ifndef VMS + /* start_waiting_job has set CHILD->remote if we can start a remote job. */ + if (child->remote) + { + int is_remote, id, used_stdin; + if (start_remote_job (argv, child->environment, + child->good_stdin ? 0 : bad_stdin, + &is_remote, &id, &used_stdin)) + /* Don't give up; remote execution may fail for various reasons. If + so, simply run the job locally. */ + goto run_local; + else + { + if (child->good_stdin && !used_stdin) + { + child->good_stdin = 0; + good_stdin_used = 0; + } + child->remote = is_remote; + child->pid = id; + } + } + else +#endif /* !VMS */ + { + /* Fork the child process. */ + + char **parent_environ; + + run_local: + block_sigs (); + + child->remote = 0; + +#ifdef VMS + if (!child_execute_job (argv, child)) + { + /* Fork failed! */ + perror_with_name ("fork", ""); + goto error; + } + +#else + + parent_environ = environ; + +#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; + } +#endif +# ifdef __EMX__ + /* If we aren't running a recursive command and we have a jobserver + pipe, close it before exec'ing. */ + if (!(flags & COMMANDS_RECURSE) && job_fds[0] >= 0) + { + CLOSE_ON_EXEC (job_fds[0]); + CLOSE_ON_EXEC (job_fds[1]); + } + if (job_rfd >= 0) + CLOSE_ON_EXEC (job_rfd); + + /* Never use fork()/exec() here! Use spawn() instead in exec_command() */ + child->pid = child_execute_job (child->good_stdin ? FD_STDIN : bad_stdin, + outfd, errfd, + argv, child->environment); + if (child->pid < 0) + { + /* spawn failed! */ + unblock_sigs (); + perror_with_name ("spawn", ""); + goto error; + } + + /* undo CLOSE_ON_EXEC() after the child process has been started */ + if (!(flags & COMMANDS_RECURSE) && job_fds[0] >= 0) + { + fcntl (job_fds[0], F_SETFD, 0); + fcntl (job_fds[1], F_SETFD, 0); + } + if (job_rfd >= 0) + fcntl (job_rfd, F_SETFD, 0); + +#else /* !__EMX__ */ + + child->pid = fork (); + environ = parent_environ; /* Restore value child may have clobbered. */ + if (child->pid == 0) + { + /* We are the child side. */ + unblock_sigs (); + + /* If we aren't running a recursive command and we have a jobserver + pipe, close it before exec'ing. */ + if (!(flags & COMMANDS_RECURSE) && job_fds[0] >= 0) + { + close (job_fds[0]); + close (job_fds[1]); + } + if (job_rfd >= 0) + close (job_rfd); + +#ifdef SET_STACK_SIZE + /* Reset limits, if necessary. */ + if (stack_limit.rlim_cur) + setrlimit (RLIMIT_STACK, &stack_limit); +#endif + child_execute_job (child->good_stdin ? FD_STDIN : bad_stdin, + outfd, errfd, argv, child->environment); + } + else if (child->pid < 0) + { + /* Fork failed! */ + unblock_sigs (); + perror_with_name ("fork", ""); + goto error; + } +# endif /* !__EMX__ */ +#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; + + /* make UNC paths safe for CreateProcess -- backslash format */ + arg0 = argv[0]; + if (arg0 && arg0[0] == '/' && arg0[1] == '/') + for ( ; arg0 && *arg0; arg0++) + if (*arg0 == '/') + *arg0 = '\\'; + + /* make sure CreateProcess() has Path it needs */ + sync_Path_environment (); + +#ifndef NO_OUTPUT_SYNC + /* Divert child output if output_sync in use. */ + if (child->output.syncout) + { + if (child->output.out >= 0) + outfd = child->output.out; + if (child->output.err >= 0) + errfd = child->output.err; + } +#else + outfd = errfd = -1; +#endif + hPID = process_easy (argv, child->environment, outfd, errfd); + + if (hPID != INVALID_HANDLE_VALUE) + child->pid = (pid_t) hPID; + else + { + int i; + unblock_sigs (); + fprintf (stderr, + _("process_easy() failed to launch process (e=%ld)\n"), + process_last_err (hPID)); + for (i = 0; argv[i]; i++) + fprintf (stderr, "%s ", argv[i]); + fprintf (stderr, _("\nCounted %d args in failed launch\n"), i); + goto error; + } + } +#endif /* WINDOWS32 */ +#endif /* __MSDOS__ or Amiga or WINDOWS32 */ + + /* Bump the number of jobs started in this second. */ + ++job_counter; + + /* We are the parent side. Set the state to + say the commands are running and return. */ + + set_command_state (child->file, cs_running); + + /* Free the storage used by the child's argument list. */ +#ifndef VMS + free (argv[0]); + free (argv); +#endif + + OUTPUT_UNSET(); + return; + + error: + child->file->update_status = us_failed; + notice_finished_file (child->file); + OUTPUT_UNSET(); +} + +/* Try to start a child running. + Returns nonzero if the child was started (and maybe finished), or zero if + the load was too high and the child was put on the 'waiting_jobs' chain. */ + +static int +start_waiting_job (struct child *c) +{ + struct file *f = c->file; + + /* If we can start a job remotely, we always want to, and don't care about + the local load average. We record that the job should be started + remotely in C->remote for start_job_command to test. */ + + c->remote = start_remote_job_p (1); + + /* If we are running at least one job already and the load average + is too high, make this one wait. */ + if (!c->remote + && ((job_slots_used > 0 && load_too_high ()) +#ifdef WINDOWS32 + || (process_used_slots () >= MAXIMUM_WAIT_OBJECTS) +#endif + )) + { + /* Put this child on the chain of children waiting for the load average + to go down. */ + set_command_state (f, cs_running); + c->next = waiting_jobs; + waiting_jobs = c; + return 0; + } + + /* Start the first command; reap_children will run later command lines. */ + start_job_command (c); + + switch (f->command_state) + { + case cs_running: + c->next = children; + DB (DB_JOBS, (_("Putting child %p (%s) PID %s%s on the chain.\n"), + c, c->file->name, pid2str (c->pid), + c->remote ? _(" (remote)") : "")); + children = c; + /* One more job slot is in use. */ + ++job_slots_used; + unblock_sigs (); + break; + + case cs_not_started: + /* All the command lines turned out to be empty. */ + f->update_status = us_success; + /* FALLTHROUGH */ + + case cs_finished: + notice_finished_file (f); + free_child (c); + break; + + default: + assert (f->command_state == cs_finished); + break; + } + + return 1; +} + +/* Create a 'struct child' for FILE and start its commands running. */ + +void +new_job (struct file *file) +{ + struct commands *cmds = file->cmds; + struct child *c; + char **lines; + unsigned int i; + + /* Let any previously decided-upon jobs that are waiting + for the load to go down start before this new one. */ + start_waiting_jobs (); + + /* Reap any children that might have finished recently. */ + reap_children (0, 0); + + /* Chop the commands up into lines if they aren't already. */ + chop_commands (cmds); + + /* Start the command sequence, record it in a new + 'struct child', and add that to the chain. */ + + c = xcalloc (sizeof (struct child)); + output_init (&c->output); + + c->file = file; + c->sh_batch_file = NULL; + + /* Cache dontcare flag because file->dontcare can be changed once we + return. Check dontcare inheritance mechanism for details. */ + c->dontcare = file->dontcare; + + /* Start saving output in case the expansion uses $(info ...) etc. */ + OUTPUT_SET (&c->output); + + /* Expand the command lines and store the results in LINES. */ + lines = xmalloc (cmds->ncommand_lines * sizeof (char *)); + for (i = 0; i < cmds->ncommand_lines; ++i) + { + /* Collapse backslash-newline combinations that are inside variable + or function references. These are left alone by the parser so + that they will appear in the echoing of commands (where they look + nice); and collapsed by construct_command_argv when it tokenizes. + But letting them survive inside function invocations loses because + we don't want the functions to see them as part of the text. */ + + char *in, *out, *ref; + + /* IN points to where in the line we are scanning. + OUT points to where in the line we are writing. + When we collapse a backslash-newline combination, + IN gets ahead of OUT. */ + + in = out = cmds->command_lines[i]; + while ((ref = strchr (in, '$')) != 0) + { + ++ref; /* Move past the $. */ + + if (out != in) + /* Copy the text between the end of the last chunk + we processed (where IN points) and the new chunk + we are about to process (where REF points). */ + memmove (out, in, ref - in); + + /* Move both pointers past the boring stuff. */ + out += ref - in; + in = ref; + + if (*ref == '(' || *ref == '{') + { + char openparen = *ref; + char closeparen = openparen == '(' ? ')' : '}'; + char *outref; + int count; + char *p; + + *out++ = *in++; /* Copy OPENPAREN. */ + outref = out; + /* IN now points past the opening paren or brace. + Count parens or braces until it is matched. */ + count = 0; + while (*in != '\0') + { + if (*in == closeparen && --count < 0) + break; + else if (*in == '\\' && in[1] == '\n') + { + /* We have found a backslash-newline inside a + variable or function reference. Eat it and + any following whitespace. */ + + int quoted = 0; + for (p = in - 1; p > ref && *p == '\\'; --p) + quoted = !quoted; + + if (quoted) + /* There were two or more backslashes, so this is + not really a continuation line. We don't collapse + the quoting backslashes here as is done in + collapse_continuations, because the line will + be collapsed again after expansion. */ + *out++ = *in++; + else + { + /* Skip the backslash, newline and + any following whitespace. */ + in = next_token (in + 2); + + /* Discard any preceding whitespace that has + already been written to the output. */ + while (out > outref + && isblank ((unsigned char)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. */ + lines[i] = allocated_variable_expand_for_file (cmds->command_lines[i], + file); + } + + 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... */ + +#ifdef WINDOWS32 + else if (has_jobserver_semaphore ()) +#else + else if (job_fds[0] >= 0) +#endif + while (1) + { + int got_token; +#ifndef WINDOWS32 + char token; + int saved_errno; +#endif + + 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; + +#ifndef WINDOWS32 + /* 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. */ + + /* Make sure we have a dup'd FD. */ + if (job_rfd < 0) + { + DB (DB_JOBS, ("Duplicate the job FD\n")); + job_rfd = dup (job_fds[0]); + } +#endif + + /* 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 has become available, use it; we don't need an + actual 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"); + +#ifdef WINDOWS32 + /* On Windows we simply wait for the jobserver semaphore to become + * signalled or one of our child processes to terminate. + */ + got_token = wait_for_semaphore_or_child_process (); + if (got_token < 0) + { + 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); + } +#else + /* Set interruptible system calls, and read() for a job token. */ + set_child_handler_action_flags (1, waiting_jobs != NULL); + got_token = read (job_rfd, &token, 1); + saved_errno = errno; + set_child_handler_action_flags (0, waiting_jobs != NULL); +#endif + + /* 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; + } + +#ifndef WINDOWS32 + /* If the error _wasn't_ expected (EINTR or EBADF), punt. 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")); +#endif + } +#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; + return 0; + } + else + /* Get the next line to run. */ + child->command_ptr = child->command_lines[child->command_line++]; + } + return 1; +} + +/* Determine if the load average on the system is too high to start a new job. + The real system load average is only recomputed once a second. However, a + very parallel make can easily start tens or even hundreds of jobs in a + second, which brings the system to its knees for a while until that first + batch of jobs clears out. + + To avoid this we use a weighted algorithm to try to account for jobs which + have been started since the last second, and guess what the load average + would be now if it were computed. + + This algorithm was provided by Thomas Riedl , + who writes: + +! calculate something load-oid and add to the observed sys.load, +! so that latter can catch up: +! - every job started increases jobctr; +! - every dying job decreases a positive jobctr; +! - the jobctr value gets zeroed every change of seconds, +! after its value*weight_b is stored into the 'backlog' value last_sec +! - weight_a times the sum of jobctr and last_sec gets +! added to the observed sys.load. +! +! The two weights have been tried out on 24 and 48 proc. Sun Solaris-9 +! machines, using a several-thousand-jobs-mix of cpp, cc, cxx and smallish +! sub-shelled commands (rm, echo, sed...) for tests. +! lowering the 'direct influence' factor weight_a (e.g. to 0.1) +! resulted in significant excession of the load limit, raising it +! (e.g. to 0.5) took bad to small, fast-executing jobs and didn't +! reach the limit in most test cases. +! +! lowering the 'history influence' weight_b (e.g. to 0.1) resulted in +! exceeding the limit for longer-running stuff (compile jobs in +! the .5 to 1.5 sec. range),raising it (e.g. to 0.5) overrepresented +! small jobs' effects. + + */ + +#define LOAD_WEIGHT_A 0.25 +#define LOAD_WEIGHT_B 0.25 + +static int +load_too_high (void) +{ +#if defined(__MSDOS__) || defined(VMS) || defined(_AMIGA) || defined(__riscos__) + return 1; +#else + static double last_sec; + static time_t last_now; + double load, guess; + time_t now; + +#ifdef WINDOWS32 + /* sub_proc.c cannot wait for more than MAXIMUM_WAIT_OBJECTS children */ + if (process_used_slots () >= MAXIMUM_WAIT_OBJECTS) + return 1; +#endif + + if (max_load_average < 0) + return 0; + + /* Find the real system load average. */ + make_access (); + if (getloadavg (&load, 1) != 1) + { + static int lossage = -1; + /* Complain only once for the same error. */ + if (lossage == -1 || errno != lossage) + { + if (errno == 0) + /* An errno value of zero means getloadavg is just unsupported. */ + O (error, NILF, + _("cannot enforce load limits on this operating system")); + else + perror_with_name (_("cannot enforce load limit: "), "getloadavg"); + } + lossage = errno; + load = 0; + } + user_access (); + + /* If we're in a new second zero the counter and correct the backlog + value. Only keep the backlog for one extra second; after that it's 0. */ + now = time (NULL); + if (last_now < now) + { + if (last_now == now - 1) + last_sec = LOAD_WEIGHT_B * job_counter; + else + last_sec = 0.0; + + job_counter = 0; + last_now = now; + } + + /* Try to guess what the load would be right now. */ + guess = load + (LOAD_WEIGHT_A * (job_counter + last_sec)); + + DB (DB_JOBS, ("Estimated system load = %f (actual = %f) (max requested = %f)\n", + guess, load, max_load_average)); + + return guess >= max_load_average; +#endif +} + +/* Start jobs that are waiting for the load to be lower. */ + +void +start_waiting_jobs (void) +{ + struct child *job; + + if (waiting_jobs == 0) + return; + + do + { + /* Check for recently deceased descendants. */ + reap_children (0, 0); + + /* Take a job off the waiting list. */ + job = waiting_jobs; + waiting_jobs = job->next; + + /* Try to start that job. We break out of the loop as soon + as start_waiting_job puts one back on the waiting list. */ + } + while (start_waiting_job (job) && waiting_jobs != 0); + + return; +} + +#ifndef WINDOWS32 + +/* EMX: Start a child process. This function returns the new pid. */ +# if defined __EMX__ +int +child_execute_job (int stdin_fd, int stdout_fd, int stderr_fd, + char **argv, char **envp) +{ + int pid; + int save_stdin = -1; + int save_stdout = -1; + int save_stderr = -1; + + /* 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 (stdin_fd != FD_STDIN) + { + save_stdin = dup (FD_STDIN); + if (save_stdin < 0) + O (fatal, NILF, _("no more file handles: could not duplicate stdin\n")); + CLOSE_ON_EXEC (save_stdin); + + dup2 (stdin_fd, FD_STDIN); + CLOSE_ON_EXEC (stdin_fd); + } + + if (stdout_fd != FD_STDOUT) + { + save_stdout = dup (FD_STDOUT); + if (save_stdout < 0) + O (fatal, NILF, + _("no more file handles: could not duplicate stdout\n")); + CLOSE_ON_EXEC (save_stdout); + + dup2 (stdout_fd, FD_STDOUT); + CLOSE_ON_EXEC (stdout_fd); + } + + if (stderr_fd != FD_STDERR) + { + if (stderr_fd != stdout_fd) + { + save_stderr = dup (FD_STDERR); + if (save_stderr < 0) + O (fatal, NILF, + _("no more file handles: could not duplicate stderr\n")); + CLOSE_ON_EXEC (save_stderr); + } + + dup2 (stderr_fd, FD_STDERR); + CLOSE_ON_EXEC (stderr_fd); + } + + /* Run the command. */ + pid = exec_command (argv, envp); + + /* Restore stdout/stdin/stderr of the parent and close temporary FDs. */ + if (save_stdin >= 0) + { + if (dup2 (save_stdin, FD_STDIN) != FD_STDIN) + O (fatal, NILF, _("Could not restore stdin\n")); + else + close (save_stdin); + } + + if (save_stdout >= 0) + { + if (dup2 (save_stdout, FD_STDOUT) != FD_STDOUT) + O (fatal, NILF, _("Could not restore stdout\n")); + else + close (save_stdout); + } + + if (save_stderr >= 0) + { + if (dup2 (save_stderr, FD_STDERR) != FD_STDERR) + O (fatal, NILF, _("Could not restore stderr\n")); + else + close (save_stderr); + } + + return pid; +} + +#elif !defined (_AMIGA) && !defined (__MSDOS__) && !defined (VMS) + +/* UNIX: + Replace the current process with one executing the command in ARGV. + STDIN_FD/STDOUT_FD/STDERR_FD are used as the process's stdin/stdout/stderr; + ENVP is the environment of the new program. This function does not return. */ +void +child_execute_job (int stdin_fd, int stdout_fd, int stderr_fd, + char **argv, char **envp) +{ + /* For any redirected FD, dup2() it to the standard FD then close it. */ + if (stdin_fd != FD_STDIN) + { + dup2 (stdin_fd, FD_STDIN); + close (stdin_fd); + } + + if (stdout_fd != FD_STDOUT) + dup2 (stdout_fd, FD_STDOUT); + if (stderr_fd != FD_STDERR) + dup2 (stderr_fd, FD_STDERR); + + if (stdout_fd != FD_STDOUT) + close (stdout_fd); + if (stderr_fd != FD_STDERR && stderr_fd != stdout_fd) + close (stderr_fd); + + /* Run the command. */ + exec_command (argv, envp); +} +#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__ +int +# else +void +# endif +exec_command (char **argv, char **envp) +{ +#ifdef VMS + /* to work around a problem with signals and execve: ignore them */ +#ifdef SIGCHLD + signal (SIGCHLD,SIG_IGN); +#endif + /* Run the program. */ + execve (argv[0], argv, envp); + perror_with_name ("execve: ", argv[0]); + _exit (EXIT_FAILURE); +#else +#ifdef WINDOWS32 + HANDLE hPID; + HANDLE hWaitPID; + int exit_code = EXIT_FAILURE; + + /* make sure CreateProcess() has Path it needs */ + sync_Path_environment (); + + /* launch command */ + hPID = process_easy (argv, envp, -1, -1); + + /* make sure launch ok */ + if (hPID == INVALID_HANDLE_VALUE) + { + int i; + fprintf (stderr, _("process_easy() failed to launch process (e=%ld)\n"), + process_last_err (hPID)); + for (i = 0; argv[i]; i++) + fprintf (stderr, "%s ", argv[i]); + fprintf (stderr, _("\nCounted %d args in failed launch\n"), i); + exit (EXIT_FAILURE); + } + + /* wait and reap last child */ + hWaitPID = process_wait_for_any (1, 0); + while (hWaitPID) + { + /* was an error found on this process? */ + int err = process_last_err (hWaitPID); + + /* get exit data */ + exit_code = process_exit_code (hWaitPID); + + if (err) + fprintf (stderr, "make (e=%d, rc=%d): %s", + err, exit_code, map_windows32_error_to_string (err)); + + /* cleanup process */ + process_cleanup (hWaitPID); + + /* expect to find only last pid, warn about other pids reaped */ + if (hWaitPID == hPID) + break; + else + { + char *pidstr = xstrdup (pid2str ((pid_t)hWaitPID)); + + fprintf (stderr, + _("make reaped child pid %s, still waiting for pid %s\n"), + pidstr, pid2str ((pid_t)hPID)); + free (pidstr); + } + } + + /* return child's exit code as our exit code */ + exit (exit_code); + +#else /* !WINDOWS32 */ + +# ifdef __EMX__ + int pid; +# endif + + /* Be the user, permanently. */ + child_access (); + +# ifdef __EMX__ + /* Run the program. */ + pid = spawnvpe (P_NOWAIT, argv[0], argv, envp); + if (pid >= 0) + return pid; + + /* the file might have a strange shell extension */ + if (errno == ENOENT) + errno = ENOEXEC; + +# else + /* Run the program. */ + environ = envp; + execvp (argv[0], argv); + +# endif /* !__EMX__ */ + + switch (errno) + { + case ENOENT: + OS (error, NILF, _("%s: Command not found"), argv[0]); + break; + case ENOEXEC: + { + /* The file is not executable. Try it as a shell script. */ + extern char *getenv (); + const char *shell; + char **new_argv; + int argc; + int i=1; + +# ifdef __EMX__ + /* Do not use $SHELL from the environment */ + struct variable *p = lookup_variable ("SHELL", 5); + if (p) + shell = p->value; + else + shell = 0; +# else + shell = getenv ("SHELL"); +# endif + if (shell == 0) + shell = default_shell; + + argc = 1; + while (argv[argc] != 0) + ++argc; + +# ifdef __EMX__ + if (!unixy_shell) + ++argc; +# endif + + new_argv = alloca ((1 + argc + 1) * sizeof (char *)); + new_argv[0] = (char *)shell; + +# ifdef __EMX__ + if (!unixy_shell) + { + new_argv[1] = "/c"; + ++i; + --argc; + } +# endif + + new_argv[i] = argv[0]; + while (argc > 0) + { + new_argv[i + argc] = argv[argc]; + --argc; + } + +# ifdef __EMX__ + pid = spawnvpe (P_NOWAIT, shell, new_argv, envp); + if (pid >= 0) + break; +# else + execvp (shell, new_argv); +# endif + if (errno == ENOENT) + OS (error, NILF, _("%s: Shell program not found"), shell); + else + perror_with_name ("execvp: ", shell); + break; + } + +# ifdef __EMX__ + case EINVAL: + /* this nasty error was driving me nuts :-( */ + O (error, NILF, _("spawnvpe: environment space might be exhausted")); + /* FALLTHROUGH */ +# endif + + default: + perror_with_name ("execvp: ", argv[0]); + break; + } + +# ifdef __EMX__ + return pid; +# else + _exit (127); +# endif +#endif /* !WINDOWS32 */ +#endif /* !VMS */ +} +#else /* On Amiga */ +void +exec_command (char **argv) +{ + MyExecute (argv); +} + +void clean_tmp (void) +{ + DeleteFile (amiga_bname); +} + +#endif /* On Amiga */ + +#ifndef VMS +/* Figure out the argument list necessary to run LINE as a command. Try to + avoid using a shell. This routine handles only ' quoting, and " quoting + when no backslash, $ or ' characters are seen in the quotes. Starting + quotes may be escaped with a backslash. If any of the characters in + sh_chars is seen, or any of the builtin commands listed in sh_cmds + is the first word of a line, the shell is used. + + If RESTP is not NULL, *RESTP is set to point to the first newline in LINE. + If *RESTP is NULL, newlines will be ignored. + + SHELL is the shell to use, or nil to use the default shell. + IFS is the value of $IFS, or nil (meaning the default). + + FLAGS is the value of lines_flags for this command line. It is + used in the WINDOWS32 port to check whether + or $(MAKE) were found + in this command line, in which case the effect of just_print_flag + is overridden. */ + +static char ** +construct_command_argv_internal (char *line, char **restp, const char *shell, + const char *shellflags, const char *ifs, + int flags, char **batch_filename UNUSED) +{ +#ifdef __MSDOS__ + /* MSDOS supports both the stock DOS shell and ports of Unixy shells. + We call 'system' for anything that requires ''slow'' processing, + because DOS shells are too dumb. When $SHELL points to a real + (unix-style) shell, 'system' just calls it to do everything. When + $SHELL points to a DOS shell, 'system' does most of the work + internally, calling the shell only for its internal commands. + However, it looks on the $PATH first, so you can e.g. have an + external command named 'mkdir'. + + Since we call 'system', certain characters and commands below are + actually not specific to COMMAND.COM, but to the DJGPP implementation + of 'system'. In particular: + + The shell wildcard characters are in DOS_CHARS because they will + not be expanded if we call the child via 'spawnXX'. + + The ';' is in DOS_CHARS, because our 'system' knows how to run + multiple commands on a single line. + + DOS_CHARS also include characters special to 4DOS/NDOS, so we + won't have to tell one from another and have one more set of + commands and special characters. */ + static const char *sh_chars_dos = "*?[];|<>%^&()"; + static const char *sh_cmds_dos[] = + { "break", "call", "cd", "chcp", "chdir", "cls", "copy", "ctty", "date", + "del", "dir", "echo", "erase", "exit", "for", "goto", "if", "md", + "mkdir", "path", "pause", "prompt", "rd", "rmdir", "rem", "ren", + "rename", "set", "shift", "time", "type", "ver", "verify", "vol", ":", + 0 }; + + static const char *sh_chars_sh = "#;\"*?[]&|<>(){}$`^"; + static const char *sh_cmds_sh[] = + { "cd", "echo", "eval", "exec", "exit", "login", "logout", "set", "umask", + "wait", "while", "for", "case", "if", ":", ".", "break", "continue", + "export", "read", "readonly", "shift", "times", "trap", "switch", + "unset", "ulimit", 0 }; + + const char *sh_chars; + const char **sh_cmds; + +#elif defined (__EMX__) + static const char *sh_chars_dos = "*?[];|<>%^&()"; + static const char *sh_cmds_dos[] = + { "break", "call", "cd", "chcp", "chdir", "cls", "copy", "ctty", "date", + "del", "dir", "echo", "erase", "exit", "for", "goto", "if", "md", + "mkdir", "path", "pause", "prompt", "rd", "rmdir", "rem", "ren", + "rename", "set", "shift", "time", "type", "ver", "verify", "vol", ":", + 0 }; + + static const char *sh_chars_os2 = "*?[];|<>%^()\"'&"; + static const char *sh_cmds_os2[] = + { "call", "cd", "chcp", "chdir", "cls", "copy", "date", "del", "detach", + "dir", "echo", "endlocal", "erase", "exit", "for", "goto", "if", "keys", + "md", "mkdir", "move", "path", "pause", "prompt", "rd", "rem", "ren", + "rename", "rmdir", "set", "setlocal", "shift", "start", "time", "type", + "ver", "verify", "vol", ":", 0 }; + + static const char *sh_chars_sh = "#;\"*?[]&|<>(){}$`^~'"; + static const char *sh_cmds_sh[] = + { "echo", "cd", "eval", "exec", "exit", "login", "logout", "set", "umask", + "wait", "while", "for", "case", "if", ":", ".", "break", "continue", + "export", "read", "readonly", "shift", "times", "trap", "switch", + "unset", 0 }; + + const char *sh_chars; + const char **sh_cmds; + +#elif defined (_AMIGA) + static const char *sh_chars = "#;\"|<>()?*$`"; + static const char *sh_cmds[] = + { "cd", "eval", "if", "delete", "echo", "copy", "rename", "set", "setenv", + "date", "makedir", "skip", "else", "endif", "path", "prompt", "unset", + "unsetenv", "version", 0 }; + +#elif defined (WINDOWS32) + /* We used to have a double quote (") in sh_chars_dos[] below, but + that caused any command line with quoted file names be run + through a temporary batch file, which introduces command-line + limit of 4K charcaters imposed by cmd.exe. Since CreateProcess + can handle quoted file names just fine, removing the quote lifts + the limit from a very frequent use case, because using quoted + file names is commonplace on MS-Windows. */ + static const char *sh_chars_dos = "|&<>"; + static const char *sh_cmds_dos[] = + { "assoc", "break", "call", "cd", "chcp", "chdir", "cls", "color", "copy", + "ctty", "date", "del", "dir", "echo", "echo.", "endlocal", "erase", + "exit", "for", "ftype", "goto", "if", "if", "md", "mkdir", "move", + "path", "pause", "prompt", "rd", "rem", "ren", "rename", "rmdir", + "set", "setlocal", "shift", "time", "title", "type", "ver", "verify", + "vol", ":", 0 }; + + static const char *sh_chars_sh = "#;\"*?[]&|<>(){}$`^"; + static const char *sh_cmds_sh[] = + { "cd", "eval", "exec", "exit", "login", "logout", "set", "umask", "wait", + "while", "for", "case", "if", ":", ".", "break", "continue", "export", + "read", "readonly", "shift", "times", "trap", "switch", "test", +#ifdef BATCH_MODE_ONLY_SHELL + "echo", +#endif + 0 }; + + const char *sh_chars; + const char **sh_cmds; +#elif defined(__riscos__) + static const char *sh_chars = ""; + static const char *sh_cmds[] = { 0 }; +#else /* must be UNIX-ish */ + static const char *sh_chars = "#;\"*?[]&|<>(){}$`^~!"; + static const char *sh_cmds[] = + { ".", ":", "break", "case", "cd", "continue", "eval", "exec", "exit", + "export", "for", "if", "login", "logout", "read", "readonly", "set", + "shift", "switch", "test", "times", "trap", "ulimit", "umask", "unset", + "wait", "while", 0 }; + +# ifdef HAVE_DOS_PATHS + /* This is required if the MSYS/Cygwin ports (which do not define + WINDOWS32) are compiled with HAVE_DOS_PATHS defined, which uses + sh_chars_sh directly (see below). The value must be identical + to that of sh_chars immediately above. */ + static const char *sh_chars_sh = "#;\"*?[]&|<>(){}$`^~!"; +# endif /* HAVE_DOS_PATHS */ +#endif + int i; + char *p; +#ifndef NDEBUG + char *end; +#endif + char *ap; + const char *cap; + const char *cp; + int instring, word_has_equals, seen_nonequals, last_argument_was_empty; + char **new_argv = 0; + char *argstr = 0; +#ifdef WINDOWS32 + int slow_flag = 0; + + if (!unixy_shell) + { + sh_cmds = sh_cmds_dos; + sh_chars = sh_chars_dos; + } + else + { + sh_cmds = sh_cmds_sh; + sh_chars = sh_chars_sh; + } +#endif /* WINDOWS32 */ + + if (restp != NULL) + *restp = NULL; + + /* Make sure not to bother processing an empty line. */ + while (isblank ((unsigned char)*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 + 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; + + /* If there's nothing in this argument yet, skip any + whitespace before the start of the next word. */ + if (ap == new_argv[i]) + p = next_token (p + 1) - 1; + } +#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 ((unsigned char)p[1]) + && strchr (sh_chars_sh, p[1]) == 0) + /* back up one notch, to copy the backslash */ + --p; +#endif /* HAVE_DOS_PATHS */ + + /* Copy and skip the following char. */ + *ap++ = *++p; + } + break; + + case '\'': + case '"': + instring = *p; + break; + + case '\n': + if (restp != NULL) + { + /* End of the command line. */ + *restp = p; + goto end_of_line; + } + else + /* Newlines are not special. */ + *ap++ = '\n'; + break; + + case ' ': + case '\t': + /* We have the end of an argument. + Terminate the text of the argument. */ + *ap++ = '\0'; + new_argv[++i] = ap; + last_argument_was_empty = 0; + + /* Update SEEN_NONEQUALS, which tells us if every word + heretofore has contained an '='. */ + seen_nonequals |= ! word_has_equals; + if (word_has_equals && ! seen_nonequals) + /* An '=' in a word before the first + word without one is magical. */ + goto slow; + word_has_equals = 0; /* Prepare for the next word. */ + + /* If this argument is the command name, + see if it is a built-in shell command. + If so, have the shell handle it. */ + if (i == 1) + { + register int j; + for (j = 0; sh_cmds[j] != 0; ++j) + { + if (streq (sh_cmds[j], new_argv[0])) + goto slow; +#if defined(__EMX__) || defined(WINDOWS32) + /* Non-Unix shells are case insensitive. */ + if (!unixy_shell + && strcasecmp (sh_cmds[j], new_argv[0]) == 0) + goto slow; +#endif + } + } + + /* Ignore multiple whitespace chars. */ + p = next_token (p) - 1; + break; + + default: + *ap++ = *p; + break; + } + } + end_of_line: + + if (instring) + /* Let the shell deal with an unterminated quote. */ + goto slow; + + /* Terminate the last argument and the argument list. */ + + *ap = '\0'; + if (new_argv[i][0] != '\0' || last_argument_was_empty) + ++i; + new_argv[i] = 0; + + if (i == 1) + { + register int j; + for (j = 0; sh_cmds[j] != 0; ++j) + if (streq (sh_cmds[j], new_argv[0])) + goto slow; + } + + if (new_argv[0] == 0) + { + /* Line was empty. */ + free (argstr); + free (new_argv); + return 0; + } + + return new_argv; + + slow:; + /* We must use the shell. */ + + if (new_argv != 0) + { + /* Free the old argument list we were working on. */ + free (argstr); + free (new_argv); + } + +#ifdef __MSDOS__ + execute_by_shell = 1; /* actually, call 'system' if shell isn't unixy */ +#endif + +#ifdef _AMIGA + { + char *ptr; + char *buffer; + char *dptr; + + buffer = xmalloc (strlen (line)+1); + + ptr = line; + for (dptr=buffer; *ptr; ) + { + if (*ptr == '\\' && ptr[1] == '\n') + ptr += 2; + else if (*ptr == '@') /* Kludge: multiline commands */ + { + ptr += 2; + *dptr++ = '\n'; + } + else + *dptr++ = *ptr++; + } + *dptr = 0; + + new_argv = xmalloc (2 * sizeof (char *)); + new_argv[0] = buffer; + new_argv[1] = 0; + } +#else /* Not Amiga */ +#ifdef WINDOWS32 + /* + * Not eating this whitespace caused things like + * + * sh -c "\n" + * + * which gave the shell fits. I think we have to eat + * whitespace here, but this code should be considered + * suspicious if things start failing.... + */ + + /* Make sure not to bother processing an empty line. */ + while (isspace ((unsigned char)*line)) + ++line; + if (*line == '\0') + return 0; +#endif /* WINDOWS32 */ + + { + /* SHELL may be a multi-word command. Construct a command line + "$(SHELL) $(.SHELLFLAGS) LINE", with all special chars in LINE escaped. + Then recurse, expanding this command line to get the final + argument list. */ + + char *new_line; + unsigned int shell_len = strlen (shell); + unsigned int line_len = strlen (line); + unsigned int sflags_len = shellflags ? strlen (shellflags) : 0; +#ifdef WINDOWS32 + char *command_ptr = NULL; /* used for batch_mode_shell mode */ +#endif + +# ifdef __EMX__ /* is this necessary? */ + if (!unixy_shell && shellflags) + shellflags[0] = '/'; /* "/c" */ +# endif + + /* In .ONESHELL mode we are allowed to throw the entire current + recipe string at a single shell and trust that the user + has configured the shell and shell flags, and formatted + the string, appropriately. */ + if (one_shell) + { + /* If the shell is Bourne compatible, we must remove and ignore + interior special chars [@+-] because they're meaningless to + the shell itself. If, however, we're in .ONESHELL mode and + have changed SHELL to something non-standard, we should + leave those alone because they could be part of the + script. In this case we must also leave in place + any leading [@+-] for the same reason. */ + + /* Remove and ignore interior prefix chars [@+-] because they're + meaningless given a single shell. */ +#if defined __MSDOS__ || defined (__EMX__) + if (unixy_shell) /* the test is complicated and we already did it */ +#else + if (is_bourne_compatible_shell (shell) +#ifdef WINDOWS32 + /* If we didn't find any sh.exe, don't behave is if we did! */ + && !no_default_sh_exe +#endif + ) +#endif + { + const char *f = line; + char *t = line; + + /* Copy the recipe, removing and ignoring interior prefix chars + [@+-]: they're meaningless in .ONESHELL mode. */ + while (f[0] != '\0') + { + int esc = 0; + + /* This is the start of a new recipe line. + Skip whitespace and prefix characters. */ + 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. */ + 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 whitespace that follows 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) + { + int c = *t; + *t = '\0'; + fputs (tstart, batch); + DB (DB_JOBS, ("\t%s", tstart)); + tstart = t; + *t = c; + } + } + DB (DB_JOBS, ("\n")); + fclose (batch); + + /* Create an argv list for the shell command line that + will run the batch file. */ + new_argv = xmalloc (2 * sizeof (char *)); + new_argv[0] = xstrdup (*batch_filename); + new_argv[1] = NULL; + return new_argv; + } +#endif /* WINDOWS32 */ + /* Create an argv list for the shell command line. */ + { + int n = 0; + + new_argv = xmalloc ((4 + sflags_len/2) * sizeof (char *)); + new_argv[n++] = xstrdup (shell); + + /* Chop up the shellflags (if any) and assign them. */ + if (! shellflags) + new_argv[n++] = xstrdup (""); + else + { + const char *s = shellflags; + char *t; + unsigned int len; + while ((t = find_next_token (&s, &len)) != 0) + new_argv[n++] = xstrndup (t, len); + } + + /* Set the command to invoke. */ + new_argv[n++] = line; + new_argv[n++] = NULL; + } + return new_argv; + } + + new_line = xmalloc ((shell_len*2) + 1 + sflags_len + 1 + + (line_len*2) + 1); + ap = new_line; + /* Copy SHELL, escaping any characters special to the shell. If + we don't escape them, construct_command_argv_internal will + recursively call itself ad nauseam, or until stack overflow, + whichever happens first. */ + for (cp = shell; *cp != '\0'; ++cp) + { + if (strchr (sh_chars, *cp) != 0) + *(ap++) = '\\'; + *(ap++) = *cp; + } + *(ap++) = ' '; + if (shellflags) + memcpy (ap, shellflags, sflags_len); + ap += sflags_len; + *(ap++) = ' '; +#ifdef WINDOWS32 + command_ptr = ap; +#endif + for (p = line; *p != '\0'; ++p) + { + if (restp != NULL && *p == '\n') + { + *restp = p; + break; + } + else if (*p == '\\' && p[1] == '\n') + { + /* POSIX says we keep the backslash-newline. If we don't have a + POSIX shell on DOS/Windows/OS2, mimic the pre-POSIX behavior + and remove the backslash/newline. */ +#if defined (__MSDOS__) || defined (__EMX__) || defined (WINDOWS32) +# define PRESERVE_BSNL unixy_shell +#else +# define PRESERVE_BSNL 1 +#endif + if (PRESERVE_BSNL) + { + *(ap++) = '\\'; + /* Only non-batch execution needs another backslash, + because it will be passed through a recursive + invocation of this function. */ + if (!batch_mode_shell) + *(ap++) = '\\'; + *(ap++) = '\n'; + } + ++p; + continue; + } + + /* DOS shells don't know about backslash-escaping. */ + if (unixy_shell && !batch_mode_shell && + (*p == '\\' || *p == '\'' || *p == '"' + || isspace ((unsigned char)*p) + || strchr (sh_chars, *p) != 0)) + *ap++ = '\\'; +#ifdef __MSDOS__ + else if (unixy_shell && strneq (p, "...", 3)) + { + /* The case of '...' wildcard again. */ + strcpy (ap, "\\.\\.\\"); + ap += 5; + p += 2; + } +#endif + *ap++ = *p; + } + if (ap == new_line + shell_len + sflags_len + 2) + { + /* Line was empty. */ + free (new_line); + return 0; + } + *ap = '\0'; + +#ifdef WINDOWS32 + /* Some shells do not work well when invoked as 'sh -c xxx' to run a + command line (e.g. Cygnus GNUWIN32 sh.exe on WIN32 systems). In these + cases, run commands via a script file. */ + if (just_print_flag && !(flags & COMMANDS_RECURSE)) + { + /* Need to allocate new_argv, although it's unused, because + start_job_command will want to free it and its 0'th element. */ + new_argv = xmalloc (2 * sizeof (char *)); + new_argv[0] = xstrdup (""); + new_argv[1] = NULL; + } + else if ((no_default_sh_exe || batch_mode_shell) && batch_filename) + { + int temp_fd; + FILE* batch = NULL; + int id = GetCurrentProcessId (); + PATH_VAR (fbuf); + + /* create a file name */ + sprintf (fbuf, "make%d", id); + *batch_filename = create_batch_file (fbuf, unixy_shell, &temp_fd); + + DB (DB_JOBS, (_("Creating temporary batch file %s\n"), + *batch_filename)); + + /* Create a FILE object for the batch file, and write to it the + commands to be executed. Put the batch file in TEXT mode. */ + _setmode (temp_fd, _O_TEXT); + batch = _fdopen (temp_fd, "wt"); + if (!unixy_shell) + fputs ("@echo off\n", batch); + fputs (command_ptr, batch); + fputc ('\n', batch); + fclose (batch); + DB (DB_JOBS, (_("Batch file contents:%s\n\t%s\n"), + !unixy_shell ? "\n\t@echo off" : "", command_ptr)); + + /* create argv */ + new_argv = xmalloc (3 * sizeof (char *)); + if (unixy_shell) + { + new_argv[0] = xstrdup (shell); + new_argv[1] = *batch_filename; /* only argv[0] gets freed later */ + } + else + { + new_argv[0] = xstrdup (*batch_filename); + new_argv[1] = NULL; + } + new_argv[2] = NULL; + } + else +#endif /* WINDOWS32 */ + + if (unixy_shell) + new_argv = construct_command_argv_internal (new_line, 0, 0, 0, 0, + flags, 0); + +#ifdef __EMX__ + else if (!unixy_shell) + { + /* new_line is local, must not be freed therefore + We use line here instead of new_line because we run the shell + manually. */ + size_t line_len = strlen (line); + char *p = new_line; + char *q = new_line; + memcpy (new_line, line, line_len + 1); + /* Replace all backslash-newline combination and also following tabs. + Important: stop at the first '\n' because that's what the loop above + did. The next line starting at restp[0] will be executed during the + next call of this function. */ + while (*q != '\0' && *q != '\n') + { + if (q[0] == '\\' && q[1] == '\n') + q += 2; /* remove '\\' and '\n' */ + else + *p++ = *q++; + } + *p = '\0'; + +# ifndef NO_CMD_DEFAULT + if (strnicmp (new_line, "echo", 4) == 0 + && (new_line[4] == ' ' || new_line[4] == '\t')) + { + /* the builtin echo command: handle it separately */ + size_t echo_len = line_len - 5; + char *echo_line = new_line + 5; + + /* special case: echo 'x="y"' + cmd works this way: a string is printed as is, i.e., no quotes + are removed. But autoconf uses a command like echo 'x="y"' to + determine whether make works. autoconf expects the output x="y" + so we will do exactly that. + Note: if we do not allow cmd to be the default shell + we do not need this kind of voodoo */ + if (echo_line[0] == '\'' + && echo_line[echo_len - 1] == '\'' + && strncmp (echo_line + 1, "ac_maketemp=", + strlen ("ac_maketemp=")) == 0) + { + /* remove the enclosing quotes */ + memmove (echo_line, echo_line + 1, echo_len - 2); + echo_line[echo_len - 2] = '\0'; + } + } +# endif + + { + /* Let the shell decide what to do. Put the command line into the + 2nd command line argument and hope for the best ;-) */ + size_t sh_len = strlen (shell); + + /* exactly 3 arguments + NULL */ + new_argv = xmalloc (4 * sizeof (char *)); + /* Exactly strlen(shell) + strlen("/c") + strlen(line) + 3 times + the trailing '\0' */ + new_argv[0] = xmalloc (sh_len + line_len + 5); + memcpy (new_argv[0], shell, sh_len + 1); + new_argv[1] = new_argv[0] + sh_len + 1; + memcpy (new_argv[1], "/c", 3); + new_argv[2] = new_argv[1] + 3; + memcpy (new_argv[2], new_line, line_len + 1); + new_argv[3] = NULL; + } + } +#elif defined(__MSDOS__) + else + { + /* With MSDOS shells, we must construct the command line here + instead of recursively calling ourselves, because we + cannot backslash-escape the special characters (see above). */ + new_argv = xmalloc (sizeof (char *)); + line_len = strlen (new_line) - shell_len - sflags_len - 2; + new_argv[0] = xmalloc (line_len + 1); + strncpy (new_argv[0], + new_line + shell_len + sflags_len + 2, line_len); + new_argv[0][line_len] = '\0'; + } +#else + else + fatal (NILF, CSTRLEN (__FILE__) + INTSTR_LENGTH, + _("%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"), + __FILE__, __LINE__); +#endif + + free (new_line); + } +#endif /* ! AMIGA */ + + return new_argv; +} +#endif /* !VMS */ + +/* Figure out the argument list necessary to run LINE as a command. Try to + avoid using a shell. This routine handles only ' quoting, and " quoting + when no backslash, $ or ' characters are seen in the quotes. Starting + quotes may be escaped with a backslash. If any of the characters in + sh_chars is seen, or any of the builtin commands listed in sh_cmds + is the first word of a line, the shell is used. + + If RESTP is not NULL, *RESTP is set to point to the first newline in LINE. + If *RESTP is NULL, newlines will be ignored. + + FILE is the target whose commands these are. It is used for + variable expansion for $(SHELL) and $(IFS). */ + +char ** +construct_command_argv (char *line, char **restp, struct file *file, + int cmd_flags, char **batch_filename) +{ + char *shell, *ifs, *shellflags; + char **argv; + +#ifdef VMS + char *cptr; + int argc; + + argc = 0; + cptr = line; + for (;;) + { + while ((*cptr != 0) + && (isspace ((unsigned char)*cptr))) + cptr++; + if (*cptr == 0) + break; + while ((*cptr != 0) + && (!isspace ((unsigned char)*cptr))) + cptr++; + argc++; + } + + argv = xmalloc (argc * sizeof (char *)); + if (argv == 0) + abort (); + + cptr = line; + argc = 0; + for (;;) + { + while ((*cptr != 0) + && (isspace ((unsigned char)*cptr))) + cptr++; + if (*cptr == 0) + break; + DB (DB_JOBS, ("argv[%d] = [%s]\n", argc, cptr)); + argv[argc++] = cptr; + while ((*cptr != 0) + && (!isspace ((unsigned char)*cptr))) + cptr++; + if (*cptr != 0) + *cptr++ = 0; + } +#else + { + /* Turn off --warn-undefined-variables while we expand SHELL and IFS. */ + int save = warn_undefined_variables_flag; + warn_undefined_variables_flag = 0; + + shell = allocated_variable_expand_for_file ("$(SHELL)", file); +#ifdef WINDOWS32 + /* + * Convert to forward slashes so that construct_command_argv_internal() + * is not confused. + */ + if (shell) + { + char *p = w32ify (shell, 0); + strcpy (shell, p); + } +#endif +#ifdef __EMX__ + { + static const char *unixroot = NULL; + static const char *last_shell = ""; + static int init = 0; + if (init == 0) + { + unixroot = getenv ("UNIXROOT"); + /* unixroot must be NULL or not empty */ + if (unixroot && unixroot[0] == '\0') unixroot = NULL; + init = 1; + } + + /* if we have an unixroot drive and if shell is not default_shell + (which means it's either cmd.exe or the test has already been + performed) and if shell is an absolute path without drive letter, + try whether it exists e.g.: if "/bin/sh" does not exist use + "$UNIXROOT/bin/sh" instead. */ + if (unixroot && shell && strcmp (shell, last_shell) != 0 + && (shell[0] == '/' || shell[0] == '\\')) + { + /* trying a new shell, check whether it exists */ + size_t size = strlen (shell); + char *buf = xmalloc (size + 7); + memcpy (buf, shell, size); + memcpy (buf + size, ".exe", 5); /* including the trailing '\0' */ + if (access (shell, F_OK) != 0 && access (buf, F_OK) != 0) + { + /* try the same for the unixroot drive */ + memmove (buf + 2, buf, size + 5); + buf[0] = unixroot[0]; + buf[1] = unixroot[1]; + if (access (buf, F_OK) == 0) + /* we have found a shell! */ + /* free(shell); */ + shell = buf; + else + free (buf); + } + else + free (buf); + } + } +#endif /* __EMX__ */ + + shellflags = allocated_variable_expand_for_file ("$(.SHELLFLAGS)", file); + ifs = allocated_variable_expand_for_file ("$(IFS)", file); + + warn_undefined_variables_flag = save; + } + + argv = construct_command_argv_internal (line, restp, shell, shellflags, ifs, + cmd_flags, batch_filename); + + free (shell); + free (shellflags); + free (ifs); +#endif /* !VMS */ + return argv; +} + +#if !defined(HAVE_DUP2) && !defined(_AMIGA) +int +dup2 (int old, int new) +{ + int fd; + + (void) close (new); + fd = dup (old); + if (fd != new) + { + (void) close (fd); + errno = EMFILE; + return -1; + } + + return fd; +} +#endif /* !HAVE_DUP2 && !_AMIGA */ + +/* On VMS systems, include special VMS functions. */ + +#ifdef VMS +#include "vmsjobs.c" +#endif diff --git a/job.h b/job.h new file mode 100644 index 0000000..3c921ba --- /dev/null +++ b/job.h @@ -0,0 +1,159 @@ +/* Definitions for managing subprocesses in GNU Make. +Copyright (C) 1992-2014 Free 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" + +#ifdef HAVE_FCNTL_H +# include +#else +# include +#endif + +/* How to set close-on-exec for a file descriptor. */ + +#if !defined F_SETFD +# ifdef WINDOWS32 +# define CLOSE_ON_EXEC(_d) process_noinherit(_d) +# else +# define CLOSE_ON_EXEC(_d) +# endif +#else +# ifndef FD_CLOEXEC +# define FD_CLOEXEC 1 +# endif +# define CLOSE_ON_EXEC(_d) (void) fcntl ((_d), F_SETFD, FD_CLOEXEC) +#endif + +#ifdef NO_OUTPUT_SYNC +# define RECORD_SYNC_MUTEX(m) \ + O (error, NILF, \ + _("-O[TYPE] (--output-sync[=TYPE]) is not configured for this build.")); +#else +# ifdef WINDOWS32 +/* For emulations in w32/compat/posixfcn.c. */ +# define F_GETFD 1 +# define F_SETLKW 2 +/* Implementation note: None of the values of l_type below can be zero + -- they are compared with a static instance of the struct, so zero + means unknown/invalid, see w32/compat/posixfcn.c. */ +# define F_WRLCK 1 +# define F_UNLCK 2 + +struct flock + { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; + }; + +/* This type is actually a HANDLE, but we want to avoid including + windows.h as much as possible. */ +typedef intptr_t sync_handle_t; + +/* Public functions emulated/provided in posixfcn.c. */ +int fcntl (intptr_t fd, int cmd, ...); +intptr_t create_mutex (void); +int same_stream (FILE *f1, FILE *f2); + +# define RECORD_SYNC_MUTEX(m) record_sync_mutex(m) +void record_sync_mutex (const char *str); +void prepare_mutex_handle_string (intptr_t hdl); +# else /* !WINDOWS32 */ + +typedef int sync_handle_t; /* file descriptor */ + +# define RECORD_SYNC_MUTEX(m) (void)(m) + +# endif +#endif /* !NO_OUTPUT_SYNC */ + +/* Structure describing a running or dead child process. */ + +struct child + { + struct child *next; /* Link in the chain. */ + + struct file *file; /* File being remade. */ + + char **environment; /* Environment for commands. */ + char *sh_batch_file; /* Script file for shell commands */ + char **command_lines; /* Array of variable-expanded cmd lines. */ + char *command_ptr; /* Ptr into command_lines[command_line]. */ + +#ifdef VMS + char *comname; /* Temporary command file name */ + int efn; /* Completion event flag number */ + int cstatus; /* Completion status */ +#endif + + unsigned int command_line; /* Index into command_lines. */ + struct output output; /* Output for this child. */ + pid_t pid; /* Child process's ID number. */ + unsigned int remote:1; /* Nonzero if executing remotely. */ + unsigned int noerror:1; /* Nonzero if commands contained a '-'. */ + unsigned int good_stdin:1; /* Nonzero if this child has a good stdin. */ + unsigned int deleted:1; /* Nonzero if targets have been deleted. */ + unsigned int dontcare:1; /* Saved dontcare flag. */ + }; + +extern struct child *children; + +int is_bourne_compatible_shell(const char *path); +void new_job (struct file *file); +void reap_children (int block, int err); +void start_waiting_jobs (void); + +char **construct_command_argv (char *line, char **restp, struct file *file, + int cmd_flags, char** batch_file); +#ifdef VMS +int child_execute_job (char *argv, struct child *child); +#else +# define FD_STDIN (fileno (stdin)) +# define FD_STDOUT (fileno (stdout)) +# define FD_STDERR (fileno (stderr)) +# if defined(__EMX__) +int child_execute_job (int stdin_fd, int stdout_fd, int stderr_fd, + char **argv, char **envp); +# else +void child_execute_job (int stdin_fd, int stdout_fd, int stderr_fd, + char **argv, char **envp) __attribute__ ((noreturn)); +# endif +#endif +#ifdef _AMIGA +void exec_command (char **argv) __attribute__ ((noreturn)); +#elif defined(__EMX__) +int exec_command (char **argv, char **envp); +#else +void exec_command (char **argv, char **envp) __attribute__ ((noreturn)); +#endif + +extern unsigned int job_slots_used; + +void block_sigs (void); +#ifdef POSIX +void unblock_sigs (void); +#else +#ifdef HAVE_SIGSETMASK +extern int fatal_signal_mask; +#define unblock_sigs() sigsetmask (0) +#else +#define unblock_sigs() +#endif +#endif + +extern unsigned int jobserver_tokens; diff --git a/load.c b/load.c new file mode 100644 index 0000000..79294b3 --- /dev/null +++ b/load.c @@ -0,0 +1,255 @@ +/* Loading dynamic objects for GNU Make. +Copyright (C) 2012-2014 Free 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 gmk_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 gmk_floc *flocp, const char **ldname, int noerror) +{ + int nmlen = strlen (*ldname); + char *new = alloca (nmlen + CSTRLEN (SYMBOL_EXTENSION) + 1); + char *symname = NULL; + char *loaded; + const char *fp; + int r; + load_func_t symp; + + /* Break the input into an object file name and a symbol name. If no symbol + name was provided, compute one from the object file name. */ + fp = strchr (*ldname, '('); + if (fp) + { + const char *ep; + + /* There's an open paren, so see if there's a close paren: if so use + that as the symbol name. We can't have whitespace: it would have + been chopped up before this function is called. */ + ep = strchr (fp+1, ')'); + if (ep && ep[1] == '\0') + { + int l = fp - *ldname;; + + ++fp; + if (fp == ep) + OS (fatal, flocp, _("Empty symbol name for load: %s"), *ldname); + + /* Make a copy of the ldname part. */ + memcpy (new, *ldname, l); + new[l] = '\0'; + *ldname = new; + nmlen = l; + + /* Make a copy of the symbol name part. */ + symname = new + l + 1; + memcpy (symname, fp, ep - fp); + symname[ep - fp] = '\0'; + } + } + + /* Add this name to the string cache so it can be reused later. */ + *ldname = strcache_add (*ldname); + + /* If this object has been loaded, we're done. */ + loaded = allocated_variable_expand ("$(.LOADED)"); + fp = strstr (loaded, *ldname); + r = fp && (fp==loaded || fp[-1]==' ') && (fp[nmlen]=='\0' || fp[nmlen]==' '); + free (loaded); + if (r) + return 1; + + /* 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) + do_variable_definition (flocp, ".LOADED", *ldname, o_default, f_append, 0); + + 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 gmk_floc *flocp, const char **ldname, int noerror) +{ + if (! noerror) + O (fatal, flocp, + _("The 'load' operation is not supported on this platform.")); + + return 0; +} + +void +unload_file (const char *name) +{ + O (fatal, NILF, "INTERNAL: Cannot unload when load is not supported!"); +} + +#endif /* MAKE_LOAD */ diff --git a/loadapi.c b/loadapi.c new file mode 100644 index 0000000..fb275dd --- /dev/null +++ b/loadapi.c @@ -0,0 +1,70 @@ +/* API for GNU Make dynamic objects. +Copyright (C) 2013-2014 Free 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 *floc) +{ + /* Preserve existing variable buffer context. */ + char *pbuf; + unsigned int plen; + char *s; + + install_variable_buffer (&pbuf, &plen); + + s = xstrdup (buffer); + eval_buffer (s, floc); + 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/main.c b/main.c new file mode 100644 index 0000000..7f14cba --- /dev/null +++ b/main.c @@ -0,0 +1,3455 @@ +/* Argument parsing and main program of GNU Make. +Copyright (C) 1988-2014 Free 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" +#include "rule.h" +#include "debug.h" +#include "getopt.h" + +#include +#ifdef _AMIGA +# include +# include +#endif +#ifdef WINDOWS32 +# include +# include +# 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 + +void init_dir (void); +void remote_setup (void); +void remote_cleanup (void); +RETSIGTYPE fatal_error_signal (int sig); + +void print_variable_data_base (void); +void print_dir_data_base (void); +void print_rule_data_base (void); +void print_vpath_data_base (void); + +void verify_file_data_base (void); + +#if defined HAVE_WAITPID || defined HAVE_WAIT3 +# define HAVE_WAIT_NOHANG +#endif + +#ifndef HAVE_UNISTD_H +int chdir (); +#endif +#ifndef STDC_HEADERS +# ifndef sun /* Sun has an incorrect decl in a header. */ +void exit (int) __attribute__ ((noreturn)); +# endif +double atof (); +#endif + +static void clean_jobserver (int status); +static void print_data_base (void); +static void print_version (void); +static void decode_switches (int argc, const char **argv, int env); +static void decode_env_switches (const char *envar, unsigned int len); +static struct variable *define_makeflags (int all, int makefile); +static char *quote_for_env (char *out, const char *in); +static void initialize_global_hash_tables (void); + + +/* The structure that describes an accepted command switch. */ + +struct command_switch + { + int c; /* The switch character. */ + + enum /* Type of the value. */ + { + flag, /* Turn int flag on. */ + flag_off, /* Turn int flag off. */ + string, /* One string per invocation. */ + strlist, /* One string per switch. */ + filename, /* A string containing a file name. */ + positive_int, /* A positive integer. */ + floating, /* A floating-point number (double). */ + ignore /* Ignored. */ + } type; + + void *value_ptr; /* Pointer to the value-holding variable. */ + + unsigned int env:1; /* Can come from MAKEFLAGS. */ + unsigned int toenv:1; /* Should be put in MAKEFLAGS. */ + unsigned int no_makefile:1; /* Don't propagate when remaking makefiles. */ + + const void *noarg_value; /* Pointer to value used if no arg given. */ + const void *default_value; /* Pointer to default value. */ + + const char *long_name; /* Long option name. */ + }; + +/* True if C is a switch value that corresponds to a short option. */ + +#define short_option(c) ((c) <= CHAR_MAX) + +/* The structure used to hold the list of strings given + in command switches of a type that takes strlist arguments. */ + +struct stringlist + { + const char **list; /* Nil-terminated list of strings. */ + unsigned int idx; /* Index into above. */ + unsigned int max; /* Number of pointers allocated. */ + }; + + +/* The recognized command switches. */ + +/* Nonzero means do extra verification (that may slow things down). */ + +int verify_flag; + +/* Nonzero means do not print commands to be executed (-s). */ + +int silent_flag; + +/* Nonzero means just touch the files + that would appear to need remaking (-t) */ + +int touch_flag; + +/* Nonzero means just print what commands would need to be executed, + don't actually execute them (-n). */ + +int just_print_flag; + +/* Print debugging info (--debug). */ + +static struct stringlist *db_flags = 0; +static int debug_flag = 0; + +int db_level = 0; + +/* Synchronize output (--output-sync). */ + +char *output_sync_option = 0; + +#ifdef WINDOWS32 +/* Suspend make in main for a short time to allow debugger to attach */ + +int suspend_flag = 0; +#endif + +/* Environment variables override makefile definitions. */ + +int env_overrides = 0; + +/* Nonzero means ignore status codes returned by commands + executed to remake files. Just treat them all as successful (-i). */ + +int ignore_errors_flag = 0; + +/* Nonzero means don't remake anything, just print the data base + that results from reading the makefile (-p). */ + +int print_data_base_flag = 0; + +/* Nonzero means don't remake anything; just return a nonzero status + if the specified targets are not up to date (-q). */ + +int question_flag = 0; + +/* Nonzero means do not use any of the builtin rules (-r) / variables (-R). */ + +int no_builtin_rules_flag = 0; +int no_builtin_variables_flag = 0; + +/* Nonzero means keep going even if remaking some file fails (-k). */ + +int keep_going_flag; +int default_keep_going_flag = 0; + +/* Nonzero means check symlink mtimes. */ + +int check_symlink_flag = 0; + +/* Nonzero means print directory before starting and when done (-w). */ + +int print_directory_flag = 0; + +/* Nonzero means ignore print_directory_flag and never print the directory. + This is necessary because print_directory_flag is set implicitly. */ + +int inhibit_print_directory_flag = 0; + +/* Nonzero means print version information. */ + +int print_version_flag = 0; + +/* List of makefiles given with -f switches. */ + +static struct stringlist *makefiles = 0; + +/* Size of the stack when we started. */ + +#ifdef SET_STACK_SIZE +struct rlimit stack_limit; +#endif + + +/* Number of job slots (commands that can be run at once). */ + +unsigned int job_slots = 1; +unsigned int default_job_slots = 1; +static unsigned int master_job_slots = 0; + +/* Value of job_slots that means no limit. */ + +static unsigned int inf_jobs = 0; + +/* File descriptors for the jobs pipe. */ + +char *jobserver_fds = 0; + +int job_fds[2] = { -1, -1 }; +int job_rfd = -1; + +/* Handle for the mutex used on Windows to synchronize output of our + children under -O. */ + +char *sync_mutex = 0; + +/* Maximum load average at which multiple jobs will be run. + Negative values mean unlimited, while zero means limit to + zero load (which could be useful to start infinite jobs remotely + but one at a time locally). */ +#ifndef NO_FLOAT +double max_load_average = -1.0; +double default_load_average = -1.0; +#else +int max_load_average = -1; +int default_load_average = -1; +#endif + +/* List of directories given with -C switches. */ + +static struct stringlist *directories = 0; + +/* List of include directories given with -I switches. */ + +static struct stringlist *include_directories = 0; + +/* List of files given with -o switches. */ + +static struct stringlist *old_files = 0; + +/* List of files given with -W switches. */ + +static struct stringlist *new_files = 0; + +/* List of strings to be eval'd. */ +static struct stringlist *eval_strings = 0; + +/* If nonzero, we should just print usage and exit. */ + +static int print_usage_flag = 0; + +/* If nonzero, we should print a warning message + for each reference to an undefined variable. */ + +int warn_undefined_variables_flag; + +/* If nonzero, always build all targets, regardless of whether + they appear out of date or not. */ + +static int always_make_set = 0; +int always_make_flag = 0; + +/* If nonzero, we're in the "try to rebuild makefiles" phase. */ + +int rebuilding_makefiles = 0; + +/* Remember the original value of the SHELL variable, from the environment. */ + +struct variable shell_var; + +/* This character introduces a command: it's the first char on the line. */ + +char cmd_prefix = '\t'; + + +/* The usage output. We write it this way to make life easier for the + translators, especially those trying to translate to right-to-left + languages like Hebrew. */ + +static const char *const usage[] = + { + N_("Options:\n"), + N_("\ + -b, -m Ignored for compatibility.\n"), + N_("\ + -B, --always-make Unconditionally make all targets.\n"), + N_("\ + -C DIRECTORY, --directory=DIRECTORY\n\ + Change to DIRECTORY before doing anything.\n"), + N_("\ + -d Print lots of debugging information.\n"), + N_("\ + --debug[=FLAGS] Print various types of debugging information.\n"), + N_("\ + -e, --environment-overrides\n\ + Environment variables override makefiles.\n"), + N_("\ + --eval=STRING Evaluate STRING as a makefile statement.\n"), + N_("\ + -f FILE, --file=FILE, --makefile=FILE\n\ + Read FILE as a makefile.\n"), + N_("\ + -h, --help Print this message and exit.\n"), + N_("\ + -i, --ignore-errors Ignore errors from recipes.\n"), + N_("\ + -I DIRECTORY, --include-dir=DIRECTORY\n\ + Search DIRECTORY for included makefiles.\n"), + N_("\ + -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no arg.\n"), + N_("\ + -k, --keep-going Keep going when some targets can't be made.\n"), + N_("\ + -l [N], --load-average[=N], --max-load[=N]\n\ + Don't start multiple jobs unless load is below N.\n"), + N_("\ + -L, --check-symlink-times Use the latest mtime between symlinks and target.\n"), + N_("\ + -n, --just-print, --dry-run, --recon\n\ + Don't actually run any recipe; just print them.\n"), + N_("\ + -o FILE, --old-file=FILE, --assume-old=FILE\n\ + Consider FILE to be very old and don't remake it.\n"), + N_("\ + -O[TYPE], --output-sync[=TYPE]\n\ + Synchronize output of parallel jobs by TYPE.\n"), + N_("\ + -p, --print-data-base Print make's internal database.\n"), + N_("\ + -q, --question Run no recipe; exit status says if up to date.\n"), + N_("\ + -r, --no-builtin-rules Disable the built-in implicit rules.\n"), + N_("\ + -R, --no-builtin-variables Disable the built-in variable settings.\n"), + N_("\ + -s, --silent, --quiet Don't echo recipes.\n"), + N_("\ + -S, --no-keep-going, --stop\n\ + Turns off -k.\n"), + N_("\ + -t, --touch Touch targets instead of remaking them.\n"), + N_("\ + --trace Print tracing information.\n"), + N_("\ + -v, --version Print the version number of make and exit.\n"), + N_("\ + -w, --print-directory Print the current directory.\n"), + N_("\ + --no-print-directory Turn off -w, even if it was turned on implicitly.\n"), + N_("\ + -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n\ + Consider FILE to be infinitely new.\n"), + N_("\ + --warn-undefined-variables Warn when an undefined variable is referenced.\n"), + NULL + }; + +/* The table of command switches. + Order matters here: this is the order MAKEFLAGS will be constructed. + So be sure all simple flags (single char, no argument) come first. */ + +static const struct command_switch switches[] = + { + { 'b', ignore, 0, 0, 0, 0, 0, 0, 0 }, + { 'B', flag, &always_make_set, 1, 1, 0, 0, 0, "always-make" }, + { 'd', flag, &debug_flag, 1, 1, 0, 0, 0, 0 }, +#ifdef WINDOWS32 + { 'D', flag, &suspend_flag, 1, 1, 0, 0, 0, "suspend-for-debug" }, +#endif + { 'e', flag, &env_overrides, 1, 1, 0, 0, 0, "environment-overrides", }, + { 'h', flag, &print_usage_flag, 0, 0, 0, 0, 0, "help" }, + { 'i', flag, &ignore_errors_flag, 1, 1, 0, 0, 0, "ignore-errors" }, + { 'k', flag, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag, + "keep-going" }, + { 'L', flag, &check_symlink_flag, 1, 1, 0, 0, 0, "check-symlink-times" }, + { 'm', ignore, 0, 0, 0, 0, 0, 0, 0 }, + { 'n', flag, &just_print_flag, 1, 1, 1, 0, 0, "just-print" }, + { 'p', flag, &print_data_base_flag, 1, 1, 0, 0, 0, "print-data-base" }, + { 'q', flag, &question_flag, 1, 1, 1, 0, 0, "question" }, + { 'r', flag, &no_builtin_rules_flag, 1, 1, 0, 0, 0, "no-builtin-rules" }, + { 'R', flag, &no_builtin_variables_flag, 1, 1, 0, 0, 0, + "no-builtin-variables" }, + { 's', flag, &silent_flag, 1, 1, 0, 0, 0, "silent" }, + { 'S', flag_off, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag, + "no-keep-going" }, + { 't', flag, &touch_flag, 1, 1, 1, 0, 0, "touch" }, + { 'v', flag, &print_version_flag, 1, 1, 0, 0, 0, "version" }, + { 'w', flag, &print_directory_flag, 1, 1, 0, 0, 0, "print-directory" }, + + /* These options take arguments. */ + { 'C', filename, &directories, 0, 0, 0, 0, 0, "directory" }, + { 'f', filename, &makefiles, 0, 0, 0, 0, 0, "file" }, + { 'I', filename, &include_directories, 1, 1, 0, 0, 0, + "include-dir" }, + { 'j', positive_int, &job_slots, 1, 1, 0, &inf_jobs, &default_job_slots, + "jobs" }, +#ifndef NO_FLOAT + { 'l', floating, &max_load_average, 1, 1, 0, &default_load_average, + &default_load_average, "load-average" }, +#else + { 'l', positive_int, &max_load_average, 1, 1, 0, &default_load_average, + &default_load_average, "load-average" }, +#endif + { 'o', filename, &old_files, 0, 0, 0, 0, 0, "old-file" }, + { 'O', string, &output_sync_option, 1, 1, 0, "target", 0, "output-sync" }, + { 'W', filename, &new_files, 0, 0, 0, 0, 0, "what-if" }, + + /* These are long-style options. */ + { CHAR_MAX+1, strlist, &db_flags, 1, 1, 0, "basic", 0, "debug" }, + { CHAR_MAX+2, string, &jobserver_fds, 1, 1, 0, 0, 0, "jobserver-fds" }, + { CHAR_MAX+3, flag, &trace_flag, 1, 1, 0, 0, 0, "trace" }, + { CHAR_MAX+4, flag, &inhibit_print_directory_flag, 1, 1, 0, 0, 0, + "no-print-directory" }, + { CHAR_MAX+5, flag, &warn_undefined_variables_flag, 1, 1, 0, 0, 0, + "warn-undefined-variables" }, + { CHAR_MAX+6, strlist, &eval_strings, 1, 0, 0, 0, 0, "eval" }, + { CHAR_MAX+7, string, &sync_mutex, 1, 1, 0, 0, 0, "sync-mutex" }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }; + +/* Secondary long names for options. */ + +static struct option long_option_aliases[] = + { + { "quiet", no_argument, 0, 's' }, + { "stop", no_argument, 0, 'S' }, + { "new-file", required_argument, 0, 'W' }, + { "assume-new", required_argument, 0, 'W' }, + { "assume-old", required_argument, 0, 'o' }, + { "max-load", optional_argument, 0, 'l' }, + { "dry-run", no_argument, 0, 'n' }, + { "recon", no_argument, 0, 'n' }, + { "makefile", required_argument, 0, 'f' }, + }; + +/* List of goal targets. */ + +static struct dep *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. */ + +#ifdef WINDOWS32 +/* On MS-Windows, we chop off the .exe suffix in 'main', so this + cannot be 'const'. */ +char *program; +#else +const char *program; +#endif + +/* Our current directory before processing any -C options. */ + +char *directory_before_chdir; + +/* Our current directory after processing all -C options. */ + +char *starting_directory; + +/* Value of the MAKELEVEL variable at startup (or 0). */ + +unsigned int makelevel; + +/* Pointer to the value of the .DEFAULT_GOAL special variable. + The value will be the name of the goal to remake if the command line + does not override it. It can be set by the makefile, or else it's + the first target defined in the makefile whose name does not start + with '.'. */ + +struct variable * default_goal_var; + +/* Pointer to structure for the file .DEFAULT + whose commands are used for any file that has none of its own. + This is zero if the makefiles do not define .DEFAULT. */ + +struct file *default_file; + +/* Nonzero if we have seen the magic '.POSIX' target. + This turns on pedantic compliance with POSIX.2. */ + +int posix_pedantic; + +/* Nonzero if we have seen the '.SECONDEXPANSION' target. + This turns on secondary expansion of prerequisites. */ + +int second_expansion; + +/* Nonzero if we have seen the '.ONESHELL' target. + This causes the entire recipe to be handed to SHELL + as a single string, potentially containing newlines. */ + +int one_shell; + +/* One of OUTPUT_SYNC_* if the "--output-sync" option was given. This + attempts to synchronize the output of parallel jobs such that the results + of each job stay together. */ + +int output_sync = OUTPUT_SYNC_NONE; + +/* Nonzero if the "--trace" option was given. */ + +int trace_flag = 0; + +/* Nonzero if we have seen the '.NOTPARALLEL' target. + This turns off parallel builds for this invocation of make. */ + +int not_parallel; + +/* Nonzero if some rule detected clock skew; we keep track so (a) we only + print one warning about it during the run, and (b) we can print a final + warning at the end of the run. */ + +int clock_skew_detected; + +/* Map of possible stop characters for searching strings. */ +#ifndef UCHAR_MAX +# define UCHAR_MAX 255 +#endif +unsigned short stopchar_map[UCHAR_MAX + 1] = {0}; + +/* If output-sync is enabled we'll collect all the output generated due to + options, while reading makefiles, etc. */ + +struct output make_sync; + + +/* Mask of signals that are being caught with fatal_error_signal. */ + +#ifdef POSIX +sigset_t fatal_signal_set; +#else +# ifdef HAVE_SIGSETMASK +int fatal_signal_mask; +# endif +#endif + +#if !HAVE_DECL_BSD_SIGNAL && !defined bsd_signal +# if !defined HAVE_SIGACTION +# define bsd_signal signal +# else +typedef RETSIGTYPE (*bsd_signal_ret_t) (int); + +static bsd_signal_ret_t +bsd_signal (int sig, bsd_signal_ret_t func) +{ + struct sigaction act, oact; + act.sa_handler = func; + act.sa_flags = SA_RESTART; + sigemptyset (&act.sa_mask); + sigaddset (&act.sa_mask, sig); + if (sigaction (sig, &act, &oact) != 0) + return SIG_ERR; + return oact.sa_handler; +} +# endif +#endif + +static void +initialize_global_hash_tables (void) +{ + init_hash_global_variable_set (); + strcache_init (); + init_hash_files (); + hash_init_directories (); + hash_init_function_table (); +} + +/* This character map locate stop chars when parsing GNU makefiles. + Each element is true if we should stop parsing on that character. */ + +static void +initialize_stopchar_map () +{ + int i; + + stopchar_map[(int)'\0'] = MAP_NUL; + stopchar_map[(int)'#'] = MAP_COMMENT; + stopchar_map[(int)';'] = MAP_SEMI; + stopchar_map[(int)'='] = MAP_EQUALS; + stopchar_map[(int)':'] = MAP_COLON; + stopchar_map[(int)'%'] = MAP_PERCENT; + stopchar_map[(int)'|'] = MAP_PIPE; + stopchar_map[(int)'.'] = MAP_DOT | MAP_USERFUNC; + stopchar_map[(int)','] = MAP_COMMA; + stopchar_map[(int)'$'] = MAP_VARIABLE; + + stopchar_map[(int)'-'] = MAP_USERFUNC; + stopchar_map[(int)'_'] = MAP_USERFUNC; + + stopchar_map[(int)'/'] = MAP_DIRSEP; +#if defined(VMS) + stopchar_map[(int)']'] = MAP_DIRSEP; +#elif defined(HAVE_DOS_PATHS) + stopchar_map[(int)'\\'] = MAP_DIRSEP; +#endif + + for (i = 1; i <= UCHAR_MAX; ++i) + { + if (isblank(i)) + stopchar_map[i] = MAP_BLANK; + if (isspace(i)) + stopchar_map[i] |= MAP_SPACE; + 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) +{ + 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); +} + +#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__ */ + +#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 dep *read_files; + PATH_VAR (current_directory); + unsigned int restarts = 0; + unsigned int syncing = 0; +#ifdef WINDOWS32 + const char *unix_path = NULL; + const char *windows32_path = NULL; + + SetUnhandledExceptionFilter (handle_runtime_exceptions); + + /* start off assuming we have no shell */ + unixy_shell = 0; + no_default_sh_exe = 1; +#endif + + output_init (&make_sync); + + initialize_stopchar_map(); + +#ifdef SET_STACK_SIZE + /* Get rid of any avoidable limit on stack size. */ + { + struct rlimit rlim; + + /* Set the stack limit huge so that alloca does not fail. */ + if (getrlimit (RLIMIT_STACK, &rlim) == 0 + && rlim.rlim_cur > 0 && rlim.rlim_cur < rlim.rlim_max) + { + stack_limit = rlim; + rlim.rlim_cur = rlim.rlim_max; + setrlimit (RLIMIT_STACK, &rlim); + } + else + stack_limit.rlim_cur = 0; + } +#endif + + /* Needed for OS/2 */ + initialize_main (&argc, &argv); + +#ifdef MAKE_MAINTAINER_MODE + /* In maintainer mode we always enable verification. */ + verify_flag = 1; +#endif + +#if defined (__MSDOS__) && !defined (_POSIX_SOURCE) + /* Request the most powerful version of 'system', to + make up for the dumb default shell. */ + __system_flags = (__system_redirect + | __system_use_shell + | __system_allow_multiple_cmds + | __system_allow_long_cmds + | __system_handle_null_commands + | __system_emulate_chdir); + +#endif + + /* Set up gettext/internationalization support. */ + setlocale (LC_ALL, ""); + /* The cast to void shuts up compiler warnings on systems that + disable NLS. */ + (void)bindtextdomain (PACKAGE, LOCALEDIR); + (void)textdomain (PACKAGE); + +#ifdef POSIX + sigemptyset (&fatal_signal_set); +#define ADD_SIG(sig) sigaddset (&fatal_signal_set, sig) +#else +#ifdef HAVE_SIGSETMASK + fatal_signal_mask = 0; +#define ADD_SIG(sig) fatal_signal_mask |= sigmask (sig) +#else +#define ADD_SIG(sig) (void)sig +#endif +#endif + +#define FATAL_SIG(sig) \ + if (bsd_signal (sig, fatal_error_signal) == SIG_IGN) \ + bsd_signal (sig, SIG_IGN); \ + else \ + ADD_SIG (sig); + +#ifdef SIGHUP + FATAL_SIG (SIGHUP); +#endif +#ifdef SIGQUIT + FATAL_SIG (SIGQUIT); +#endif + FATAL_SIG (SIGINT); + FATAL_SIG (SIGTERM); + +#ifdef __MSDOS__ + /* Windows 9X delivers FP exceptions in child programs to their + parent! We don't want Make to die when a child divides by zero, + so we work around that lossage by catching SIGFPE. */ + FATAL_SIG (SIGFPE); +#endif + +#ifdef SIGDANGER + FATAL_SIG (SIGDANGER); +#endif +#ifdef SIGXCPU + FATAL_SIG (SIGXCPU); +#endif +#ifdef SIGXFSZ + FATAL_SIG (SIGXFSZ); +#endif + +#undef FATAL_SIG + + /* Do not ignore the child-death signal. This must be done before + any children could possibly be created; otherwise, the wait + functions won't work on systems with the SVR4 ECHILD brain + damage, if our invoker is ignoring this signal. */ + +#ifdef HAVE_WAIT_NOHANG +# if defined SIGCHLD + (void) bsd_signal (SIGCHLD, SIG_DFL); +# endif +# if defined SIGCLD && SIGCLD != SIGCHLD + (void) bsd_signal (SIGCLD, SIG_DFL); +# endif +#endif + + output_init (NULL); + + /* Figure out where this program lives. */ + + if (argv[0] == 0) + argv[0] = (char *)""; + if (argv[0][0] == '\0') + program = "make"; + else + { + program = strrchr (argv[0], '/'); +#if defined(__MSDOS__) || defined(__EMX__) + if (program == 0) + program = strrchr (argv[0], '\\'); + else + { + /* Some weird environments might pass us argv[0] with + both kinds of slashes; we must find the rightmost. */ + char *p = strrchr (argv[0], '\\'); + if (p && p > program) + program = p; + } + if (program == 0 && argv[0][1] == ':') + program = argv[0] + 1; +#endif +#ifdef WINDOWS32 + if (program == 0) + { + /* Extract program from full path */ + program = strrchr (argv[0], '\\'); + if (program) + { + int argv0_len = strlen (program); + if (argv0_len > 4 && streq (&program[argv0_len - 4], ".exe")) + /* Remove .exe extension */ + program[argv0_len - 4] = '\0'; + } + } +#endif + if (program == 0) +#ifdef VMS + program = vms_progname(argv[0]); +#else + program = argv[0]; +#endif + else + ++program; + } + + /* 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); + + /* Set up .FEATURES + Use a separate variable because define_variable_cname() is a macro and + some compilers (MSVC) don't like conditionals in macros. */ + { + const char *features = "target-specific order-only second-expansion" + " else-if shortest-stem undefine oneshell" +#ifndef NO_ARCHIVES + " archives" +#endif +#ifdef MAKE_JOBSERVER + " jobserver" +#endif +#ifndef NO_OUTPUT_SYNC + " output-sync" +#endif +#ifdef MAKE_SYMLINKS + " check-symlink" +#endif +#ifdef HAVE_GUILE + " guile" +#endif +#ifdef MAKE_LOAD + " load" +#endif + ; + + define_variable_cname (".FEATURES", features, o_default, 0); + } + + /* Configure GNU Guile support */ + guile_gmake_setup (NILF); + + /* Read in variables from the environment. It is important that this be + done before $(MAKE) is figured out so its definitions will not be + from the environment. */ + +#ifndef _AMIGA + { + unsigned int i; + + for (i = 0; envp[i] != 0; ++i) + { + struct variable *v; + const char *ep = envp[i]; + /* By default, export all variables culled from the environment. */ + enum variable_export export = v_export; + unsigned int len; + + while (! STOP_SET (*ep, MAP_EQUALS)) + ++ep; + + /* If there's no equals sign it's a malformed environment. Ignore. */ + if (*ep == '\0') + continue; + +#ifdef WINDOWS32 + if (!unix_path && strneq (envp[i], "PATH=", 5)) + unix_path = ep+1; + else if (!strnicmp (envp[i], "Path=", 5)) + { + if (!windows32_path) + windows32_path = ep+1; + /* PATH gets defined after the loop exits. */ + continue; + } +#endif + + /* Length of the variable name, and skip the '='. */ + len = ep++ - envp[i]; + + /* If this is MAKE_RESTARTS, check to see if the "already printed + the enter statement" flag is set. */ + if (len == 13 && strneq (envp[i], "MAKE_RESTARTS", 13)) + { + if (*ep == '-') + { + OUTPUT_TRACED (); + ++ep; + } + restarts = (unsigned int) atoi (ep); + export = v_noexport; + } + + v = define_variable (envp[i], len, ep, o_env, 1); + + /* POSIX says the value of SHELL set in the makefile won't change the + value of SHELL given to subprocesses. */ + if (streq (v->name, "SHELL")) + { +#ifndef __MSDOS__ + export = v_noexport; +#endif + shell_var.name = xstrdup ("SHELL"); + shell_var.length = 5; + shell_var.value = xstrdup (ep); + } + + v->export = export; + } + } +#ifdef WINDOWS32 + /* If we didn't find a correctly spelled PATH we define PATH as + * either the first misspelled value or an empty string + */ + if (!unix_path) + define_variable_cname ("PATH", windows32_path ? windows32_path : "", + o_env, 1)->export = v_export; +#endif +#else /* For Amiga, read the ENV: device, ignoring all dirs */ + { + BPTR env, file, old; + char buffer[1024]; + int len; + __aligned struct FileInfoBlock fib; + + env = Lock ("ENV:", ACCESS_READ); + if (env) + { + old = CurrentDir (DupLock (env)); + Examine (env, &fib); + + while (ExNext (env, &fib)) + { + if (fib.fib_DirEntryType < 0) /* File */ + { + /* Define an empty variable. It will be filled in + variable_lookup(). Makes startup quite a bit faster. */ + define_variable (fib.fib_FileName, + strlen (fib.fib_FileName), + "", o_env, 1)->export = v_export; + } + } + UnLock (env); + UnLock (CurrentDir (old)); + } + } +#endif + + /* Decode the switches. */ + decode_env_switches (STRING_SIZE_TUPLE ("GNUMAKEFLAGS")); + + /* Clear GNUMAKEFLAGS to avoid duplication. */ + define_variable_cname ("GNUMAKEFLAGS", "", o_env, 0); + + decode_env_switches (STRING_SIZE_TUPLE ("MAKEFLAGS")); + + /* 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); + +#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 + + decode_switches (argc, (const char **)argv, 0); + + /* 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"))) + define_variable_cname ("MAKE_TERMOUT", TTYNAME (fileno (stdout)), + o_default, 0)->export = v_export; + + if (isatty (fileno (stderr))) + if (! lookup_variable (STRING_SIZE_TUPLE ("MAKE_TERMERR"))) + define_variable_cname ("MAKE_TERMERR", TTYNAME (fileno (stderr)), + o_default, 0)->export = v_export; +#endif + + /* Reset in case the switches changed our minds. */ + syncing = (output_sync == OUTPUT_SYNC_LINE + || output_sync == OUTPUT_SYNC_TARGET); + + if (make_sync.syncout && ! syncing) + output_close (&make_sync); + + make_sync.syncout = syncing; + OUTPUT_SET (&make_sync); + + /* Figure out the level of recursion. */ + { + struct variable *v = lookup_variable (STRING_SIZE_TUPLE (MAKELEVEL_NAME)); + if (v && v->value[0] != '\0' && v->value[0] != '-') + makelevel = (unsigned int) atoi (v->value); + else + makelevel = 0; + } + +#ifdef WINDOWS32 + if (suspend_flag) + { + fprintf (stderr, "%s (pid = %ld)\n", argv[0], GetCurrentProcessId ()); + fprintf (stderr, _("%s is suspending for 30 seconds..."), argv[0]); + Sleep (30 * 1000); + fprintf (stderr, _("done sleep(30). Continuing.\n")); + } +#endif + + /* Set always_make_flag if -B was given and we've not restarted already. */ + always_make_flag = always_make_set && (restarts == 0); + + /* Print version information, and exit. */ + if (print_version_flag) + { + print_version (); + die (MAKE_SUCCESS); + } + + if (ISDB (DB_BASIC)) + print_version (); + +#ifndef VMS + /* Set the "MAKE_COMMAND" variable to the name we were invoked with. + (If it is a relative pathname with a slash, prepend our directory name + so the result will run the same program regardless of the current dir. + If it is a name with no slash, we can only hope that PATH did not + find it in the current directory.) */ +#ifdef WINDOWS32 + /* + * Convert from backslashes to forward slashes for + * programs like sh which don't like them. Shouldn't + * matter if the path is one way or the other for + * CreateProcess(). + */ + if (strpbrk (argv[0], "/:\\") || strstr (argv[0], "..") + || strneq (argv[0], "//", 2)) + argv[0] = xstrdup (w32ify (argv[0], 1)); +#else /* WINDOWS32 */ +#if defined (__MSDOS__) || defined (__EMX__) + if (strchr (argv[0], '\\')) + { + char *p; + + argv[0] = xstrdup (argv[0]); + for (p = argv[0]; *p; p++) + if (*p == '\\') + *p = '/'; + } + /* If argv[0] is not in absolute form, prepend the current + directory. This can happen when Make is invoked by another DJGPP + program that uses a non-absolute name. */ + if (current_directory[0] != '\0' + && argv[0] != 0 + && (argv[0][0] != '/' && (argv[0][0] == '\0' || argv[0][1] != ':')) +# ifdef __EMX__ + /* do not prepend cwd if argv[0] contains no '/', e.g. "make" */ + && (strchr (argv[0], '/') != 0 || strchr (argv[0], '\\') != 0) +# endif + ) + argv[0] = xstrdup (concat (3, current_directory, "/", argv[0])); +#else /* !__MSDOS__ */ + if (current_directory[0] != '\0' + && argv[0] != 0 && argv[0][0] != '/' && strchr (argv[0], '/') != 0 +#ifdef HAVE_DOS_PATHS + && (argv[0][0] != '\\' && (!argv[0][0] || argv[0][1] != ':')) + && strchr (argv[0], '\\') != 0 +#endif + ) + argv[0] = xstrdup (concat (3, current_directory, "/", argv[0])); +#endif /* !__MSDOS__ */ +#endif /* WINDOWS32 */ +#endif + + /* We may move, but until we do, here we are. */ + starting_directory = current_directory; + +#ifdef MAKE_JOBSERVER + /* If the jobserver-fds option is seen, make sure that -j is reasonable. + This can't be usefully set in the makefile, and we want to verify the + FDs are valid before any other aspect of make has a chance to start + using them for something else. */ + + if (jobserver_fds) + { + /* Make sure the jobserver option has the proper format. */ + const char *cp = jobserver_fds; + +#ifdef WINDOWS32 + if (! open_jobserver_semaphore (cp)) + { + DWORD err = GetLastError (); + const char *estr = map_windows32_error_to_string (err); + fatal (NILF, strlen (cp) + INTSTR_LENGTH + strlen (estr), + _("internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"), + cp, err, estr); + } + DB (DB_JOBS, (_("Jobserver client (semaphore %s)\n"), cp)); +#else + if (sscanf (cp, "%d,%d", &job_fds[0], &job_fds[1]) != 2) + OS (fatal, NILF, + _("internal error: invalid --jobserver-fds string '%s'"), cp); + + DB (DB_JOBS, + (_("Jobserver client (fds %d,%d)\n"), job_fds[0], job_fds[1])); +#endif + + /* The combination of a pipe + !job_slots means we're using the + jobserver. If !job_slots and we don't have a pipe, we can start + infinite jobs. If we see both a pipe and job_slots >0 that means the + user set -j explicitly. This is broken; in this case obey the user + (ignore the jobserver pipe for this make) but print a message. + If we've restarted, we already printed this the first time. */ + + if (job_slots > 0) + { + if (! restarts) + O (error, NILF, + _("warning: -jN forced in submake: disabling jobserver mode.")); + } +#ifndef WINDOWS32 +#ifdef HAVE_FCNTL +# define FD_OK(_f) ((fcntl ((_f), F_GETFD) != -1) || (errno != EBADF)) +#else +# define FD_OK(_f) 1 +#endif + /* 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, print a + warning then default to -j1. */ + else if (!FD_OK (job_fds[0]) || !FD_OK (job_fds[1]) + || (job_rfd = dup (job_fds[0])) < 0) + { + if (errno != EBADF) + pfatal_with_name (_("dup jobserver")); + + O (error, NILF, + _("warning: jobserver unavailable: using -j1. Add '+' to parent make rule.")); + job_slots = 1; + job_fds[0] = job_fds[1] = -1; + } +#endif + + if (job_slots > 0) + { +#ifdef WINDOWS32 + free_jobserver_semaphore (); +#else + if (job_fds[0] >= 0) + close (job_fds[0]); + if (job_fds[1] >= 0) + close (job_fds[1]); +#endif + job_fds[0] = job_fds[1] = -1; + + free (jobserver_fds); + jobserver_fds = 0; + } + } +#endif + + /* The extra indirection through $(MAKE_COMMAND) is done + for hysterical raisins. */ +#ifdef VMS + define_variable_cname("MAKE_COMMAND", vms_command(argv[0]), o_default, 0); +#else + define_variable_cname ("MAKE_COMMAND", argv[0], o_default, 0); +#endif + define_variable_cname ("MAKE", "$(MAKE_COMMAND)", o_default, 1); + + if (command_variables != 0) + { + struct command_variable *cv; + struct variable *v; + unsigned int len = 0; + char *value, *p; + + /* Figure out how much space will be taken up by the command-line + variable definitions. */ + for (cv = command_variables; cv != 0; cv = cv->next) + { + v = cv->variable; + len += 2 * strlen (v->name); + if (! v->recursive) + ++len; + ++len; + len += 2 * strlen (v->value); + ++len; + } + + /* Now allocate a buffer big enough and fill it. */ + p = value = alloca (len); + for (cv = command_variables; cv != 0; cv = cv->next) + { + v = cv->variable; + p = quote_for_env (p, v->name); + if (! v->recursive) + *p++ = ':'; + *p++ = '='; + p = quote_for_env (p, v->value); + *p++ = ' '; + } + p[-1] = '\0'; /* Kill the final space and terminate. */ + + /* Define an unchangeable variable with a name that no POSIX.2 + makefile could validly use for its own variable. */ + define_variable_cname ("-*-command-variables-*-", value, o_automatic, 0); + + /* Define the variable; this will not override any user definition. + Normally a reference to this variable is written into the value of + MAKEFLAGS, allowing the user to override this value to affect the + exported value of MAKEFLAGS. In POSIX-pedantic mode, we cannot + allow the user's setting of MAKEOVERRIDES to affect MAKEFLAGS, so + a reference to this hidden variable is written instead. */ + define_variable_cname ("MAKEOVERRIDES", "${-*-command-variables-*-}", + o_env, 1); + } + + /* If there were -C flags, move ourselves about. */ + if (directories != 0) + { + unsigned int i; + for (i = 0; directories->list[i] != 0; ++i) + { + const char *dir = directories->list[i]; +#ifdef WINDOWS32 + /* WINDOWS32 chdir() doesn't work if the directory has a trailing '/' + But allow -C/ just in case someone wants that. */ + { + char *p = (char *)dir + strlen (dir) - 1; + while (p > dir && (p[0] == '/' || p[0] == '\\')) + --p; + p[1] = '\0'; + } +#endif + if (chdir (dir) < 0) + pfatal_with_name (dir); + } + } + +#ifdef WINDOWS32 + /* + * THIS BLOCK OF CODE MUST COME AFTER chdir() CALL ABOVE IN ORDER + * TO NOT CONFUSE THE DEPENDENCY CHECKING CODE IN implicit.c. + * + * The functions in dir.c can incorrectly cache information for "." + * before we have changed directory and this can cause file + * lookups to fail because the current directory (.) was pointing + * at the wrong place when it was first evaluated. + */ + no_default_sh_exe = !find_and_set_default_shell (NULL); +#endif /* WINDOWS32 */ + + /* Except under -s, always do -w in sub-makes and under -C. */ + if (!silent_flag && (directories != 0 || makelevel > 0)) + print_directory_flag = 1; + + /* Let the user disable that with --no-print-directory. */ + if (inhibit_print_directory_flag) + print_directory_flag = 0; + + /* If -R was given, set -r too (doesn't make sense otherwise!) */ + if (no_builtin_variables_flag) + no_builtin_rules_flag = 1; + + /* Construct the list of include directories to search. */ + + construct_include_path (include_directories == 0 + ? 0 : include_directories->list); + + /* If we chdir'ed, figure out where we are now. */ + if (directories) + { +#ifdef WINDOWS32 + if (getcwd_fs (current_directory, GET_PATH_MAX) == 0) +#else + if (getcwd (current_directory, GET_PATH_MAX) == 0) +#endif + { +#ifdef HAVE_GETCWD + perror_with_name ("getcwd", ""); +#else + OS (error, NILF, "getwd: %s", current_directory); +#endif + starting_directory = 0; + } + else + starting_directory = current_directory; + } + + define_variable_cname ("CURDIR", current_directory, o_file, 0); + + /* Read any stdin makefiles into temporary files. */ + + if (makefiles != 0) + { + unsigned int i; + for (i = 0; i < makefiles->idx; ++i) + if (makefiles->list[i][0] == '-' && makefiles->list[i][1] == '\0') + { + /* This makefile is standard input. Since we may re-exec + and thus re-read the makefiles, we read standard input + into a temporary file and read from that. */ + FILE *outfile; + char *template; + const char *tmpdir; + + if (stdin_nm) + O (fatal, NILF, + _("Makefile from standard input specified twice.")); + +#ifdef VMS +# define DEFAULT_TMPDIR "sys$scratch:" +#else +# ifdef P_tmpdir +# define DEFAULT_TMPDIR P_tmpdir +# else +# define DEFAULT_TMPDIR "/tmp" +# endif +#endif +#define DEFAULT_TMPFILE "GmXXXXXX" + + if (((tmpdir = getenv ("TMPDIR")) == NULL || *tmpdir == '\0') +#if defined (__MSDOS__) || defined (WINDOWS32) || defined (__EMX__) + /* These are also used commonly on these platforms. */ + && ((tmpdir = getenv ("TEMP")) == NULL || *tmpdir == '\0') + && ((tmpdir = getenv ("TMP")) == NULL || *tmpdir == '\0') +#endif + ) + tmpdir = DEFAULT_TMPDIR; + + template = alloca (strlen (tmpdir) + CSTRLEN (DEFAULT_TMPFILE) + 2); + strcpy (template, tmpdir); + +#ifdef HAVE_DOS_PATHS + if (strchr ("/\\", template[strlen (template) - 1]) == NULL) + strcat (template, "/"); +#else +# ifndef VMS + if (template[strlen (template) - 1] != '/') + strcat (template, "/"); +# endif /* !VMS */ +#endif /* !HAVE_DOS_PATHS */ + + strcat (template, DEFAULT_TMPFILE); + outfile = output_tmpfile (&stdin_nm, template); + if (outfile == 0) + pfatal_with_name (_("fopen (temporary file)")); + while (!feof (stdin) && ! ferror (stdin)) + { + char buf[2048]; + unsigned int n = fread (buf, 1, sizeof (buf), stdin); + if (n > 0 && fwrite (buf, 1, n, outfile) != n) + pfatal_with_name (_("fwrite (temporary file)")); + } + fclose (outfile); + + /* Replace the name that read_all_makefiles will + see with the name of the temporary file. */ + makefiles->list[i] = strcache_add (stdin_nm); + + /* Make sure the temporary file will not be remade. */ + { + struct file *f = enter_file (strcache_add (stdin_nm)); + f->updated = 1; + f->update_status = us_success; + f->command_state = cs_finished; + /* Can't be intermediate, or it'll be removed too early for + make re-exec. */ + f->intermediate = 0; + f->dontcare = 0; + } + } + } + +#ifndef __EMX__ /* Don't use a SIGCHLD handler for OS/2 */ +#if defined(MAKE_JOBSERVER) || !defined(HAVE_WAIT_NOHANG) + /* 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 in job.c if we're waiting for a token. + + If none of these are true, we don't need a signal handler at all. */ + { + RETSIGTYPE child_handler (int sig); +# if defined SIGCHLD + bsd_signal (SIGCHLD, child_handler); +# endif +# if defined SIGCLD && SIGCLD != SIGCHLD + bsd_signal (SIGCLD, child_handler); +# endif + } +#endif +#endif + + /* Let the user send us SIGUSR1 to toggle the -d flag during the run. */ +#ifdef SIGUSR1 + bsd_signal (SIGUSR1, debug_signal_handler); +#endif + + /* Define the initial list of suffixes for old-style rules. */ + set_default_suffixes (); + + /* Define the file rules for the built-in suffix rules. These will later + be converted into pattern rules. We used to do this in + install_default_implicit_rules, but since that happens after reading + makefiles, it results in the built-in pattern rules taking precedence + over makefile-specified suffix rules, which is wrong. */ + install_default_suffix_rules (); + + /* Define some internal and special variables. */ + define_automatic_variables (); + + /* Set up the MAKEFLAGS and MFLAGS variables for makefiles to see. + Initialize it to be exported but allow the makefile to reset it. */ + define_makeflags (0, 0)->export = v_export; + + /* Define the default variables. */ + define_default_variables (); + + default_file = enter_file (strcache_add (".DEFAULT")); + + default_goal_var = define_variable_cname (".DEFAULT_GOAL", "", o_file, 0); + + /* Evaluate all strings provided with --eval. + Also set up the $(-*-eval-flags-*-) variable. */ + + if (eval_strings) + { + char *p, *value; + unsigned int i; + unsigned int len = (CSTRLEN ("--eval=") + 1) * eval_strings->idx; + + for (i = 0; i < eval_strings->idx; ++i) + { + p = xstrdup (eval_strings->list[i]); + len += 2 * strlen (p); + eval_buffer (p, NULL); + free (p); + } + + p = value = alloca (len); + for (i = 0; i < eval_strings->idx; ++i) + { + strcpy (p, "--eval="); + p += CSTRLEN ("--eval="); + p = quote_for_env (p, eval_strings->list[i]); + *(p++) = ' '; + } + p[-1] = '\0'; + + define_variable_cname ("-*-eval-flags-*-", value, o_automatic, 0); + } + + /* Read all the makefiles. */ + + read_files = read_all_makefiles (makefiles == 0 ? 0 : makefiles->list); + +#ifdef WINDOWS32 + /* look one last time after reading all Makefiles */ + if (no_default_sh_exe) + no_default_sh_exe = !find_and_set_default_shell (NULL); +#endif /* WINDOWS32 */ + +#if defined (__MSDOS__) || defined (__EMX__) + /* We need to know what kind of shell we will be using. */ + { + extern int _is_unixy_shell (const char *_path); + struct variable *shv = lookup_variable (STRING_SIZE_TUPLE ("SHELL")); + extern int unixy_shell; + extern const char *default_shell; + + if (shv && *shv->value) + { + char *shell_path = recursively_expand (shv); + + if (shell_path && _is_unixy_shell (shell_path)) + unixy_shell = 1; + else + unixy_shell = 0; + if (shell_path) + default_shell = shell_path; + } + } +#endif /* __MSDOS__ || __EMX__ */ + + { + int old_builtin_rules_flag = no_builtin_rules_flag; + int old_builtin_variables_flag = no_builtin_variables_flag; + + /* Decode switches again, for variables set by the makefile. */ + decode_env_switches (STRING_SIZE_TUPLE ("GNUMAKEFLAGS")); + + /* Clear GNUMAKEFLAGS to avoid duplication. */ + define_variable_cname ("GNUMAKEFLAGS", "", o_override, 0); + + decode_env_switches (STRING_SIZE_TUPLE ("MAKEFLAGS")); +#if 0 + decode_env_switches (STRING_SIZE_TUPLE ("MFLAGS")); +#endif + + /* Reset in case the switches changed our mind. */ + syncing = (output_sync == OUTPUT_SYNC_LINE + || output_sync == OUTPUT_SYNC_TARGET); + + if (make_sync.syncout && ! syncing) + output_close (&make_sync); + + make_sync.syncout = syncing; + OUTPUT_SET (&make_sync); + + /* If we've disabled builtin rules, get rid of them. */ + if (no_builtin_rules_flag && ! old_builtin_rules_flag) + { + if (suffix_file->builtin) + { + free_dep_chain (suffix_file->deps); + suffix_file->deps = 0; + } + define_variable_cname ("SUFFIXES", "", o_default, 0); + } + + /* If we've disabled builtin variables, get rid of them. */ + if (no_builtin_variables_flag && ! old_builtin_variables_flag) + undefine_default_variables (); + } + +#if defined (__MSDOS__) || defined (__EMX__) || defined (VMS) + if (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.")); + job_slots = 1; + } +#endif + +#ifdef MAKE_JOBSERVER + /* If we have >1 slot but no jobserver-fds, then we're a top-level make. + Set up the pipe and install the fds option for our children. */ + + if (job_slots > 1) + { +#ifdef WINDOWS32 + /* sub_proc.c cannot wait for more than MAXIMUM_WAIT_OBJECTS objects + * and one of them is the job-server semaphore object. Limit the + * number of available job slots to (MAXIMUM_WAIT_OBJECTS - 1). */ + + if (job_slots >= MAXIMUM_WAIT_OBJECTS) + { + job_slots = MAXIMUM_WAIT_OBJECTS - 1; + DB (DB_JOBS, (_("Jobserver slots limited to %d\n"), job_slots)); + } + + if (! create_jobserver_semaphore (job_slots - 1)) + { + DWORD err = GetLastError (); + const char *estr = map_windows32_error_to_string (err); + ONS (fatal, NILF, + _("creating jobserver semaphore: (Error %ld: %s)"), err, estr); + } +#else + char c = '+'; + + if (pipe (job_fds) < 0 || (job_rfd = dup (job_fds[0])) < 0) + pfatal_with_name (_("creating jobs pipe")); +#endif + + /* 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. We + want job_slots to be 0 to indicate we're using the jobserver. */ + + master_job_slots = job_slots; + +#ifdef WINDOWS32 + /* We're using the jobserver so set job_slots to 0. */ + job_slots = 0; +#else + while (--job_slots) + { + int r; + + EINTRLOOP (r, write (job_fds[1], &c, 1)); + if (r != 1) + pfatal_with_name (_("init jobserver pipe")); + } +#endif + + /* Fill in the jobserver_fds for our children. */ + +#ifdef WINDOWS32 + jobserver_fds = xmalloc (MAX_PATH + 1); + strcpy (jobserver_fds, get_jobserver_semaphore_name ()); +#else + jobserver_fds = xmalloc ((INTSTR_LENGTH * 2) + 2); + sprintf (jobserver_fds, "%d,%d", job_fds[0], job_fds[1]); +#endif + } +#endif + +#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 dep' point at the 'struct file' for the file + depended on. Also do magic for special targets. */ + + snap_deps (); + + /* Convert old-style suffix rules to pattern rules. It is important to + do this before installing the built-in pattern rules below, so that + makefile-specified suffix rules take precedence over built-in pattern + rules. */ + + convert_to_pattern (); + + /* Install the default implicit pattern rules. + This used to be done before reading the makefiles. + But in that case, built-in pattern rules were in the chain + before user-defined ones, so they matched first. */ + + install_default_implicit_rules (); + + /* Compute implicit rule limits. */ + + count_implicit_rule_limits (); + + /* Construct the listings of directories in VPATH lists. */ + + build_vpath_lists (); + + /* Mark files given with -o flags as very old and as having been updated + already, and files given with -W flags as brand new (time-stamp as far + as possible into the future). If restarts is set we'll do -W later. */ + + if (old_files != 0) + { + const char **p; + for (p = old_files->list; *p != 0; ++p) + { + struct file *f = enter_file (*p); + f->last_mtime = f->mtime_before_update = OLD_MTIME; + f->updated = 1; + f->update_status = us_success; + f->command_state = cs_finished; + } + } + + if (!restarts && new_files != 0) + { + const char **p; + for (p = new_files->list; *p != 0; ++p) + { + struct file *f = enter_file (*p); + f->last_mtime = f->mtime_before_update = NEW_MTIME; + } + } + + /* Initialize the remote job module. */ + remote_setup (); + + /* Dump any output we've collected. */ + + OUTPUT_UNSET (); + output_close (&make_sync); + + if (read_files != 0) + { + /* Update any makefiles if necessary. */ + + FILE_TIMESTAMP *makefile_mtimes = 0; + unsigned int mm_idx = 0; + char **aargv = NULL; + const char **nargv; + int nargc; + int orig_db_level = db_level; + enum update_status status; + + if (! ISDB (DB_MAKEFILES)) + db_level = DB_NONE; + + DB (DB_BASIC, (_("Updating makefiles....\n"))); + + /* Remove any makefiles we don't want to try to update. + Also record the current modtimes so we can compare them later. */ + { + register struct dep *d, *last; + last = 0; + d = read_files; + while (d != 0) + { + struct file *f = d->file; + if (f->double_colon) + for (f = f->double_colon; f != NULL; f = f->prev) + { + if (f->deps == 0 && f->cmds != 0) + { + /* This makefile is a :: target with commands, but + no dependencies. So, it will always be remade. + This might well cause an infinite loop, so don't + try to remake it. (This will only happen if + your makefiles are written exceptionally + stupidly; but if you work for Athena, that's how + you write your makefiles.) */ + + DB (DB_VERBOSE, + (_("Makefile '%s' might loop; not remaking it.\n"), + f->name)); + + if (last == 0) + read_files = d->next; + else + last->next = d->next; + + /* Free the storage. */ + free_dep (d); + + d = last == 0 ? read_files : last->next; + + break; + } + } + if (f == NULL || !f->double_colon) + { + makefile_mtimes = xrealloc (makefile_mtimes, + (mm_idx+1) + * sizeof (FILE_TIMESTAMP)); + makefile_mtimes[mm_idx++] = file_mtime_no_search (d->file); + last = d; + d = d->next; + } + } + } + + /* Set up 'MAKEFLAGS' specially while remaking makefiles. */ + define_makeflags (1, 1); + + rebuilding_makefiles = 1; + status = update_goal_chain (read_files); + rebuilding_makefiles = 0; + + 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 dep *d; + + for (i = 0, d = read_files; d != 0; ++i, d = d->next) + { + /* Reset the considered flag; we may need to look at the file + again to print an error. */ + d->file->considered = 0; + + 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->changed & 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->changed & 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->changed & RM_INCLUDED) + /* An included makefile. We don't need to die, but we + do want to complain. */ + error (NILF, l, + _("Included makefile '%s' was not found."), dnm); + else + { + /* A normal makefile. We must die later. */ + error (NILF, l, + _("Makefile '%s' was not found"), dnm); + any_failed = 1; + } + } + } + /* Reset this to empty so we get the right error message below. */ + read_files = 0; + + if (any_remade) + goto re_exec; + if (any_failed) + die (MAKE_FAILURE); + break; + } + + case us_success: + re_exec: + /* Updated successfully. Re-exec ourselves. */ + + remove_intermediates (0); + + if (print_data_base_flag) + print_data_base (); + + clean_jobserver (0); + + if (makefiles != 0) + { + /* These names might have changed. */ + int i, j = 0; + for (i = 1; i < argc; ++i) + if (strneq (argv[i], "-f", 2)) /* XXX */ + { + if (argv[i][2] == '\0') + /* This cast is OK since we never modify argv. */ + argv[++i] = (char *) makefiles->list[j]; + else + argv[i] = xstrdup (concat (2, "-f", makefiles->list[j])); + ++j; + } + } + + /* Add -o option for the stdin temporary file, if necessary. */ + nargc = argc; + if (stdin_nm) + { + void *m = xmalloc ((nargc + 2) * sizeof (char *)); + aargv = m; + memcpy (aargv, argv, argc * sizeof (char *)); + aargv[nargc++] = xstrdup (concat (2, "-o", stdin_nm)); + aargv[nargc] = 0; + nargv = m; + } + else + nargv = (const char**)argv; + + if (directories != 0 && directories->idx > 0) + { + int bad = 1; + if (directory_before_chdir != 0) + { + if (chdir (directory_before_chdir) < 0) + perror_with_name ("chdir", ""); + else + bad = 0; + } + if (bad) + O (fatal, NILF, + _("Couldn't change back to original directory.")); + } + + ++restarts; + + /* If we're re-exec'ing the first make, put back the number of + job slots so define_makefiles() will get it right. */ + if (master_job_slots) + job_slots = master_job_slots; + + if (ISDB (DB_BASIC)) + { + const char **p; + printf (_("Re-executing[%u]:"), restarts); + for (p = nargv; *p != 0; ++p) + printf (" %s", *p); + putchar ('\n'); + } + +#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); + } + 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); + + /* Close the dup'd jobserver pipe if we opened one. */ + if (job_rfd >= 0) + close (job_rfd); + +#ifdef _AMIGA + exec_command (nargv); + exit (0); +#elif defined (__EMX__) + { + /* It is not possible to use execve() here because this + would cause the parent process to be terminated with + exit code 0 before the child process has been terminated. + Therefore it may be the best solution simply to spawn the + child process including all file handles and to wait for its + termination. */ + int pid; + int r; + pid = child_execute_job (FD_STDIN, FD_STDOUT, FD_STDERR, + nargv, environ); + + /* is this loop really necessary? */ + do { + pid = wait (&r); + } while (pid <= 0); + /* use the exit code of the child process */ + exit (WIFEXITED(r) ? WEXITSTATUS(r) : EXIT_FAILURE); + } +#else + exec_command ((char **)nargv, environ); +#endif + free (aargv); + break; + } + + db_level = orig_db_level; + + /* Free the makefile mtimes. */ + free (makefile_mtimes); + } + + /* Set up 'MAKEFLAGS' again for the normal targets. */ + define_makeflags (1, 0); + + /* Set always_make_flag if -B was given. */ + always_make_flag = always_make_set; + + /* If restarts is set we haven't set up -W files yet, so do that now. */ + if (restarts && new_files != 0) + { + const char **p; + for (p = new_files->list; *p != 0; ++p) + { + struct file *f = enter_file (*p); + f->last_mtime = f->mtime_before_update = NEW_MTIME; + } + } + + /* If there is a temp file from reading a makefile from stdin, get rid of + it now. */ + if (stdin_nm && unlink (stdin_nm) < 0 && errno != ENOENT) + perror_with_name (_("unlink (temporary file): "), stdin_nm); + + /* If there were no command-line goals, use the default. */ + if (goals == 0) + { + char *p; + + if (default_goal_var->recursive) + p = variable_expand (default_goal_var->value); + else + { + p = variable_buffer_output (variable_buffer, default_goal_var->value, + strlen (default_goal_var->value)); + *p = '\0'; + p = variable_buffer; + } + + if (*p != '\0') + { + struct file *f = lookup_file (p); + + /* If .DEFAULT_GOAL is a non-existent target, enter it into the + table and let the standard logic sort it out. */ + if (f == 0) + { + struct nameseq *ns; + + ns = PARSE_SIMPLE_SEQ (&p, struct nameseq); + if (ns) + { + /* .DEFAULT_GOAL should contain one target. */ + if (ns->next != 0) + O (fatal, NILF, + _(".DEFAULT_GOAL contains more than one target")); + + f = enter_file (strcache_add (ns->name)); + + ns->name = 0; /* It was reused by enter_file(). */ + free_ns_chain (ns); + } + } + + if (f) + { + goals = alloc_dep (); + goals->file = f; + } + } + } + else + lastgoal->next = 0; + + + if (!goals) + { + if (read_files == 0) + O (fatal, NILF, _("No targets specified and no makefile found")); + + O (fatal, NILF, _("No targets")); + } + + /* Update the goals. */ + + DB (DB_BASIC, (_("Updating goal targets....\n"))); + + { + switch (update_goal_chain (goals)) + { + case us_none: + /* Nothing happened. */ + /* FALLTHROUGH */ + case us_success: + /* Keep the previous result. */ + break; + case us_question: + /* We are under -q and would run some commands. */ + makefile_status = MAKE_TROUBLE; + break; + case us_failed: + /* Updating failed. POSIX.2 specifies exit status >1 for this; + but in VMS, there is only success and failure. */ + 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 = (switches[i].long_name == 0 ? "" : + switches[i].long_name); + long_options[i].flag = 0; + long_options[i].val = switches[i].c; + if (short_option (switches[i].c)) + *p++ = switches[i].c; + switch (switches[i].type) + { + case flag: + case flag_off: + case ignore: + long_options[i].has_arg = no_argument; + break; + + case string: + case strlist: + case filename: + case positive_int: + case floating: + if (short_option (switches[i].c)) + *p++ = ':'; + if (switches[i].noarg_value != 0) + { + if (short_option (switches[i].c)) + *p++ = ':'; + long_options[i].has_arg = optional_argument; + } + else + long_options[i].has_arg = required_argument; + break; + } + } + *p = '\0'; + for (c = 0; c < (sizeof (long_option_aliases) / + sizeof (long_option_aliases[0])); + ++c) + long_options[i++] = long_option_aliases[c]; + long_options[i].name = 0; +} + + +/* Non-option argument. It might be a variable definition. */ +static void +handle_non_switch_argument (const char *arg, int env) +{ + struct variable *v; + + if (arg[0] == '-' && arg[1] == '\0') + /* Ignore plain '-' for compatibility. */ + return; + + 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_dep (); + lastgoal = goals; + } + else + { + lastgoal->next = alloc_dep (); + lastgoal = lastgoal->next; + } + + lastgoal->file = f; + + { + /* Add this target name to the MAKECMDGOALS variable. */ + struct variable *gv; + const char *value; + + gv = lookup_variable (STRING_SIZE_TUPLE ("MAKECMDGOALS")); + if (gv == 0) + value = f->name; + else + { + /* Paste the old and new values together */ + unsigned int oldlen, newlen; + char *vp; + + oldlen = strlen (gv->value); + newlen = strlen (f->name); + vp = alloca (oldlen + 1 + newlen + 1); + memcpy (vp, gv->value, oldlen); + vp[oldlen] = ' '; + memcpy (&vp[oldlen + 1], f->name, newlen + 1); + value = vp; + } + define_variable_cname ("MAKECMDGOALS", value, o_default, 0); + } + } +} + +/* Print a nice usage method. */ + +static void +print_usage (int bad) +{ + const char *const *cpp; + FILE *usageto; + + if (print_version_flag) + print_version (); + + usageto = bad ? stderr : stdout; + + fprintf (usageto, _("Usage: %s [options] [target] ...\n"), program); + + for (cpp = usage; *cpp; ++cpp) + fputs (_(*cpp), usageto); + + if (!remote_description || *remote_description == '\0') + fprintf (usageto, _("\nThis program built for %s\n"), make_host); + else + fprintf (usageto, _("\nThis program built for %s (%s)\n"), + make_host, remote_description); + + fprintf (usageto, _("Report bugs to \n")); +} + +/* Decode switches from ARGC and ARGV. + They came from the environment if ENV is nonzero. */ + +static void +decode_switches (int argc, const char **argv, int env) +{ + int bad = 0; + register const struct command_switch *cs; + register struct stringlist *sl; + register int c; + + /* getopt does most of the parsing for us. + First, get its vectors set up. */ + + init_switches (); + + /* Let getopt produce error messages for the command line, + but not for options from the environment. */ + opterr = !env; + /* Reset getopt's state. */ + optind = 0; + + while (optind < argc) + { + const char *coptarg; + + /* Parse the next argument. */ + c = getopt_long (argc, (char*const*)argv, options, long_options, NULL); + coptarg = optarg; + if (c == EOF) + /* End of arguments, or "--" marker seen. */ + break; + else if (c == 1) + /* An argument not starting with a dash. */ + handle_non_switch_argument (coptarg, env); + else if (c == '?') + /* Bad option. We will print a usage message and die later. + But continue to parse the other options so the user can + see all he did wrong. */ + bad = 1; + else + for (cs = switches; cs->c != '\0'; ++cs) + if (cs->c == c) + { + /* Whether or not we will actually do anything with + this switch. We test this individually inside the + switch below rather than just once outside it, so that + options which are to be ignored still consume args. */ + int doit = !env || cs->env; + + switch (cs->type) + { + default: + abort (); + + case ignore: + break; + + case flag: + case flag_off: + if (doit) + *(int *) cs->value_ptr = cs->type == flag; + break; + + case string: + case strlist: + case filename: + if (!doit) + break; + + if (! coptarg) + coptarg = xstrdup (cs->noarg_value); + else if (*coptarg == '\0') + { + char opt[2] = "c"; + const char *op = opt; + + if (short_option (cs->c)) + opt[0] = cs->c; + else + op = cs->long_name; + + error (NILF, strlen (op), + _("the '%s%s' option requires a non-empty string argument"), + short_option (cs->c) ? "-" : "--", op); + bad = 1; + break; + } + + if (cs->type == string) + { + char **val = (char **)cs->value_ptr; + free (*val); + *val = xstrdup (coptarg); + break; + } + + sl = *(struct stringlist **) cs->value_ptr; + if (sl == 0) + { + sl = xmalloc (sizeof (struct stringlist)); + sl->max = 5; + sl->idx = 0; + sl->list = xmalloc (5 * sizeof (char *)); + *(struct stringlist **) cs->value_ptr = sl; + } + else if (sl->idx == sl->max - 1) + { + sl->max += 5; + /* MSVC erroneously warns without a cast here. */ + sl->list = xrealloc ((void *)sl->list, + sl->max * sizeof (char *)); + } + if (cs->type == filename) + sl->list[sl->idx++] = expand_command_line_file (coptarg); + else + sl->list[sl->idx++] = xstrdup (coptarg); + sl->list[sl->idx] = 0; + break; + + case positive_int: + /* See if we have an option argument; if we do require that + it's all digits, not something like "10foo". */ + if (coptarg == 0 && argc > optind) + { + const char *cp; + for (cp=argv[optind]; ISDIGIT (cp[0]); ++cp) + ; + if (cp[0] == '\0') + coptarg = argv[optind++]; + } + + if (!doit) + break; + + if (coptarg) + { + int i = atoi (coptarg); + const char *cp; + + /* Yes, I realize we're repeating this in some cases. */ + for (cp = coptarg; ISDIGIT (cp[0]); ++cp) + ; + + if (i < 1 || cp[0] != '\0') + { + error (NILF, 0, + _("the '-%c' option requires a positive integer argument"), + cs->c); + bad = 1; + } + else + *(unsigned int *) cs->value_ptr = i; + } + else + *(unsigned int *) cs->value_ptr + = *(unsigned int *) cs->noarg_value; + break; + +#ifndef NO_FLOAT + case floating: + if (coptarg == 0 && optind < argc + && (ISDIGIT (argv[optind][0]) || argv[optind][0] == '.')) + coptarg = argv[optind++]; + + if (doit) + *(double *) cs->value_ptr + = (coptarg != 0 ? atof (coptarg) + : *(double *) cs->noarg_value); + + break; +#endif + } + + /* We've found the switch. Stop looking. */ + break; + } + } + + /* There are no more options according to getting getopt, but there may + be some arguments left. Since we have asked for non-option arguments + to be returned in order, this only happens when there is a "--" + argument to prevent later arguments from being options. */ + while (optind < argc) + handle_non_switch_argument (argv[optind++], env); + + if (!env && (bad || print_usage_flag)) + { + print_usage (bad); + die (bad ? MAKE_FAILURE : MAKE_SUCCESS); + } + + /* If there are any options that need to be decoded do it now. */ + decode_debug_flags (); + decode_output_sync_flags (); +} + +/* Decode switches from environment variable ENVAR (which is LEN chars long). + We do this by chopping the value into a vector of words, prepending a + dash to the first word if it lacks one, and passing the vector to + decode_switches. */ + +static void +decode_env_switches (const char *envar, unsigned int len) +{ + char *varref = alloca (2 + len + 2); + char *value, *p, *buf; + int argc; + const char **argv; + + /* Get the variable's value. */ + varref[0] = '$'; + varref[1] = '('; + memcpy (&varref[2], envar, len); + varref[2 + len] = ')'; + varref[2 + len + 1] = '\0'; + value = variable_expand (varref); + + /* Skip whitespace, and check for an empty value. */ + 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 ((unsigned char)*value)) + { + /* End of the word. */ + *p++ = '\0'; + argv[++argc] = p; + do + ++value; + while (isblank ((unsigned char)*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 ((unsigned char)*in) || *in == '\\') + *out++ = '\\'; + *out++ = *in++; + } + + return out; +} + +/* Define the MAKEFLAGS and MFLAGS variables to reflect the settings of the + command switches. Include options with args if ALL is nonzero. + Don't include options with the 'no_makefile' flag set if MAKEFILE. */ + +static struct variable * +define_makeflags (int all, int makefile) +{ + const char ref[] = "$(MAKEOVERRIDES)"; + const char posixref[] = "$(-*-command-variables-*-)"; + const char evalref[] = "$(-*-eval-flags-*-)"; + const struct command_switch *cs; + char *flagstring; + char *p; + + /* We will construct a linked list of 'struct flag's describing + all the flags which need to go in MAKEFLAGS. Then, once we + know how many there are and their lengths, we can put them all + together in a string. */ + + struct flag + { + struct flag *next; + const struct command_switch *cs; + const char *arg; + }; + struct flag *flags = 0; + struct flag *last = 0; + unsigned int flagslen = 0; +#define ADD_FLAG(ARG, LEN) \ + do { \ + struct flag *new = alloca (sizeof (struct flag)); \ + new->cs = cs; \ + new->arg = (ARG); \ + new->next = 0; \ + if (! flags) \ + flags = new; \ + else \ + last->next = new; \ + last = new; \ + if (new->arg == 0) \ + /* Just a single flag letter: " -x" */ \ + flagslen += 3; \ + else \ + /* " -xfoo", plus space to escape "foo". */ \ + flagslen += 1 + 1 + 1 + (3 * (LEN)); \ + if (!short_option (cs->c)) \ + /* This switch has no single-letter version, so we use the long. */ \ + flagslen += 2 + strlen (cs->long_name); \ + } while (0) + + for (cs = switches; cs->c != '\0'; ++cs) + if (cs->toenv && (!makefile || !cs->no_makefile)) + switch (cs->type) + { + case ignore: + break; + + case flag: + case flag_off: + if (!*(int *) cs->value_ptr == (cs->type == flag_off) + && (cs->default_value == 0 + || *(int *) cs->value_ptr != *(int *) cs->default_value)) + ADD_FLAG (0, 0); + break; + + case positive_int: + if (all) + { + if ((cs->default_value != 0 + && (*(unsigned int *) cs->value_ptr + == *(unsigned int *) cs->default_value))) + break; + else if (cs->noarg_value != 0 + && (*(unsigned int *) cs->value_ptr == + *(unsigned int *) cs->noarg_value)) + ADD_FLAG ("", 0); /* Optional value omitted; see below. */ + else + { + char *buf = alloca (30); + sprintf (buf, "%u", *(unsigned int *) cs->value_ptr); + ADD_FLAG (buf, strlen (buf)); + } + } + break; + +#ifndef NO_FLOAT + case floating: + if (all) + { + if (cs->default_value != 0 + && (*(double *) cs->value_ptr + == *(double *) cs->default_value)) + break; + else if (cs->noarg_value != 0 + && (*(double *) cs->value_ptr + == *(double *) cs->noarg_value)) + ADD_FLAG ("", 0); /* Optional value omitted; see below. */ + else + { + char *buf = alloca (100); + sprintf (buf, "%g", *(double *) cs->value_ptr); + ADD_FLAG (buf, strlen (buf)); + } + } + break; +#endif + + case string: + if (all) + { + p = *((char **)cs->value_ptr); + if (p) + ADD_FLAG (p, strlen (p)); + } + break; + + case filename: + case strlist: + if (all) + { + struct stringlist *sl = *(struct stringlist **) cs->value_ptr; + if (sl != 0) + { + unsigned int i; + for (i = 0; i < sl->idx; ++i) + ADD_FLAG (sl->list[i], strlen (sl->list[i])); + } + } + break; + + default: + abort (); + } + +#undef ADD_FLAG + + /* Four more for the possible " -- ", plus variable references. */ + flagslen += 4 + CSTRLEN (posixref) + 1 + CSTRLEN (evalref) + 1; + + /* Construct the value in FLAGSTRING. + We allocate enough space for a preceding dash and trailing null. */ + flagstring = alloca (1 + flagslen + 1); + memset (flagstring, '\0', 1 + flagslen + 1); + p = flagstring; + + /* Start with a dash, for MFLAGS. */ + *p++ = '-'; + + /* Add simple options as a group. */ + while (flags != 0 && !flags->arg && short_option (flags->cs->c)) + { + *p++ = flags->cs->c; + flags = flags->next; + } + + /* Now add more complex flags: ones with options and/or long names. */ + while (flags) + { + *p++ = ' '; + *p++ = '-'; + + /* Add the flag letter or name to the string. */ + if (short_option (flags->cs->c)) + *p++ = flags->cs->c; + else + { + /* Long options require a double-dash. */ + *p++ = '-'; + strcpy (p, flags->cs->long_name); + p += strlen (p); + } + /* An omitted optional argument has an ARG of "". */ + if (flags->arg && flags->arg[0] != '\0') + { + if (!short_option (flags->cs->c)) + /* Long options require '='. */ + *p++ = '='; + p = quote_for_env (p, flags->arg); + } + flags = flags->next; + } + + /* If no flags at all, get rid of the initial dash. */ + if (p == &flagstring[1]) + { + flagstring[0] = '\0'; + p = flagstring; + } + + /* Define MFLAGS before appending variable definitions. Omit an initial + empty dash. Since MFLAGS is not parsed for flags, there is no reason to + override any makefile redefinition. */ + define_variable_cname ("MFLAGS", + flagstring + (flagstring[0] == '-' && flagstring[1] == ' ' ? 2 : 0), + o_env, 1); + + /* Write a reference to -*-eval-flags-*-, which contains all the --eval + flag options. */ + if (eval_strings) + { + *p++ = ' '; + memcpy (p, evalref, CSTRLEN (evalref)); + p += CSTRLEN (evalref); + } + + if (all && command_variables) + { + /* Write a reference to $(MAKEOVERRIDES), which contains all the + command-line variable definitions. Separate the variables from the + switches with a "--" arg. */ + + strcpy (p, " -- "); + p += 4; + + /* Copy in the string. */ + if (posix_pedantic) + { + memcpy (p, posixref, CSTRLEN (posixref)); + p += CSTRLEN (posixref); + } + else + { + memcpy (p, ref, CSTRLEN (ref)); + p += CSTRLEN (ref); + } + } + + /* If there is a leading dash, omit it. */ + if (flagstring[0] == '-') + ++flagstring; + + /* This used to use o_env, but that lost when a makefile defined MAKEFLAGS. + Makefiles set MAKEFLAGS to add switches, but we still want to redefine + its value with the full set of switches. Then we used o_file, but that + lost when users added -e, causing a previous MAKEFLAGS env. var. to take + precedence over the new one. Of course, an override or command + definition will still take precedence. */ + return define_variable_cname ("MAKEFLAGS", flagstring, + env_overrides ? o_env_override : o_file, 1); +} + +/* 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-2014 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 () +{ + 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. */ + +#ifdef WINDOWS32 + if (has_jobserver_semaphore () && jobserver_tokens) +#else + char token = '+'; + + if (job_fds[0] != -1 && jobserver_tokens) +#endif + { + 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) + { +#ifdef WINDOWS32 + if (! release_jobserver_semaphore ()) + perror_with_name ("release_jobserver_semaphore", ""); +#else + int r; + + EINTRLOOP (r, write (job_fds[1], &token, 1)); + if (r != 1) + perror_with_name ("write", ""); +#endif + } + } + + + /* 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 tcnt = 1; + +#ifdef WINDOWS32 + while (acquire_jobserver_semaphore ()) + ++tcnt; +#else + /* Close the write side, so the read() won't hang. */ + close (job_fds[1]); + + while (read (job_fds[0], &token, 1) == 1) + ++tcnt; +#endif + + if (tcnt != master_job_slots) + ONN (error, NILF, + "INTERNAL: Exiting with %u jobserver tokens available; should be %u!", + tcnt, master_job_slots); + +#ifdef WINDOWS32 + free_jobserver_semaphore (); +#else + close (job_fds[0]); +#endif + + /* Clean out jobserver_fds so we don't pass this information to any + sub-makes. Also reset job_slots since it will be put on the command + line, not in MAKEFLAGS. */ + job_slots = default_job_slots; + free (jobserver_fds); + jobserver_fds = 0; + } +} + +/* Exit with STATUS, cleaning up as necessary. */ + +void +die (int status) +{ + static char dying = 0; + + if (!dying) + { + int err; + + dying = 1; + + if (print_version_flag) + print_version (); + + /* Wait for children to die. */ + err = (status != 0); + while (job_slots_used > 0) + reap_children (1, err); + + /* Let the remote job module clean up its state. */ + remote_cleanup (); + + /* Remove the intermediate files. */ + remove_intermediates (0); + + if (print_data_base_flag) + print_data_base (); + + if (verify_flag) + verify_file_data_base (); + + clean_jobserver (status); + + if (output_context) + { + /* die() might be called in a recipe output context due to an + $(error ...) function. */ + output_close (output_context); + + if (output_context != &make_sync) + output_close (&make_sync); + + OUTPUT_UNSET (); + } + + output_close (NULL); + + /* Try to move back to the original directory. This is essential on + MS-DOS (where there is really only one process), and on Unix it + puts core files in the original directory instead of the -C + directory. Must wait until after remove_intermediates(), or unlinks + of relative pathnames fail. */ + if (directory_before_chdir != 0) + { + /* If it fails we don't care: shut up GCC. */ + int _x UNUSED; + _x = chdir (directory_before_chdir); + } + } + + exit (status); +} diff --git a/make.1 b/make.1 new file mode 100644 index 0000000..ed04db9 --- /dev/null +++ b/make.1 @@ -0,0 +1,381 @@ +.TH MAKE 1 "03 March 2012" "GNU" "User Commands" +.SH NAME +make \- GNU make utility to maintain groups of programs +.SH SYNOPSIS +.B make +[\fIOPTION\fR]... [\fITARGET\fR]... +.SH DESCRIPTION +.LP +The +.I make +utility will determine automatically which pieces of a large program need to +be recompiled, and issue the commands to recompile them. The manual describes +the GNU implementation of +.BR make , +which was written by Richard Stallman and Roland McGrath, and is currently +maintained by Paul Smith. Our examples show C programs, since they are very +common, but you can use +.B make +with any programming language whose compiler can be run with a shell command. +In fact, +.B make +is not limited to programs. You can use it to describe any task where some +files must be updated automatically from others whenever the others change. +.LP +To prepare to use +.BR make , +you must write a file called the +.I makefile +that describes the relationships among files in your program, and the states +the commands for updating each file. In a program, typically the executable +file is updated from object files, which are in turn made by compiling source +files. +.LP +Once a suitable makefile exists, each time you change some source files, +this simple shell command: +.sp 1 +.RS +.B make +.RE +.sp 1 +suffices to perform all necessary recompilations. +The +.B make +program uses the makefile description and the last-modification times of the +files to decide which of the files need to be updated. For each of those +files, it issues the commands recorded in the makefile. +.LP +.B make +executes commands in the +.I makefile +to update one or more target +.IR names , +where +.I name +is typically a program. +If no +.B \-f +option is present, +.B make +will look for the makefiles +.IR GNUmakefile , +.IR makefile , +and +.IR Makefile , +in that order. +.LP +Normally you should call your makefile either +.I makefile +or +.IR Makefile . +(We recommend +.I Makefile +because it appears prominently near the beginning of a directory +listing, right near other important files such as +.IR README .) +The first name checked, +.IR GNUmakefile , +is not recommended for most makefiles. You should use this name if you have a +makefile that is specific to GNU +.BR make , +and will not be understood by other versions of +.BR make . +If +.I makefile +is '\-', the standard input is read. +.LP +.B make +updates a target if it depends on prerequisite files +that have been modified since the target was last modified, +or if the target does not exist. +.SH OPTIONS +.sp 1 +.TP 0.5i +\fB\-b\fR, \fB\-m\fR +These options are ignored for compatibility with other versions of +.BR make . +.TP 0.5i +\fB\-B\fR, \fB\-\-always\-make\fR +Unconditionally make all targets. +.TP 0.5i +\fB\-C\fR \fIdir\fR, \fB\-\-directory\fR=\fIdir\fR +Change to directory +.I dir +before reading the makefiles or doing anything else. +If multiple +.B \-C +options are specified, each is interpreted relative to the +previous one: +.BR "\-C " / +.BR "\-C " etc +is equivalent to +.BR "\-C " /etc. +This is typically used with recursive invocations of +.BR make . +.TP 0.5i +.B \-d +Print debugging information in addition to normal processing. +The debugging information says which files are being considered for +remaking, which file-times are being compared and with what results, +which files actually need to be remade, which implicit rules are +considered and which are applied---everything interesting about how +.B make +decides what to do. +.TP 0.5i +.BI \-\-debug "[=FLAGS]" +Print debugging information in addition to normal processing. +If the +.I FLAGS +are omitted, then the behavior is the same as if +.B \-d +was specified. +.I FLAGS +may be +.I a +for all debugging output (same as using +.BR \-d ), +.I b +for basic debugging, +.I v +for more verbose basic debugging, +.I i +for showing implicit rules, +.I j +for details on invocation of commands, and +.I m +for debugging while remaking makefiles. Use +.I n +to disable all previous debugging flags. +.TP 0.5i +\fB\-e\fR, \fB\-\-environment\-overrides\fR +Give variables taken from the environment precedence +over variables from makefiles. +.TP 0.5i +\fB\-f\fR \fIfile\fR, \fB\-\-file\fR=\fIfile\fR, \fB\-\-makefile\fR=\fIFILE\fR +Use +.I file +as a makefile. +.TP 0.5i +\fB\-i\fR, \fB\-\-ignore\-errors\fR +Ignore all errors in commands executed to remake files. +.TP 0.5i +\fB\-I\fR \fIdir\fR, \fB\-\-include\-dir\fR=\fIdir\fR +Specifies a directory +.I dir +to search for included makefiles. +If several +.B \-I +options are used to specify several directories, the directories are +searched in the order specified. +Unlike the arguments to other flags of +.BR make , +directories given with +.B \-I +flags may come directly after the flag: +.BI \-I dir +is allowed, as well as +.B \-I +.IR dir . +This syntax is allowed for compatibility with the C +preprocessor's +.B \-I +flag. +.TP 0.5i +\fB\-j\fR [\fIjobs\fR], \fB\-\-jobs\fR[=\fIjobs\fR] +Specifies the number of +.I jobs +(commands) to run simultaneously. +If there is more than one +.B \-j +option, the last one is effective. +If the +.B \-j +option is given without an argument, +.BR make +will not limit the number of jobs that can run simultaneously. +.TP 0.5i +\fB\-k\fR, \fB\-\-keep\-going\fR +Continue as much as possible after an error. +While the target that failed, and those that depend on it, cannot +be remade, the other dependencies of these targets can be processed +all the same. +.TP 0.5i +\fB\-l\fR [\fIload\fR], \fB\-\-load\-average\fR[=\fIload\fR] +Specifies that no new jobs (commands) should be started if there are +others jobs running and the load average is at least +.I load +(a floating-point number). +With no argument, removes a previous load limit. +.TP 0.5i +\fB\-L\fR, \fB\-\-check\-symlink\-times\fR +Use the latest mtime between symlinks and target. +.TP 0.5i +\fB\-n\fR, \fB\-\-just\-print\fR, \fB\-\-dry\-run\fR, \fB\-\-recon\fR +Print the commands that would be executed, but do not execute them (except in +certain circumstances). +.TP 0.5i +\fB\-o\fR \fIfile\fR, \fB\-\-old\-file\fR=\fIfile\fR, \fB\-\-assume\-old\fR=\fIfile\fR +Do not remake the file +.I file +even if it is older than its dependencies, and do not remake anything +on account of changes in +.IR file . +Essentially the file is treated as very old and its rules are ignored. +.TP 0.5i +\fB\-O\fR[\fItype\fR], \fB\-\-output\-sync\fR[=\fItype\fR] +When running multiple jobs in parallel with \fB-j\fR, ensure the output of +each job is collected together rather than interspersed with output from +other jobs. If +.I type +is not specified or is +.B target +the output from the entire recipe for each target is grouped together. If +.I type +is +.B line +the output from each command line within a recipe is grouped together. +If +.I type +is +.B recurse +output from an entire recursive make is grouped together. If +.I type +is +.B none +output synchronization is disabled. +.TP 0.5i +\fB\-p\fR, \fB\-\-print\-data\-base\fR +Print the data base (rules and variable values) that results from +reading the makefiles; then execute as usual or as otherwise +specified. +This also prints the version information given by the +.B \-v +switch (see below). +To print the data base without trying to remake any files, use +.IR "make \-p \-f/dev/null" . +.TP 0.5i +\fB\-q\fR, \fB\-\-question\fR +``Question mode''. +Do not run any commands, or print anything; just return an exit status +that is zero if the specified targets are already up to date, nonzero +otherwise. +.TP 0.5i +\fB\-r\fR, \fB\-\-no\-builtin\-rules\fR +Eliminate use of the built\-in implicit rules. +Also clear out the default list of suffixes for suffix rules. +.TP 0.5i +\fB\-R\fR, \fB\-\-no\-builtin\-variables\fR +Don't define any built\-in variables. +.TP 0.5i +\fB\-s\fR, \fB\-\-silent\fR, \fB\-\-quiet\fR +Silent operation; do not print the commands as they are executed. +.TP 0.5i +\fB\-S\fR, \fB\-\-no\-keep\-going\fR, \fB\-\-stop\fR +Cancel the effect of the +.B \-k +option. +This is never necessary except in a recursive +.B make +where +.B \-k +might be inherited from the top-level +.B make +via MAKEFLAGS or if you set +.B \-k +in MAKEFLAGS in your environment. +.TP 0.5i +\fB\-t\fR, \fB\-\-touch\fR +Touch files (mark them up to date without really changing them) +instead of running their commands. +This is used to pretend that the commands were done, in order to fool +future invocations of +.BR make . +.TP 0.5i +.B \-\-trace +Information about the disposition of each target is printed (why the target is +being rebuilt and what commands are run to rebuild it). +.TP 0.5i +\fB\-v\fR, \fB\-\-version\fR +Print the version of the +.B make +program plus a copyright, a list of authors and a notice that there +is no warranty. +.TP 0.5i +\fB\-w\fR, \fB\-\-print\-directory\fR +Print a message containing the working directory +before and after other processing. +This may be useful for tracking down errors from complicated nests of +recursive +.B make +commands. +.TP 0.5i +.B \-\-no\-print\-directory +Turn off +.BR \-w , +even if it was turned on implicitly. +.TP 0.5i +\fB\-W\fR \fIfile\fR, \fB\-\-what\-if\fR=\fIfile\fR, \fB\-\-new\-file\fR=\fIfile\fR, \fB\-\-assume\-new\fR=\fIfile\fR +Pretend that the target +.I file +has just been modified. +When used with the +.B \-n +flag, this shows you what would happen if you were to modify that file. +Without +.BR \-n , +it is almost the same as running a +.I touch +command on the given file before running +.BR make , +except that the modification time is changed only in the imagination of +.BR make . +.TP 0.5i +.B \-\-warn\-undefined\-variables +Warn when an undefined variable is referenced. +.SH "EXIT STATUS" +GNU +.B make +exits with a status of zero if all makefiles were successfully parsed +and no targets that were built failed. A status of one will be returned +if the +.B \-q +flag was used and +.B make +determines that a target needs to be rebuilt. A status of two will be +returned if any errors were encountered. +.SH "SEE ALSO" +The full documentation for +.B make +is maintained as a Texinfo manual. If the +.B info +and +.B make +programs are properly installed at your site, the command +.IP +.B info make +.PP +should give you access to the complete manual. +.SH BUGS +See the chapter ``Problems and Bugs'' in +.IR "The GNU Make Manual" . +.SH AUTHOR +This manual page contributed by Dennis Morse of Stanford University. +Further updates contributed by Mike Frysinger. It has been reworked by Roland +McGrath. Maintained by Paul Smith. +.SH "COPYRIGHT" +Copyright \(co 1992-1993, 1996-2014 Free Software Foundation, Inc. +This file is part of +.IR "GNU make" . +.LP +GNU Make is free software; you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation; either version 3 of the License, or (at your option) any later +version. +.LP +GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. See the GNU General Public License for more details. +.LP +You should have received a copy of the GNU General Public License along with +this program. If not, see +.IR http://www.gnu.org/licenses/ . diff --git a/make.lnk b/make.lnk new file mode 100644 index 0000000..0d983bf --- /dev/null +++ b/make.lnk @@ -0,0 +1,5 @@ +FROM LIB:cres.o "commands.o"+"job.o"+"dir.o"+"file.o"+"misc.o"+"main.o"+"read.o"+"remake.o"+"rule.o"+"implicit.o"+"default.o"+"variable.o"+"expand.o"+"function.o"+"vpath.o"+"version.o"+"ar.o"+"arscan.o"+"signame.o"+"remote-stub.o"+"getopt.o"+"getopt1.o"+"alloca.o"+"amiga.o"+"hash.o"+"strcache.o"+"output.o" +TO "make.new" +LIB glob/glob.lib LIB:sc.lib LIB:amiga.lib +QUIET + diff --git a/make_msvc_net2003.sln b/make_msvc_net2003.sln new file mode 100644 index 0000000..e993896 --- /dev/null +++ b/make_msvc_net2003.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_msvc.net2003", "make_msvc_net2003.vcproj", "{E96B5060-3240-4723-91C9-E64F1C877A04}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {E96B5060-3240-4723-91C9-E64F1C877A04}.Debug.ActiveCfg = Debug|Win32 + {E96B5060-3240-4723-91C9-E64F1C877A04}.Debug.Build.0 = Debug|Win32 + {E96B5060-3240-4723-91C9-E64F1C877A04}.Release.ActiveCfg = Release|Win32 + {E96B5060-3240-4723-91C9-E64F1C877A04}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/make_msvc_net2003.vcproj b/make_msvc_net2003.vcproj new file mode 100644 index 0000000..01b1f0d --- /dev/null +++ b/make_msvc_net2003.vcproj @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/makefile.com b/makefile.com new file mode 100644 index 0000000..fe37c05 --- /dev/null +++ b/makefile.com @@ -0,0 +1,163 @@ +$! +$! 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 = "alloca ar arscan commands default dir expand file function " + - + "guile hash implicit job load main misc read remake " + - + "remote-stub rule output signame variable version " + - + "vmsfunctions vmsify vpath " + - + "[.glob]glob [.glob]fnmatch getopt1 getopt strcache" +$! +$ copy config.h-vms config.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) +$ 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'/include=([],[.glob])/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-2014 Free 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/makefile.vms b/makefile.vms new file mode 100644 index 0000000..ad5ded7 --- /dev/null +++ b/makefile.vms @@ -0,0 +1,173 @@ +# -*-Makefile-*- to build GNU make on VMS +# +# Copyright (C) 1996-2014 Free 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 . + +# VMS extensions from GNU Make 3.60 imported by +# Klaus Kämpf (kkaempf@rmi.de) +# Modified for version 3.78.1 by Hartmut.Becker@compaq.com. +# Modified for version 3.80 by zinser@decus.de +# Modified for versions 3.81, 3.99.90 by Hartmut Becker + +CC = cc +CP = copy + +%.obj: %.c + $(CC) $(CFLAGS)/obj=$@ $< +# +# Makefile for GNU Make +# + +ifeq ($(CC),cc) +CFLAGS = $(defines) /include=([],[.glob])/prefix=(all,except=(glob,globfree))/standard=relaxed/warn=(disable=questcompare) +else +CFLAGS = $(defines) /include=([],[.glob]) +endif +#LDFLAGS = /deb +LDFLAGS = + +ifeq ($(CC),cc) +defines = /define=("unlink=remove","HAVE_CONFIG_H","VMS","allocated_variable_expand_for_file=alloc_var_expand_for_file") +else +ifeq ($(ARCH),VAX) +defines = /define=("HAVE_CONFIG_H","GCC_IS_NATIVE","VAX") +else +defines = /define=("HAVE_CONFIG_H","GCC_IS_NATIVE") +endif +endif + +LOAD_AVG = /define="NO_LDAV" + +# If you don't want archive support, comment these out. +ARCHIVES = ,ar.obj,arscan.obj +ARCHIVES_SRC = ar.c arscan.c + +# If your system needs extra libraries loaded in, define them here. +# System V probably need -lPW for alloca. +# if on vax, uncomment the following line +#LOADLIBES = ,c.opt/opt +ifeq ($(CC),cc) +#LOADLIBES =,sys$$library:vaxcrtl.olb/lib +CRT0 = +else +LOADLIBES =,gnu_cc_library:libgcc.olb/lib +endif + +# If your system doesn't have alloca, or the one provided is bad, +# get it from the Emacs distribution and define these. +#ALLOCA = ,alloca.obj +#ALLOCASRC = alloca.c + +# If there are remote execution facilities defined, +# enable them with switches here (see remote-*.c). +REMOTE = + +# Any extra object files your system needs. +extras = ,signame.obj,remote-stub.obj,vmsfunctions.obj,vmsify.obj +#,directory.obj +# as an alternative: +glob = ,[.glob]glob.obj,[.glob]fnmatch.obj +getopt = ,getopt.obj,getopt1.obj +# Directory to install 'make' in. +bindir = [] +# Directory to install the man page in. +mandir = [] +# Number to put on the man page filename. +manext = 1 + +guile = ,guile.obj + +objs = commands.obj,job.obj,output.obj,dir.obj,file.obj,misc.obj,hash.obj,\ + load.obj,main.obj,read.obj,remake.obj,rule.obj,implicit.obj,\ + default.obj,variable.obj,expand.obj,function.obj,strcache.obj,\ + vpath.obj,version.obj$(guile)\ + $(ARCHIVES)$(ALLOCA)$(extras)$(getopt)$(glob) + +srcs = commands.c job.c output.c dir.c file.c misc.c guile.c hash.c \ + load.c main.c read.c remake.c rule.c implicit.c \ + default.c variable.c expand.c function.c strcache.c \ + vpath.c version.c vmsfunctions.c vmsify.c $(ARCHIVES_SRC) $(ALLOCASRC) \ + commands.h dep.h filedef.h job.h output.h makeint.h rule.h variable.h + + +.PHONY: all doc +all: config.h make.exe + +doc: make.info make.dvi + + +make.exe: $(objs) + $(LD)$(LDFLAGS)/exe=$@ $^$(LOADLIBES)$(CRT0) + +.PHONY: clean realclean +clean: + -purge [...] + -$(RM) make.exe;,*.obj; + -$(RM) [.glob]*.obj; + +ar.obj: ar.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h dep.h \ + [.glob]fnmatch.h +arscan.obj: arscan.c makeint.h config.h gnumake.h gettext.h +commands.obj: commands.c makeint.h config.h gnumake.h gettext.h filedef.h \ + hash.h dep.h variable.h job.h output.h commands.h +default.obj: default.c makeint.h config.h gnumake.h gettext.h filedef.h \ + hash.h variable.h rule.h dep.h job.h output.h commands.h +dir.obj: dir.c makeint.h config.h gnumake.h gettext.h hash.h filedef.h \ + dep.h [.glob]glob.h +expand.obj: expand.c makeint.h config.h gnumake.h gettext.h filedef.h \ + hash.h job.h output.h commands.h variable.h rule.h +file.obj: file.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h \ + dep.h job.h output.h commands.h variable.h debug.h +[.glob]fnmatch.obj: [.glob]fnmatch.c config.h [.glob]fnmatch.h +function.obj: function.c makeint.h config.h gnumake.h gettext.h filedef.h \ + hash.h variable.h dep.h job.h output.h commands.h debug.h +getopt.obj: getopt.c config.h gettext.h getopt.h +getopt1.obj: getopt1.c config.h getopt.h +[.glob]glob.obj: [.glob]glob.c config.h [.glob]fnmatch.h [.glob]glob.h +guile.obj: guile.c makeint.h config.h gnumake.h gettext.h +hash.obj: hash.c makeint.h config.h gnumake.h gettext.h hash.h +implicit.obj: implicit.c makeint.h config.h gnumake.h gettext.h filedef.h \ + hash.h rule.h dep.h debug.h variable.h job.h output.h commands.h +job.obj: job.c makeint.h config.h gnumake.h gettext.h job.h output.h debug.h \ + filedef.h hash.h commands.h variable.h debug.h vmsjobs.c +load.obj: load.c makeint.h config.h gnumake.h gettext.h +main.obj: main.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h \ + dep.h variable.h job.h output.h commands.h rule.h debug.h getopt.h +misc.obj: misc.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h \ + dep.h debug.h +output.obj: output.c makeint.h config.h gnumake.h gettext.h job.h output.h +read.obj: read.c makeint.h config.h gnumake.h gettext.h [.glob]glob.h \ + filedef.h hash.h dep.h job.h output.h commands.h variable.h rule.h \ + debug.h +remake.obj: remake.c makeint.h config.h gnumake.h gettext.h filedef.h \ + hash.h job.h output.h commands.h dep.h variable.h debug.h +remote-stub.obj: remote-stub.c makeint.h config.h gnumake.h gettext.h \ + filedef.h hash.h job.h output.h commands.h +rule.obj: rule.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h \ + dep.h job.h output.h commands.h variable.h rule.h +signame.obj: signame.c makeint.h config.h gnumake.h gettext.h +strcache.obj: strcache.c makeint.h config.h gnumake.h gettext.h hash.h +variable.obj: variable.c makeint.h config.h gnumake.h gettext.h filedef.h \ + hash.h dep.h job.h output.h commands.h variable.h rule.h +version.obj: version.c config.h +vmsfunctions.obj: vmsfunctions.c makeint.h config.h gnumake.h gettext.h \ + debug.h job.h output.h vmsdir.h +vmsify.obj: vmsify.c +vpath.obj: vpath.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h \ + variable.h + +config.h: config.h-vms + $(CP) $< $@ diff --git a/makeint.h b/makeint.h new file mode 100644 index 0000000..fdcae75 --- /dev/null +++ b/makeint.h @@ -0,0 +1,714 @@ +/* Miscellaneous global declarations and portability cruft for GNU Make. +Copyright (C) 1988-2014 Free 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 + +#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 + +#ifndef isblank +# define isblank(c) ((c) == ' ' || (c) == '\t') +#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_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] +#else +# define NEED_GET_PATH_MAX 1 +# define GET_PATH_MAX (get_path_max ()) +# define PATH_VAR(var) char *var = alloca (GET_PATH_MAX) +unsigned int get_path_max (void); +#endif + +#ifndef CHAR_BIT +# define CHAR_BIT 8 +#endif + +#ifndef USHRT_MAX +# define USHRT_MAX 65535 +#endif + +/* Nonzero if the integer type T is signed. + Use <= to avoid GCC warnings about always-false expressions. */ +#define INTEGER_TYPE_SIGNED(t) ((t) -1 <= 0) + +/* The minimum and maximum values for the integer type T. + Use ~ (t) 0, not -1, for portability to 1's complement hosts. */ +#define INTEGER_TYPE_MINIMUM(t) \ + (! INTEGER_TYPE_SIGNED (t) ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)) +#define INTEGER_TYPE_MAXIMUM(t) (~ (t) 0 - INTEGER_TYPE_MINIMUM (t)) + +#ifndef CHAR_MAX +# define CHAR_MAX INTEGER_TYPE_MAXIMUM (char) +#endif + +#ifdef STAT_MACROS_BROKEN +# ifdef S_ISREG +# undef S_ISREG +# endif +# ifdef S_ISDIR +# undef S_ISDIR +# endif +#endif /* STAT_MACROS_BROKEN. */ + +#ifndef S_ISREG +# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) +#endif +#ifndef S_ISDIR +# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +#endif + +#ifdef VMS +# include +# include +# include +# include +# include +/* Needed to use alloca on VMS. */ +# include +#endif + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(x) +# endif +/* The __-protected variants of 'format' and 'printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf +# endif +#endif +#define UNUSED __attribute__ ((unused)) + +#if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__) +# include +# 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) __attribute__ ((noreturn)); +void exit (int) __attribute__ ((noreturn)); +# endif /* HAVE_STDLIB_H. */ + +#endif /* Standard headers. */ + +/* These should be in stdlib.h. Make sure we have them. */ +#ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +#endif +#ifndef EXIT_FAILURE +# define EXIT_FAILURE 1 +#endif + +#ifndef ANSI_STRING + +/* SCO Xenix has a buggy macro definition in . */ +#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 + +/* ISDIGIT offers the following features: + - Its arg may be any int or unsigned int; it need not be an unsigned char. + - It's guaranteed to evaluate its argument exactly once. + NOTE! Make relies on this behavior, don't change it! + - It's typically faster. + POSIX 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that + only '0' through '9' are digits. Prefer ISDIGIT to isdigit() unless + it's important to use the locale's definition of 'digit' even when the + host does not conform to POSIX. */ +#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) + +/* Test if two strings are equal. Is this worthwhile? Should be profiled. */ +#define streq(a, b) \ + ((a) == (b) || \ + (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1)))) + +/* Test if two strings are equal, but match case-insensitively on systems + which have case-insensitive filesystems. Should only be used for + filenames! */ +#ifdef HAVE_CASE_INSENSITIVE_FS +# define patheq(a, b) \ + ((a) == (b) \ + || (tolower((unsigned char)*(a)) == tolower((unsigned char)*(b)) \ + && (*(a) == '\0' || !strcasecmp ((a) + 1, (b) + 1)))) +#else +# define patheq(a, b) streq(a, b) +#endif + +#define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0) + +#if defined(__GNUC__) || defined(ENUM_BITFIELDS) +# define ENUM_BITFIELD(bits) :bits +#else +# define ENUM_BITFIELD(bits) +#endif + +/* Handle gettext and locales. */ + +#if HAVE_LOCALE_H +# include +#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) + +/* 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 ';' +#elif !defined(PATH_SEPARATOR_CHAR) +# if defined (VMS) +# define PATH_SEPARATOR_CHAR ',' +# else +# define PATH_SEPARATOR_CHAR ':' +# endif +#endif + +/* 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_SPACE 0x0004 +#define MAP_COMMENT 0x0008 +#define MAP_SEMI 0x0010 +#define MAP_EQUALS 0x0020 +#define MAP_COLON 0x0040 +#define MAP_PERCENT 0x0080 +#define MAP_PIPE 0x0100 +#define MAP_DOT 0x0200 +#define MAP_COMMA 0x0400 + +/* These are the valid characters for a user-defined function. */ +#define MAP_USERFUNC 0x2000 +/* This means not only a '$', but skip the variable reference. */ +#define MAP_VARIABLE 0x4000 +/* The set of characters which are directory separators is OS-specific. */ +#define MAP_DIRSEP 0x8000 + +#ifdef VMS +# define MAP_VMSCOMMA MAP_COMMA +#else +# define MAP_VMSCOMMA 0x0000 +#endif + +#define STOP_SET(_v,_m) ANY_SET (stopchar_map[(unsigned char)(_v)],(_m)) + +#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) +# define SET_STACK_SIZE +#endif +#ifdef SET_STACK_SIZE +# include +extern struct rlimit stack_limit; +#endif + +#define NILF ((gmk_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") + +#ifdef HAVE_TTYNAME +# define TTYNAME(_f) ttyname (_f) +#else +# define TTYNAME(_f) "true" +#endif + + +const char *concat (unsigned int, ...); +void message (int prefix, size_t length, const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); +void error (const gmk_floc *flocp, size_t length, const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); +void fatal (const gmk_floc *flocp, size_t length, const char *fmt, ...) + __attribute__ ((noreturn, __format__ (__printf__, 3, 4))); + +#define O(_t,_a,_f) _t((_a), 0, (_f)) +#define OS(_t,_a,_f,_s) _t((_a), strlen (_s), (_f), (_s)) +#define OSS(_t,_a,_f,_s1,_s2) _t((_a), strlen (_s1) + strlen (_s2), \ + (_f), (_s1), (_s2)) +#define OSSS(_t,_a,_f,_s1,_s2,_s3) _t((_a), strlen (_s1) + strlen (_s2) + strlen (_s3), \ + (_f), (_s1), (_s2), (_s3)) +#define ON(_t,_a,_f,_n) _t((_a), INTSTR_LENGTH, (_f), (_n)) +#define ONN(_t,_a,_f,_n1,_n2) _t((_a), INTSTR_LENGTH*2, (_f), (_n1), (_n2)) + +#define OSN(_t,_a,_f,_s,_n) _t((_a), strlen (_s) + INTSTR_LENGTH, \ + (_f), (_s), (_n)) +#define ONS(_t,_a,_f,_n,_s) _t((_a), INTSTR_LENGTH + strlen (_s), \ + (_f), (_n), (_s)) + +#define OUT_OF_MEM() O (fatal, NILF, _("virtual memory exhausted")) + +void die (int) __attribute__ ((noreturn)); +void pfatal_with_name (const char *) __attribute__ ((noreturn)); +void perror_with_name (const char *, const char *); +#define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s)) +void *xmalloc (unsigned int); +void *xcalloc (unsigned int); +void *xrealloc (void *, unsigned int); +char *xstrdup (const char *); +char *xstrndup (const char *, unsigned int); +char *find_next_token (const char **, unsigned int *); +char *next_token (const char *); +char *end_of_token (const char *); +void collapse_continuations (char *); +char *lindex (const char *, const char *, int); +int alpha_compare (const void *, const void *); +void print_spaces (unsigned int); +char *find_percent (char *); +const char *find_percent_cached (const char **); + +#ifndef NO_ARCHIVES +int ar_name (const char *); +void ar_parse_name (const char *, char **, char **); +int ar_touch (const char *); +time_t ar_member_date (const char *); + +typedef long int (*ar_member_func_t) (int desc, const char *mem, int truncated, + long int hdrpos, long int datapos, + long int size, long int date, int uid, + int gid, 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 hash_init_directories (void); + +void define_default_variables (void); +void undefine_default_variables (void); +void set_default_suffixes (void); +void install_default_suffix_rules (void); +void install_default_implicit_rules (void); + +void build_vpath_lists (void); +void construct_vpath_list (char *pattern, char *dirpath); +const char *vpath_search (const char *file, FILE_TIMESTAMP *mtime_ptr, + unsigned int* vpath_index, unsigned int* path_index); +int gpath_search (const char *file, unsigned int len); + +void construct_include_path (const char **arg_dirs); + +void user_access (void); +void make_access (void); +void child_access (void); + +char *strip_whitespace (const char **begpp, const char **endpp); + +/* String caching */ +void strcache_init (void); +void strcache_print_stats (const char *prefix); +int strcache_iscached (const char *str); +const char *strcache_add (const char *str); +const char *strcache_add_len (const char *str, unsigned int len); +int strcache_setbufsize (unsigned int size); + +/* Guile support */ +int guile_gmake_setup (const gmk_floc *flocp); + +/* Loadable object support. Sets to the strcached name of the loaded file. */ +typedef int (*load_func_t)(const gmk_floc *flocp); +int load_file (const gmk_floc *flocp, const char **filename, int noerror); +void unload_file (const char *name); + +/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION, + because such systems often declare them in header files anyway. */ + +#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32) + +long int atol (); +# ifndef VMS +long int lseek (); +# endif + +#endif /* Not GNU C library or POSIX. */ + +#ifdef HAVE_GETCWD +# if !defined(VMS) && !defined(__DECC) +char *getcwd (); +# endif +#else +char *getwd (); +# define getcwd(buf, len) getwd (buf) +#endif + +#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 + +extern const gmk_floc *reading_file; +extern const gmk_floc **expanding_var; + +extern char **environ; + +extern unsigned short stopchar_map[]; + +extern int just_print_flag, silent_flag, ignore_errors_flag, keep_going_flag; +extern int print_data_base_flag, question_flag, touch_flag, always_make_flag; +extern int env_overrides, no_builtin_rules_flag, no_builtin_variables_flag; +extern int print_version_flag, print_directory_flag, check_symlink_flag; +extern int warn_undefined_variables_flag, trace_flag, posix_pedantic; +extern int not_parallel, second_expansion, clock_skew_detected; +extern int rebuilding_makefiles, one_shell, output_sync, verify_flag; + +/* 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 int job_fds[2]; +extern int job_rfd; +#ifndef NO_FLOAT +extern double max_load_average; +#else +extern int max_load_average; +#endif + +#ifdef WINDOWS32 +extern char *program; +#else +extern const char *program; +#endif + +#ifdef VMS +const char *vms_command(const char *argv0); +const char *vms_progname(const char *argv0); +#endif + +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 + + +#ifdef VMS +/* These are the VMS __posix_exit compliant exit codes, constructed out of + STS$M_INHIB_MSG, C facility code, a POSIX condition code mask, MAKE_NNN<<3 and + the coresponding VMS severity, here STS$K_SUCCESS and STS$K_ERROR. */ +# define MAKE_SUCCESS 0x1035a001 +# define MAKE_TROUBLE 0x1035a00a +# define MAKE_FAILURE 0x1035a012 +#else +# define MAKE_SUCCESS 0 +# define MAKE_TROUBLE 1 +# define MAKE_FAILURE 2 +#endif + +/* 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/misc.c b/misc.c new file mode 100644 index 0000000..00a3210 --- /dev/null +++ b/misc.c @@ -0,0 +1,726 @@ +/* Miscellaneous generic support functions for GNU Make. +Copyright (C) 1988-2014 Free 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 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 *in, *out, *p; + + in = strchr (line, '\n'); + if (in == 0) + return; + + out = in; + while (out > line && out[-1] == '\\') + --out; + + while (*in != '\0') + { + /* BS_WRITE gets the number of quoted backslashes at + the end just before IN, and BACKSLASH gets nonzero + if the next character is quoted. */ + unsigned int backslash = 0; + unsigned int bs_write = 0; + for (p = in - 1; p >= line && *p == '\\'; --p) + { + if (backslash) + ++bs_write; + backslash = !backslash; + + /* It should be impossible to go back this far without exiting, + but if we do, we can't get the right answer. */ + if (in == out - 1) + abort (); + } + + /* Output the appropriate number of backslashes. */ + while (bs_write-- > 0) + *out++ = '\\'; + + /* Skip the newline. */ + ++in; + + if (backslash) + { + /* Backslash/newline handling: + In traditional GNU make all trailing whitespace, consecutive + backslash/newlines, and any leading whitespace on the next line + is reduced to a single space. + In POSIX, each backslash/newline and is replaced by a space. */ + in = next_token (in); + if (! posix_pedantic) + while (out > line && isblank ((unsigned char)out[-1])) + --out; + *out++ = ' '; + } + else + /* If the newline isn't quoted, put it in the output. */ + *out++ = '\n'; + + /* Now copy the following line to the output. + Stop when we find backslashes followed by a newline. */ + while (*in != '\0') + if (*in == '\\') + { + p = in + 1; + while (*p == '\\') + ++p; + if (*p == '\n') + { + in = p; + break; + } + while (in < p) + *out++ = *in++; + } + else + *out++ = *in++; + } + + *out = '\0'; +} + +/* 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 unsigned int rlen = 0; + static char *result = NULL; + unsigned int ri = 0; + va_list args; + + va_start (args, num); + + while (num-- > 0) + { + const char *s = va_arg (args, const char *); + unsigned int l = xstrlen (s); + + if (l == 0) + continue; + + if (ri + l > rlen) + { + rlen = ((rlen ? rlen : 60) + l) * 2; + result = xrealloc (result, rlen); + } + + memcpy (result + ri, s, l); + ri += l; + } + + va_end (args); + + /* Get some more memory if we don't have enough space for the + terminating '\0'. */ + if (ri == rlen) + { + rlen = (rlen ? rlen : 60) * 2; + result = xrealloc (result, rlen); + } + + result[ri] = '\0'; + + return result; +} + + +#ifndef HAVE_STRERROR +#undef strerror +char * +strerror (int errnum) +{ + extern int errno, sys_nerr; +#ifndef __DECC + extern char *sys_errlist[]; +#endif + static char buf[] = "Unknown error 12345678901234567890"; + + if (errno < sys_nerr) + return sys_errlist[errnum]; + + sprintf (buf, _("Unknown error %d"), errnum); + return buf; +} +#endif + +/* Like malloc but get fatal error if memory is exhausted. */ +/* Don't bother if we're using dmalloc; it provides these for us. */ + +#ifndef HAVE_DMALLOC_H + +#undef xmalloc +#undef xcalloc +#undef xrealloc +#undef xstrdup + +void * +xmalloc (unsigned int size) +{ + /* Make sure we don't allocate 0, for pre-ISO implementations. */ + void *result = malloc (size ? size : 1); + if (result == 0) + OUT_OF_MEM(); + return result; +} + + +void * +xcalloc (unsigned int size) +{ + /* Make sure we don't allocate 0, for pre-ISO implementations. */ + void *result = calloc (size ? size : 1, 1); + if (result == 0) + OUT_OF_MEM(); + return result; +} + + +void * +xrealloc (void *ptr, unsigned int size) +{ + void *result; + + /* Some older implementations of realloc() don't conform to ISO. */ + if (! size) + size = 1; + result = ptr ? realloc (ptr, size) : malloc (size); + if (result == 0) + OUT_OF_MEM(); + return result; +} + + +char * +xstrdup (const char *ptr) +{ + char *result; + +#ifdef HAVE_STRDUP + result = strdup (ptr); +#else + result = malloc (strlen (ptr) + 1); +#endif + + if (result == 0) + OUT_OF_MEM(); + +#ifdef HAVE_STRDUP + return result; +#else + return strcpy (result, ptr); +#endif +} + +#endif /* HAVE_DMALLOC_H */ + +char * +xstrndup (const char *str, unsigned int length) +{ + char *result; + +#ifdef HAVE_STRNDUP + result = strndup (str, length); + if (result == 0) + OUT_OF_MEM(); +#else + result = xmalloc (length + 1); + if (length > 0) + strncpy (result, str, length); + result[length] = '\0'; +#endif + + return result; +} + + +/* 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) +{ + while (! STOP_SET (*s, MAP_BLANK|MAP_NUL)) + ++s; + return (char *)s; +} + +/* Return the address of the first nonwhitespace or null in the string S. */ + +char * +next_token (const char *s) +{ + while (isblank ((unsigned char)*s)) + ++s; + return (char *)s; +} + +/* Find the next token in PTR; return the address of it, and store the length + of the token into *LENGTHPTR if LENGTHPTR is not nil. Set *PTR to the end + of the token, so this function can be called repeatedly in a loop. */ + +char * +find_next_token (const char **ptr, unsigned int *lengthptr) +{ + const char *p = next_token (*ptr); + + if (*p == '\0') + return 0; + + *ptr = end_of_token (p); + if (lengthptr != 0) + *lengthptr = *ptr - p; + + return (char *)p; +} + + +/* 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 dep'. */ + +void +free_dep_chain (struct dep *d) +{ + while (d != 0) + { + struct dep *df = d; + d = d->next; + free_dep (df); + } +} + +/* 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 (t); + } +} + + +#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/output.c b/output.c new file mode 100644 index 0000000..e537f3a --- /dev/null +++ b/output.c @@ -0,0 +1,723 @@ +/* Output to stdout / stderr for GNU make +Copyright (C) 2013-2014 Free 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 "job.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 +# define STREAM_OK(_s) ((fcntl (fileno (_s), F_GETFD) != -1) || (errno != EBADF)) +#else +# define STREAM_OK(_s) 1 +#endif + +/* Write a string to the current STDOUT or STDERR. */ +static void +_outputs (struct output *out, int is_err, const char *msg) +{ + if (! out || ! out->syncout) + { + FILE *f = is_err ? stderr : stdout; + fputs (msg, f); + fflush (f); + } + else + { + int fd = is_err ? out->err : out->out; + int len = strlen (msg); + int r; + + EINTRLOOP (r, lseek (fd, 0, SEEK_END)); + while (1) + { + EINTRLOOP (r, write (fd, msg, len)); + if (r == len || r <= 0) + break; + len -= r; + msg += r; + } + } +} + +/* Write a message indicating that we've just entered or + left (according to ENTERING) the current directory. */ + +static int +log_working_directory (int entering) +{ + static char *buf = NULL; + static unsigned int len = 0; + unsigned int need; + const char *fmt; + char *p; + + /* Get enough space for the longest possible output. */ + need = strlen (program) + INTSTR_LENGTH + 2 + 1; + if (starting_directory) + need += strlen (starting_directory); + + /* Use entire sentences to give the translators a fighting chance. */ + if (makelevel == 0) + if (starting_directory == 0) + if (entering) + fmt = _("%s: Entering an unknown directory\n"); + else + fmt = _("%s: Leaving an unknown directory\n"); + else + if (entering) + fmt = _("%s: Entering directory '%s'\n"); + else + fmt = _("%s: Leaving directory '%s'\n"); + else + if (starting_directory == 0) + if (entering) + fmt = _("%s[%u]: Entering an unknown directory\n"); + else + fmt = _("%s[%u]: Leaving an unknown directory\n"); + else + if (entering) + fmt = _("%s[%u]: Entering directory '%s'\n"); + else + fmt = _("%s[%u]: Leaving directory '%s'\n"); + + need += strlen (fmt); + + if (need > len) + { + buf = xrealloc (buf, need); + len = need; + } + + p = buf; + if (print_data_base_flag) + { + *(p++) = '#'; + *(p++) = ' '; + } + + if (makelevel == 0) + if (starting_directory == 0) + sprintf (p, fmt , program); + else + sprintf (p, fmt, program, starting_directory); + else if (starting_directory == 0) + sprintf (p, fmt, program, makelevel); + else + sprintf (p, fmt, program, makelevel, starting_directory); + + _outputs (NULL, 0, buf); + + return 1; +} + +/* Set a file descriptor to be in O_APPEND mode. + If it fails, just ignore it. */ + +static void +set_append_mode (int fd) +{ +#if defined(F_GETFL) && defined(F_SETFL) && defined(O_APPEND) + int flags = fcntl (fd, F_GETFL, 0); + if (flags >= 0) + fcntl (fd, F_SETFL, flags | O_APPEND); +#endif +} + + +#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 () +{ + 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 () +{ + int fd = -1; + FILE *tfile = tmpfile (); + + if (! tfile) + pfatal_with_name ("tmpfile"); + + /* Create a duplicate so we can close the stream. */ + fd = dup (fileno (tfile)); + if (fd < 0) + pfatal_with_name ("dup"); + + fclose (tfile); + + set_append_mode (fd); + + return fd; +} + +/* Adds file descriptors to the child structure to support output_sync; one + for stdout and one for stderr as long as they are open. If stdout and + stderr share a device they can share a temp file too. + Will reset output_sync on error. */ +static void +setup_tmpfile (struct output *out) +{ + /* Is make's stdout going to the same place as stderr? */ + static int combined_output = -1; + + if (combined_output < 0) + combined_output = sync_init (); + + if (STREAM_OK (stdout)) + { + int fd = output_tmpfd (); + if (fd < 0) + goto error; + CLOSE_ON_EXEC (fd); + out->out = fd; + } + + if (STREAM_OK (stderr)) + { + if (out->out != OUTPUT_NONE && combined_output) + out->err = out->out; + else + { + int fd = output_tmpfd (); + if (fd < 0) + goto error; + CLOSE_ON_EXEC (fd); + out->err = fd; + } + } + + return; + + /* If we failed to create a temp file, disable output sync going forward. */ + error: + output_close (out); + output_sync = 0; +} + +/* 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 */ + + +/* Provide support for temporary files. */ + +#ifndef HAVE_STDLIB_H +# ifdef HAVE_MKSTEMP +int mkstemp (char *template); +# else +char *mktemp (char *template); +# endif +#endif + +FILE * +output_tmpfile (char **name, const char *template) +{ +#ifdef HAVE_FDOPEN + int fd; +#endif + +#if defined HAVE_MKSTEMP || defined HAVE_MKTEMP +# define TEMPLATE_LEN strlen (template) +#else +# define TEMPLATE_LEN L_tmpnam +#endif + *name = xmalloc (TEMPLATE_LEN + 1); + strcpy (*name, template); + +#if defined HAVE_MKSTEMP && defined HAVE_FDOPEN + /* It's safest to use mkstemp(), if we can. */ + fd = mkstemp (*name); + if (fd == -1) + return 0; + return fdopen (fd, "w"); +#else +# ifdef HAVE_MKTEMP + (void) mktemp (*name); +# else + (void) tmpnam (*name); +# endif + +# ifdef HAVE_FDOPEN + /* Can't use mkstemp(), but guard against a race condition. */ + fd = open (*name, O_CREAT|O_EXCL|O_WRONLY, 0600); + if (fd == -1) + return 0; + return fdopen (fd, "w"); +# else + /* Not secure, but what can we do? */ + return fopen (*name, "w"); +# endif +#endif +} + + +/* 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 () +{ +#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 gmk_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); + 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 gmk_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); + else if (makelevel == 0) + sprintf (p, "%s: *** ", program); + else + sprintf (p, "%s[%u]: *** ", program, makelevel); + p += strlen (p); + + va_start (args, fmt); + vsprintf (p, fmt, args); + va_end (args); + + strcat (p, stop); + + assert (fmtbuf.buffer[len-1] == '\0'); + outputs (1, fmtbuf.buffer); + + die (MAKE_FAILURE); +} + +/* Print an error message from errno. */ + +void +perror_with_name (const char *str, const char *name) +{ + const char *err = strerror (errno); + OSSS (error, NILF, _("%s%s: %s"), str, name, err); +} + +/* Print an error message from errno and exit. */ + +void +pfatal_with_name (const char *name) +{ + const char *err = strerror (errno); + OSS (fatal, NILF, _("%s: %s"), name, err); + + /* NOTREACHED */ +} diff --git a/output.h b/output.h new file mode 100644 index 0000000..7c5332c --- /dev/null +++ b/output.h @@ -0,0 +1,51 @@ +/* Output to stdout / stderr for GNU make +Copyright (C) 2013-2014 Free 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 OUTPUT_SET(_new) do{ output_context = (_new)->syncout ? (_new) : NULL; }while(0) +#define OUTPUT_UNSET() do{ output_context = NULL; }while(0) + +#define OUTPUT_TRACED() do{ stdio_traced = 1; }while(0) +#define OUTPUT_IS_TRACED() (!!stdio_traced) + +FILE *output_tmpfile (char **, const char *); + +/* Initialize and close a child output structure: if NULL do this program's + output (this should only be done once). */ +void output_init (struct output *out); +void output_close (struct output *out); + +/* In situations where output may be about to be displayed but we're not + sure if we've set it up yet, call this. */ +void output_start (void); + +/* Show a message on stdout or stderr. Will start the output if needed. */ +void outputs (int is_err, const char *msg); + +#ifndef NO_OUTPUT_SYNC +int output_tmpfd (void); +/* Dump any child output content to stdout, and reset it. */ +void output_dump (struct output *out); +#endif diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..d9ba7f4 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,5 @@ +# Set of available languages: 25 languages + +be cs da de es fi fr ga gl he hr id it ja ko lt nl pl pt_BR ru sv tr uk vi zh_CN + +# Can't seem to get en@quot and en@boldquot to build properly? diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..83d8838 --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,444 @@ +# 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.18 +GETTEXT_MACRO_VERSION = 0.18 + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + +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@ + +# 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: check-macro-version 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 + 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. +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ + package_gnu='GNU '; \ + else \ + package_gnu=''; \ + 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_gnu}@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): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + 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: + $(MAKE) update-po + @$(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/po/Makevars b/po/Makevars new file mode 100644 index 0000000..b69192e --- /dev/null +++ b/po/Makevars @@ -0,0 +1,59 @@ +# This is a -*-Makefile-*- +# Copyright (C) 2002-2014 Free 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 . + + +# 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_ + +# 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 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 = diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..4287c5d --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,45 @@ +# List of source files containing translatable strings. +# Copyright (C) 2000-2014 Free 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 . + +ar.c +arscan.c +commands.c +dir.c +expand.c +file.c +function.c +getopt.c +guile.c +hash.c +implicit.c +job.c +job.h +load.c +main.c +misc.c +output.c +read.c +remake.c +remote-cstms.c +rule.c +signame.c +strcache.c +variable.c +variable.h +vmsfunctions.c +vmsjobs.c +vpath.c diff --git a/po/Rules-quot b/po/Rules-quot new file mode 100644 index 0000000..af52487 --- /dev/null +++ b/po/Rules-quot @@ -0,0 +1,47 @@ +# 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"; 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) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 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/po/be.gmo b/po/be.gmo new file mode 100644 index 0000000..6c4ecf0 Binary files /dev/null and b/po/be.gmo differ diff --git a/po/be.po b/po/be.po new file mode 100644 index 0000000..7385724 --- /dev/null +++ b/po/be.po @@ -0,0 +1,2192 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Ales Nyakhaychyk , 2002, 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.80\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\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-Generator: KBabel 0.9.6\n" + +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "Ñпроба выкарыÑтаць непадтрымліваемую мажліваÑьць: \"%s\"" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "дакрананьне да ўдзельніку архіва недаÑтупна на VMS" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: архіў \"%s\" Ð½Ñ Ð¹Ñнуе" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: \"%s\" - гÑта не Ñ€ÑчаіÑны архіў" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: удзельнік \"%s\" Ð½Ñ Ð¹Ñнуе Ñž \"%s\"" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "" + +#: arscan.c:255 +#, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (назва муÑіла быць абрÑзана)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Дата %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, Ñ€Ñжым = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] ВыдалÑецца файл \"%s\"" + +#: commands.c:649 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** ВыдалÑецца файл \"%s\"" + +#: commands.c:685 +#, fuzzy +msgid "# recipe to execute" +msgstr "# загады Ð´Ð»Ñ Ð²Ñ‹ÐºÐ°Ð½Ð°Ð½ÑŒÐ½Ñ" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (убудаваны):" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (з\"%s\", радок %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# ТÑчкі\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "" + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "" + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "" + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Ðе" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " файлаў, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "не" + +#: dir.c:1064 +msgid " impossibilities" +msgstr "" + +#: dir.c:1068 +msgid " so far." +msgstr " так далёка." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr "" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "" + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "" + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** ВыдалÑецца файл \"%s\"" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "ВыдалÑюцца Ð¿Ñ€Ð°Ð¼ÐµÐ¶ÐºÐ°Ð²Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹...\n" + +#: file.c:811 +msgid "Current time" +msgstr "БÑгучы чаÑ" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: адбітак чаÑу па-за дапушчальнымі межамі, падÑтаўлÑецца %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# ÐÑ Ð¼Ñта:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "" + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "" + +#: file.c:964 +#, fuzzy +msgid "# Command line target." +msgstr "загадны радок" + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" + +#: file.c:968 +msgid "# Builtin rule" +msgstr "" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "" + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "" + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "" + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Так Ñама робÑцца:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Ð§Ð°Ñ Ð·ÑŒÐ¼ÑÐ½ÐµÐ½ÑŒÐ½Ñ Ð½Ñ–ÐºÐ¾Ð»Ñ– не правÑраўÑÑ." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Файл Ð½Ñ Ð¹Ñнуе." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Файл вельмі Ñтары." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# ÐпошнÑе зьмÑненьне %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Файл быў абноўлены." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Файл Ð½Ñ Ð±Ñ‹Ñž абноўлены." + +#: file.c:1001 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Загады, што выконваюцца зараз (ГЭТР- ПÐМЫЛКÐ)." + +#: file.c:1004 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Загады, што выконваюцца зараз (ГЭТР- ПÐМЫЛКÐ)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# ПаÑьпÑхова абноўлены." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "" + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "" + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Файлы" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "" + +#: function.c:1499 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe (): памылка Ñž process_init_fd()\n" + +#: function.c:1523 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe (): памылка Ñž process_init_fd()\n" + +#: function.c:1530 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "памылка Ñž CreatePipe() (e=%d)\n" + +#: function.c:1538 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): памылка Ñž process_init_fd()\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "" + +#: function.c:2193 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: function.c:2203 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "%s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "" + +#: function.c:2336 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "ÐÑ Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ð° Ð´Ð»Ñ Ð³Ñтае плÑтформы: Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ \"%s\"" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "" + +#: function.c:2601 +#, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "" + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: выбар \"%s\" - неадназначы.\n" + +#: getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: выбар \"--%s\" не дазвалÑе довад.\n" + +#: getopt.c:688 +#, fuzzy, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: выбар \"%c%s\" не дазвалÑе довад.\n" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: выбар \"%s\" патрабуе довад.\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: нераÑпазнаны выбар \"--%s\".\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: нераÑпазнаны выбар \"%c%s\".\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: недапушчальны выбар -- %c.\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: нерÑчаіÑны выбар -- %c.\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: выбар патрабуе довад -- %c.\n" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: выбар \"-W %s\" - неадназначын.\n" + +#: getopt.c:862 +#, fuzzy, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: выбар \"-W %s\" не дазвалÑе довад.\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "ВыдалÑюцца Ð¿Ñ€Ð°Ð¼ÐµÐ¶ÐºÐ°Ð²Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹...\n" + +#: job.c:361 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (чаÑовы файл)" + +#: job.c:483 +msgid " (core dumped)" +msgstr "" + +#: job.c:488 +msgid " (ignored)" +msgstr "" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (убудаваны):" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "" + +#: job.c:516 job.c:524 +#, fuzzy, c-format +msgid "%s[%s] Error %d%s" +msgstr "*** [%s] Памылка %d" + +#: job.c:519 +#, fuzzy, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "*** [%s] Памылка 0x%x" + +#: job.c:529 +#, fuzzy, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s%s: %s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Чакаюцца Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÐ°Ð½Ñ‹Ñ Ð¿Ñ€Ð°Ñ†Ñ‹...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr "" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: job.c:1036 +msgid "write jobserver" +msgstr "" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: архіў \"%s\" Ð½Ñ Ð¹Ñнуе" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s ÐÑма правіла каб зрабіць мÑту \"%s\", патрÑбную Ð´Ð»Ñ \"%s\"%s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "" + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: загад не адшуканы" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL зьменена (раней \"%s\", зараз \"%s\")" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +#, fuzzy +msgid "The 'load' operation is not supported on this platform." +msgstr "ÐŸÐ°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ñ Ð¿Ñ€Ð°Ñ†Ñ‹ (-j) не падтрымліваюцца на гÑтае плÑтхорме." + +#: main.c:313 +msgid "Options:\n" +msgstr "Выбары:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr "" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:330 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr "" +" -h, --help Друкуе гÑтае паведамленьне й выходзіць.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: main.c:340 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" + +#: main.c:344 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:349 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:352 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Друкуе нутраную базу даньнÑÑž make.\n" + +#: main.c:360 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" + +#: main.c:366 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Ðе адлюÑтроўваць загады.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Выключае -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" + +#: main.c:373 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr "" +" -h, --help Друкуе гÑтае паведамленьне й выходзіць.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Друкуе бÑгучую Ñ‚Ñчку.\n" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" + +#: main.c:381 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "пуÑÑ‚Ñ‹ радок нерÑчаіÑны Ñž ÑкаÑьці назвы файла" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" + +#: main.c:835 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s Ñпынена на 30 ÑÑкундаў..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" + +#: main.c:1567 +msgid "dup jobserver" +msgstr "" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile Ñа Ñтандартнага ўводу зададзены двойчы." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (чаÑовы файл)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (чаÑовы файл)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "ÐŸÐ°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ñ Ð¿Ñ€Ð°Ñ†Ñ‹ (-j) не падтрымліваюцца на гÑтае плÑтхорме." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "" + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "Ñтвараецца трубаправод прац" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "ÐбнаўлÑюцца make-файлы....\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "" + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "Makefile \"%s\" Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½" + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefile \"%s\" Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "" + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (чаÑовы файл): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "" + +#: main.c:2511 +msgid "No targets" +msgstr "ÐÑма мÑÑ‚" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "ВыкарыÑтаньне: %s [выбары] [мÑта] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"ГÑта праграма пабудавана Ð´Ð»Ñ %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"ГÑта праграма падубавана Ð´Ð»Ñ %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "ПаведамлÑйце пра памылкі на .\n" + +#: main.c:2807 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "выбар \"-%c\" патрабуе Ñтаноўчы цÑлы довад" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "выбар \"-%c\" патрабуе Ñтаноўчы цÑлы довад" + +#: main.c:3269 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"ГÑта праграма пабудавана Ð´Ð»Ñ %s\n" + +#: main.c:3271 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"ГÑта праграма падубавана Ð´Ð»Ñ %s (%s)\n" + +#: main.c:3282 +#, 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 "" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: карыÑтальнік %lu (наÑамрÑч %lu), група %lu (наÑамрÑч %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "" + +#: misc.c:622 +msgid "User access" +msgstr "" + +#: misc.c:670 +msgid "Make access" +msgstr "" + +#: misc.c:704 +msgid "Child access" +msgstr "" + +#: output.c:104 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: уваход у невÑдомую Ñ‚Ñчку" + +#: output.c:106 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: выхад зь невÑдомае Ñ‚Ñчкі" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: уваход у Ñ‚Ñчку \"%s\"\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: выхад з Ñ‚Ñчкі \"%s\"\n" + +#: output.c:115 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: уваход у невÑдомую Ñ‚Ñчку" + +#: output.c:117 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: выхад зь невÑдомае Ñ‚Ñчкі" + +#: output.c:120 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: уваход у Ñ‚Ñчку \"%s\"\n" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: выхад з Ñ‚Ñчкі \"%s\"\n" + +#: output.c:495 output.c:497 +msgid "write error: stdout" +msgstr "" + +#: output.c:677 +msgid ". Stop.\n" +msgstr "" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Чытаюцца make-файлы...\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Чытаецца make-файл \"%s\"" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (нÑма дапомнае мÑÑ‚Ñ‹)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (пошук шлÑху)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr "" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr "" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "" + +#: read.c:1041 +#, fuzzy +msgid "missing rule before recipe" +msgstr "прапушчана правіла перад загадамі" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (вы маеце на ўвазе TAB замеÑÑ‚ 8 прагалаў?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "прапушчан падзÑлÑльнік %s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "прапушчаны \"endif\"" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "прапушчаны \"endef\", незавершаны \"define\"" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "зьнешні \"%s\"" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "" + +#: read.c:2229 +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "Ðічога Ð½Ñ Ð±Ñ‹Ð»Ð¾ зроблена Ð´Ð»Ñ \"%s\"." + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "\"%s\" - ÑаÑтарÑл(а)." + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "УÑÑ‘ ÑÑˆÑ Ð°Ð±Ð½Ð°ÑžÐ»Ñецца файл \"%s\".\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%s ÐÑма правіла каб зрабіць мÑту \"%s\", патрÑбную Ð´Ð»Ñ \"%s\"%s" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sÐÑма правіла каб зрабіць мÑту \"%s\"%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "Файл \"%s\" ужо быў разгледжаны.\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "УÑÑ‘ ÑÑˆÑ Ð°Ð±Ð½Ð°ÑžÐ»Ñецца файл \"%s\".\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Скончана абнаўленьне файла \"%s\".\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "Файл \"%s\" Ð½Ñ Ð¹Ñнуе.\n" + +#: remake.c:495 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "" + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Скончана абнаўленьне файла \"%s\".\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Скончана абнаўленьне файла \"%s\".\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "" + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Файл \"%s\" Ð½Ñ Ð¹Ñнуе.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "%sÐÑма правіла каб зрабіць мÑту \"%s\"%s" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "%sÐÑма правіла каб зрабіць мÑту \"%s\"%s" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr "" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "%sÐÑма правіла каб зрабіць мÑту \"%s\"%s" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "ÐевÑдомы ўбудаваны загад \"%s\".\n" + +#: remake.c:1397 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Увага! Файл \"%s\" мае Ñ‡Ð°Ñ Ð·ÑŒÐ¼ÑненьнÑ, Ñкі ÑˆÑ‡Ñ Ð½Ðµ надышоў." + +#: remake.c:1411 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Увага! Файл \"%s\" мае Ñ‡Ð°Ñ Ð·ÑŒÐ¼ÑÐ½ÐµÐ½ÑŒÐ½Ñ %.2g Ñ, Ñкі ÑˆÑ‡Ñ Ð½Ðµ надышоў." + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" + +#: rule.c:522 +msgid " terminal." +msgstr " Ñ‚Ñрмінал." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "" + +#: signame.c:84 +msgid "unknown signal" +msgstr "невÑдомы Ñыгнал" + +#: signame.c:92 +msgid "Hangup" +msgstr "" + +#: signame.c:95 +msgid "Interrupt" +msgstr "" + +#: signame.c:98 +msgid "Quit" +msgstr "" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "ÐÐµÐ´Ð°Ð¿ÑƒÑˆÑ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñ–Ð½ÑтрукцыÑ" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "" + +#: signame.c:109 +msgid "Aborted" +msgstr "" + +#: signame.c:112 +msgid "IOT trap" +msgstr "" + +#: signame.c:115 +msgid "EMT trap" +msgstr "" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "" + +#: signame.c:121 +msgid "Killed" +msgstr "Забіты" + +#: signame.c:124 +msgid "Bus error" +msgstr "Памылка шыны" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "" + +#: signame.c:130 +msgid "Bad system call" +msgstr "ДрÑнны ÑÑ‹ÑÑ‚Ñмны выклік" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Зламаны трубаправод" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "" + +#: signame.c:139 +msgid "Terminated" +msgstr "Завершаны" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "" + +#: signame.c:156 +msgid "Power failure" +msgstr "" + +#: signame.c:159 +msgid "Stopped" +msgstr "Спынен" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Спынен (tty увод)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Спынен (вывад на tty)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Спынена (Ñыгнал)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "" + +#: signame.c:186 +msgid "Window changed" +msgstr "Ðкно зьменена" + +#: signame.c:189 +msgid "Continued" +msgstr "" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "магчым У/Ð’" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "" + +#: signame.c:211 +msgid "Resource lost" +msgstr "" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Сыгнал пагрозы" + +#: signame.c:217 +msgid "Information request" +msgstr "Запыт аб зьвеÑтках" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: strcache.c:266 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" + +#: variable.c:1599 +msgid "automatic" +msgstr "аўтаматычна" + +#: variable.c:1602 +msgid "default" +msgstr "дапомны" + +#: variable.c:1605 +msgid "environment" +msgstr "аÑÑродзьдзе" + +#: variable.c:1608 +msgid "makefile" +msgstr "make-файл" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "" + +#: variable.c:1614 +msgid "command line" +msgstr "загадны радок" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "дырÑктыва \"override\"" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (з \"%s\", радок %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# ПераменныÑ\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "Увага! ÐÑÐ²Ñ‹Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ð¿ÐµÑ€Ð°Ð¼ÐµÐ½Ð½Ð°Ñ \"%.*s\"" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "" + +#: vmsjobs.c:501 +#, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "ÐевÑдомы ўбудаваны загад \"%s\".\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Памылка! Парожні загад.\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Перанакіраваны ўвод з %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "" + +#: vmsjobs.c:690 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Перанакіраваны вывад у %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Перанакіраваны вывад у %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr " (пошук шлÑху)" + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" + +#~ 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 "virtual memory exhausted" +#~ msgstr "Ð²Ñ–Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ð¼Ñць вычарпана" + +#~ msgid "invalid `override' directive" +#~ msgstr "нерÑчаіÑÐ½Ð°Ñ Ð´Ñ‹Ñ€Ñктыва \"override\"" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "нÑма назвы файла Ð´Ð»Ñ \"%sinclude\"" + +#~ 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/po/boldquot.sed b/po/boldquot.sed new file mode 100644 index 0000000..4b937aa --- /dev/null +++ b/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/po/cs.gmo b/po/cs.gmo new file mode 100644 index 0000000..e8cbeaf Binary files /dev/null and b/po/cs.gmo differ diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..9e6fa8b --- /dev/null +++ b/po/cs.po @@ -0,0 +1,2312 @@ +# Czech translation of make. +# Copyright (C) 2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Petr Pisar , 2011, 2013. +# +# 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.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-10-09 21:24+0200\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" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "pokus použít nepodporovanou vlastnost: „%s“" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "nastavení Äasu zmÄ›ny prvku archivu není na VMS dostupné" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Archiv „%s“ neexistuje" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: „%s“ není platným archivem" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Prvek „%s“ v „%s“ neexistuje" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: Chybný návratový kód z funkce ar_member_touch volané nad „%s“" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"funkce lbr$set_module() nedokázala vytáhnout údaje o modulu, status = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "funkce lbr$ini_control() selhala se stavem = %d" + +#: arscan.c:255 +#, fuzzy, 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í prvku „%s“" + +# TODO: Pluralize +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Prvek „%s“%s: %'ld bajtů at %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (název může být zkrácen)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " UID = %d, GID = %d, práva = 0%o\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Návod má příliÅ¡ mnoho řádků (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** PÅ™eruÅ¡eno.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Prvek archivu „%s“ je možná chybný, nesmazáno" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Prvek archivu „%s“ ne možná chybný, nesmazáno" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Maže se soubor „%s“" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Maže se soubor „%s“" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# spustitelný návod" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (vestavÄ›ný):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (z „%s“, řádek %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Adresáře\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: nebylo možné nad ním zavolat stat().\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (klÃ­Ä %s, Äas zmÄ›ny obsahu %d): nebylo možné otevřít.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (zařízení %d, iuzel [%d,%d,%d]): nebylo možné otevřít.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (zařízení %ld, iuzel %ld): nebylo možné otevřít.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (klÃ­Ä %s, Äas zmÄ›ny obsahu %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (zařízení %d, iuzel [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (zařízení %ld, iuzel %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Žádný" + +# TODO: Pluralize +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " souborů, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "žádný " + +# TODO: Pluralize +#: dir.c:1064 +msgid " impossibilities" +msgstr " nemožností " + +#: dir.c:1068 +msgid " so far." +msgstr " zatím." + +# TODO: Pluralize +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " nemožností v %lu adresářích.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekurzivní promÄ›nná „%s“ odkazuje na sebe (nakonec)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "neukonÄený odkaz na promÄ›nnou" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Návod byl urÄen pro soubor „%s“ v %s:%lu," + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Návod pro soubor „%s“ byl nalezen hledáním implicitních pravidel," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "ale „%s“ se nyní považuje za soubor totožný s „%s“." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "Návod pro „%s“ bude ignorován ve prospÄ›ch návodu pro „%s“." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" +"„%s“ s jednoduchou dvojteÄkou nelze pÅ™ejmenovat na „%s“ s dvojitou dvojteÄkou" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" +"„%s“ s dvojitou dvojteÄkou nelze pÅ™ejmenovat na „%s“ s jednoduchou dvojteÄkou" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "Maže se mezilehlý soubor „%s“ " + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Odstraňují se mezilehlé soubory…\n" + +#: file.c:811 +msgid "Current time" +msgstr "Aktuální Äas" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: ÄŒasový údaj mimo rozsah, nahrazuje se %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Není cílem:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Cenný soubor (prerekvizita k .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# FaleÅ¡ný cíl (prerekvizita k .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Cíl příkazové řádky." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Default, MAKEFILES nebo -include/sinclude makefile." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# VestavÄ›né pravidlo" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Hledalo se za pomoci implicitních pravidel." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Nehledalo se za pomoci implicitních pravidel." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# KoÅ™en implicitního/statického vzoru: „%s“\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Soubor je mezilehlá prerekvizita." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Rovněž vyrábí:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# ÄŒas zmÄ›ny obsahu se nikdy nekontroluje." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Soubor neexistuje." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Soubor je velmi starý." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Obsah naposledy zmÄ›nÄ›n v %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Soubor byl aktualizován." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Soubor nebyl aktualizován." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Návod se právÄ› vykonává (TOTO JE CHYBA)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Návod pro závislosti se právÄ› vykonává (TOTO JE CHYBA)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# ÚspěšnÄ› aktualizováno." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Je tÅ™eba aktualizovat (-q je nastaveno)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Aktualizace selhala." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Neplatná hodnota v Älenu „command_state“!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Soubory" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# Statistika haÅ¡ovací tabulky souborů:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Položka „%s“ není v keÅ¡i: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "neÄíselný první argument funkce „word“" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "první argument funkce „word“ musí být vetší než 0" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "neÄíselný první argument funkce „wordlist“" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "neÄíselný druhý argument funkce „wordlist“" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(vstup) selhalo (chyba=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" +"windows32_openpipe: DuplicateHandle(chybový výstup) selhalo (chyba=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() selhalo (chyba=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() selhalo\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "DoÄasný dávkový soubor %s se uklízí\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "otevÅ™ení: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "zápis: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "Neplatná operace na souboru: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "nedostateÄný poÄet argumentů (%d) funkce „%s“" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "na této platformÄ› neimplementováno: funkce „%s“" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "neukonÄené volání funkce „%s“: chybí „%c“" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "Prázdný název funkce\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Neplatný název funkce: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Název funkce je příliÅ¡ dlouhý: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "Neplatný minimální poÄet argumentů (%d) funkce %s\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "Neplatný maximální poÄet argumentů (%d) funkce %s\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: pÅ™epínaÄ â€ž%s“ není jednoznaÄný\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: pÅ™epínaÄe „--%s“ nepÅ™ipouÅ¡tí argument\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: pÅ™epínaÄ â€ž%c%s“ nepÅ™ipouÅ¡tí argument\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: pÅ™epínaÄ â€ž%s“ vyžaduje argument\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: nerozpoznaný pÅ™epínaÄ â€ž--%s“\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: nerozpoznaný pÅ™epínaÄ â€ž%c%s“\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: zakázaný pÅ™epínaÄ – %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: neplatný pÅ™epínaÄ – %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: pÅ™epínaÄ vyžaduje argument – %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: pÅ™epínaÄ â€ž-W %s“ není jednoznaÄný\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: pÅ™epínaÄ â€ž-W %s“ nepÅ™ipouÅ¡tí argument\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expanduje se „%s“\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Vyhodnocuje se „%s“\n" + +# TODO: Pluralize +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "nelze alokovat %lu bajtů na haÅ¡ovací tabulku: paměť vyÄerpána" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Zátěž = %ld/%ld = %.0f %%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "PÅ™ehaÅ¡ováno = %d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Kolizí = %ld/%ld = %.0f %%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Hledá se implicitní pravidlo pro „%s“.\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Hledá se implicitní pravidlo prvku archivu pro „%s“.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Zabraňuje se rekurzi implicitního pravidla.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "KoÅ™en je příliÅ¡ dlouhý „%.*s“.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Zkouší se pravidlo vzoru s koÅ™enem „%.*s“.\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Zamítá se nemožná prerekvizita pravidla „%s“.\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Zamítá se nemožná implicitní prerekvizita „%s“.\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Zkouší se prerekvizita pravidla „%s“.\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Zkouší se implicitní prerekvizita „%s“.\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Nalezena prerekvizita „%s“ jako VPATH „%s“\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Hledá se pravidlo s mezilehlým souborem „%s“.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "DoÄasný soubor nelze vytvoÅ™it\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (obraz pamÄ›ti uložen)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (ignorováno)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: návod pro cíl „%s“ selhal" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Chyba %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Chyba 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** ÄŒeká se na nedokonÄené úlohy…" + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Živý potomek %p (%s) PID %s %s\n" + +# Continuation of Live child +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (vzdálený)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Uklízí se prohrávající potomek %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Uklízí se vyhrávající potomek %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Uklízí se doÄasný dávkový soubor %s\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Úklid doÄasného dávkového souboru %s selhal (%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Z řetÄ›zce se odstraňuje potomek %p PID %s%s.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "uvolnÄ›ní semaforu správce úloh: (Chyba %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "UvolnÄ›n token pro potomka %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "zápis správce úloh" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() nedokázala spustit proces (chyba=%ld)\n" + +# FIXME: Pluralize +#: job.c:1666 job.c:2391 +#, 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" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Do Å™etÄ›zce se pÅ™idává potomek %p (%s) PID %s%s.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "Äekání na semafor nebo potomka: (Chyba %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Získán token pro potomka %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "Ätení z roury úloh" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: cíl „%s“ neexistuje" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: aktualizovat cíl „%s“ potÅ™ebný pro %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "na tomto operaÄním systému nelze vynutit omezení zátěže" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "omezení zátěže nelze vynutit: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "nedostatek deskriptorů souboru: standardní vstup nelze zduplikovat\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "nedostatek deskriptorů souboru: standardní výstup nelze zduplikovat\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "nedostatek deskriptorů souboru: chybový výstup nelze zduplikovat\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Standardní vstup nelze obnovit\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Standardní výstup nelze obnovit\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Chybový výstup nelze obnovit\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make uklidil potomka s PID %s, stále se Äeká na PID %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Příkaz nenalezen" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Program shellu nenalezen" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: možná byl vyÄerpán prostor pro prostÅ™edí" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "PromÄ›nná $SHELL se zmÄ›nila (byla „%s“, nyní je „%s“)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Vytváří se doÄasný dávkový soubor %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Obsah dávkového souboru:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Obsah dávkového souboru:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (řádek %d) Chybný kontext shellu (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" +"PÅ™epínaÄ -O[DRUH] (--output-sync[=DRUH]) není v tomto sestavení zahrnut." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "NepodaÅ™ilo se otevřít tabulku globálních symbolů: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Zavedený objekt %s není veden jako sluÄitelný s GPL" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Symbol %s z %s se nepodaÅ™ilo zavést: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Pokus zavést prázdný název symbolu: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Zavádí se symbol %s z %s\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "Na této platformÄ› není operace zavedení (load) podporována." + +#: main.c:313 +msgid "Options:\n" +msgstr "PÅ™epínaÄe:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoruje se kvůli kompatibilitÄ›.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make BezpodmíneÄnÄ› vyrobí vÅ¡echny cíle.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Vypisuje mnoho ladicích údajů.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=PŘÃZNAKY] Vypisuje ladicí údaje rozliÄných druhů.\n" + +#: main.c:325 +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" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr " --eval=ŘETÄšZEC Vyhodnotí ŘETÄšZEC jako kód makefilu.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Vypíše tuto zprávu a skonÄí.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignoruje chyby z návodů.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going PokraÄuje, když nÄ›které cíle nelze vyrobit.\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +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" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Vypíše vnitÅ™ní databázi programu make.\n" + +#: main.c:360 +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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules Vypne vestavÄ›ná implicitní pravidla.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables Vypne vestavÄ›né nastavení promÄ›nných.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Neopisuje návod.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Vypne -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " -t, --touch Namísto výroby cílů jim zmÄ›ní Äas.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace Vypisuje trasovací údaje.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Vypíše Äíslo verze programu make a skonÄí.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Vypisuje aktuální adresář.\n" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Vypne -w, i kdyby byl zapnut implicitnÄ›.\n" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "prázdný Å™etÄ›zec není platný název souboru" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "zadána neznámá úroveň ladÄ›ní „%s“" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "neznámý druh synchronizace výstupu „%s“" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Zachyceno pÅ™eruÅ¡ení/výjimka (kód = 0x%lx, adresa = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "PoruÅ¡ení přístupu: operace zápisu na adrese 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "PoruÅ¡ení přístupu: operace Ätení na adrese 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() nastavuje default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"find_and_set_shell() pÅ™i prohledávání cesty nastavila default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s se uspí na 30 sekund…" + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) dokonÄeno. PokraÄuje se.\n" + +#: main.c:1527 +#, 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)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Klient správce úloh (semafor %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "vnitÅ™ní chyba: neplatný Å™etÄ›zec --jobserver-fds „%s“" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Klient správce úloh (deskriptory %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "pozor: -jN vnuceno podřízenému maku: režim správce úloh se vypíná." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "služba dup() nad správcem úloh" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"pozor: správce úloh není dostupný: použije se -j1. Do nadřízeného pravidla " +"maku pÅ™idejte „+“." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile na standardním vstupu uveden dvakrát." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (doÄasný soubor)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (doÄasný soubor)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Na této platformÄ› nejsou paralelní úlohy (-j) podporovány." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Návrat k jednoúlohovému režimu (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Místa ve správci úloh jsou omezena na %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "vytváření semaforu správce úloh: (Chyba %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "vytváření roury úloh" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "inicializace roury správce úloh" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Symbolické odkazy nejsou podporovány: vypíná se -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Soubory makefile se aktualizují…\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Makefile „%s“ může cyklit, nebude znovu vyroben.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Výroba nového makefilu „%s“ selhala." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Vložený makefile „%s“ nebyl nalezen." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefile „%s“ nebyl nalezen" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Nebylo možné se vrátit do původního adresáře." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Znovu se spouÅ¡tí [%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (doÄasný soubor): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL obsahuje více než jeden cíl" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Nezadány žádné cíle a žádné makefily nenalezeny" + +#: main.c:2511 +msgid "No targets" +msgstr "Žádné cíle" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Aktualizují se cíle…\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "pozor: ZjiÅ¡tÄ›n posun hodin. VaÅ¡e sestavení možná nebude úplné." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Použití: %s [PŘEPÃNAÄŒE] [CÃLE]…\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Tento program byl sestaven pro %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Tento program byl sestaven pro %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Chyby v programu hlaste anglicky na . Nedostatky\n" +"v pÅ™ekladu hlaste Äesky na .\n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "pÅ™epínaÄe „%s%s“ vyžaduje neprázdný Å™etÄ›zcový argument" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "pÅ™epínaÄ â€ž-%c“ vyžaduje kladný celoÄíselný argument" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sSestaveno pro %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%s Sestaveno pro %s (%s)\n" + +#: main.c:3282 +#, 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) +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Databáze maku vypsána v %s" + +# FIXME: i18n %s (time) +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Konec databáze maku v %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Neznámá chyba %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: uživatel %lu (reálný %lu), skupina %lu (reálná %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Přístup zahájen" + +#: misc.c:622 +msgid "User access" +msgstr "Přístup uživatelem" + +#: misc.c:670 +msgid "Make access" +msgstr "Přístup makem" + +#: misc.c:704 +msgid "Child access" +msgstr "Přístup potomkem" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Vstupuje se do neznámého adresáře\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s OpouÅ¡tí se neznámý adresář\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Vstupuje se do adresáře „%s“\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: OpouÅ¡tí se adresář „%s“\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Vstupuje se do neznámého adresáře\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: OpouÅ¡tí se neznámý adresář\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Vstupuje se do adresáře „%s“\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: OpouÅ¡tí se adresář „%s“\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "chyba zápisu: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Konec.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "ÄŒtou se makefily…\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "ÄŒte se makefile „%s“" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (žádný výchozí cíl)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (vyhledávací cesta)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (nestarat se)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (žádný expanze ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "PÅ™eskakuje se UTF-8 BOM v makefilu „%s“\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "PÅ™eskakuje se UTF-8 BOM v pamÄ›ti makefilu\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "neplatná syntaxe podmínky" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: zavedení selhalo" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "návod zahájen pÅ™ed prvním cílem" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "pÅ™ed návodem chybí pravidlo" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (mysleli jste tabulátor místo 8 mezer?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "chybí oddÄ›lovaÄ%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "chybí vzor cíle" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "více vzorů cíle" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "vzor cíle neobsahuje „%%“" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "chybí „endif“" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "prázdný název promÄ›nné" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "nadbyteÄný text po klíÄovém slovu „define“" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "chybí „endef“, neukonÄený „define“" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "nadbyteÄný text po klíÄovém slovu „endef“" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "nadbyteÄný text po klíÄovém slovu „%s“" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "nadbyteÄný „%s“" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "pouze jeden „else“ na podmínku" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "ChybÄ› utvoÅ™ená definice promÄ›nné specifické pro cíl" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "prerekvizitu nelze definovat v návodu" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "smíšené implicitní a statická pravidla vzorů" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "smíšené implicitní a normální pravidla" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "cíl „%s“ neodpovídá vzoru cíle" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "cílový soubor „%s“ obsahuje jak :, tak i ::" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "cíl „%s“ zadán více než jednou ve stejném pravidle" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "pozor: návod pro cíl „%s“ bude pÅ™ebit" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "pozor: starý návod pro cíl „%s“ bude ignorován" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "smíšené implicitní a normální pravidla" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "pozor: zaznamenán znak NUL, zbytek řádku bude ignorován" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Pro „%s“ nebude nic udÄ›láno." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "„%s“ je aktuální." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Uklízí se soubor „%s“.\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sŽádné pravidlo jak vyrobit cíl „%s“ potÅ™ebný pro „%s“%s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sŽádné pravidlo jak vyrobit cíl „%s“%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Zvažuje se cílový soubor „%s“.\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Nedávná aktualizace souboru „%s“ selhala.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Soubor „%s“ již byl uvážen.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Stále se aktualizuje soubor „%s“.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Aktualizace soubor „%s“ dokonÄena.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Soubor „%s“ neexistuje.\n" + +#: remake.c:495 +#, 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í" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Nalezeno implicitní pravidlo pro „%s“.\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Pro „%s“ nenalezeno žádné implicitní pravidlo.\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Pro „%s“ se použije výchozí návod.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Kruhová závislost „%s ↠%s zahozena." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Prerekvizity cílového souboru „%s“ dokonÄeny.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Prerekvizity „%s“ se vyrábÄ›jí.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Výroba cílového souboru „%s“ vzdána.\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Cíl „%s“ nebyl kvůli chybám znovu vyroben." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Prerekvizita „%s“ pro cíl „%s“ je jen o poÅ™adí.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Prerekvizita „%s“ cíle „%s“ neexistuje.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Prerekvizita „%s“ je novÄ›jší než cíl „%s“.\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Prerekvizita „%s“ je starší než cíl „%s“.\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Cíl „%s“ je dvojdvouteÄkový a nemá žádnou prerekvizitu.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "Pro „%s“ neexistuje návod a žádná prerekvizita se vskutku nezmÄ›nila.\n" + +# Always-make flag is make option -B +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Vyrábí se „%s“ kvůli pÅ™epínaÄi --always-make.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Cíl „%s“ není tÅ™eba znovu vyrábÄ›t" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; použije se název „%s“ z VPATH" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Cíl „%s“ je tÅ™eba znovu vyrobit.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ignoruje se název „%s“ z VPATH.\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "PrávÄ› se vykonává návod pro „%s“.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Cílový soubor „%s“ nebylo možné znovu vyrobit.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Cílový soubor „%s“ byl úspěšnÄ› znovu vyroben.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Cílový soubor „%s“ je tÅ™eba znovu vyrobit za použití -q.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Pro „%s„ se použijí se výchozí příkazy.\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Pozor: Soubor „%s“ má Äas zmÄ›ny obsahu v budoucnu" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Pozor: Soubor „%s“ má Äas zmÄ›ny obsahu %s s smÄ›rem do budoucnosti" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "Prvek .LIBPATTERNS „%s“ není vzorem" + +# `Customs' is literal (a library name). See README.customs. +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs nebude exportovat: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Implicitní pravidla" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Žádná implicitní pravidla." + +# FIXME: Pluralize by first %u +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# Implicitních pravidel: %u, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminál." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "CHYBA: num_pattern_rules je chybný! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "neznámý signál" + +# Keep signal names in sync with GNU libc translations. +#: signame.c:92 +msgid "Hangup" +msgstr "Odpojen terminál (SIGHUP)" + +#: signame.c:95 +msgid "Interrupt" +msgstr "PÅ™eruÅ¡ení (SIGINT)" + +#: signame.c:98 +msgid "Quit" +msgstr "Konec (SIGQUIT)" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Nedovolená instrukce (SIGILL)" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Trasovací/ladící past (SIGTRAP)" + +#: signame.c:109 +msgid "Aborted" +msgstr "NeúspěšnÄ› ukonÄen (SIGABRT)" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT past (SIGIOT)" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT past (SIGEMT)" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Výjimka práce s pohyblivou řádovou Äárkou (SIGFPE)" + +#: signame.c:121 +msgid "Killed" +msgstr "Zabit (SIGKILL)" + +#: signame.c:124 +msgid "Bus error" +msgstr "Chyba na sbÄ›rnici (neplatná adresa) (SIGBUS)" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "NeoprávnÄ›ný přístup do pamÄ›ti (SIGSEGV)" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Chybné volání systému (SIGSYS)" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Roura pÅ™eruÅ¡ena (SIGPIPE)" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Budík (SIGALRM)" + +#: signame.c:139 +msgid "Terminated" +msgstr "UkonÄen (SIGTERM)" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Uživatelem definovaný signál 1 (SIGUSR1)" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Uživatelem definovaný signál 2 (SIGUSR2)" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Potomek skonÄil (SIGCHLD)" + +#: signame.c:156 +msgid "Power failure" +msgstr "Výpadek napájení (SIGPWR)" + +#: signame.c:159 +msgid "Stopped" +msgstr "Pozastaven (SIGTSTP)" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Pozastaven (vstup TTY) (SIGTTIN)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Pozastaven (výstup TTY) (SIGTTOU)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Pozastaven (SIGSTOP)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "PÅ™ekroÄen Äasový limit pro procesor (SIGXCPU)" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "PÅ™ekroÄen limit délky souboru (SIGXFS2)" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtuální ÄasovaÄ vyprÅ¡el (SIGVTALRM)" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Profilovací ÄasovaÄ vyprÅ¡el (SIGPROF)" + +#: signame.c:186 +msgid "Window changed" +msgstr "Okno se zmÄ›nilo (SIGWINCH)" + +#: signame.c:189 +msgid "Continued" +msgstr "Je pokraÄováno (SIGCONT)" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Naléhavá I/O situace (SIGURG)" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "Vstup/Výstup možný (SIGIO)" + +# SIGWIND exists on Darwin +#: signame.c:202 +msgid "SIGWIND" +msgstr "Okno se zmÄ›nilo (SIGWIND)" + +# SIGPHONE exists on Unix PC (3B1) +#: signame.c:205 +msgid "SIGPHONE" +msgstr "ZmÄ›na stavu linky (SIGPHONE)" + +#: signame.c:211 +msgid "Resource lost" +msgstr "ProstÅ™edek byl ztracen (SIGLOST)" + +# SIGDANGER exists on AIX +#: signame.c:214 +msgid "Danger signal" +msgstr "NebezpeÄí nedostatku pamÄ›ti (SIGDANGER)" + +#: signame.c:217 +msgid "Information request" +msgstr "Žádost o informaci (SIGINFO)" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Koprocesor pro práci s pohyblivou řádkou není dostupný (SIGNOFP)" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Žádná keÅ¡ Å™etÄ›zců\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s souÄasná keÅ¡: velikost = %hu B / užito = %hu B / poÄet = %hu / prům. = " +"%hu B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s užito dalších: celkem = %lu B / poÄet = %lu / prům. = %lu B\n" + +#: strcache.c:283 +#, 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" + +#: strcache.c:287 +#, 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" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# Statistika haÅ¡ovací tabulky:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automatická" + +#: variable.c:1602 +msgid "default" +msgstr "výchozí" + +#: variable.c:1605 +msgid "environment" +msgstr "prostÅ™edí" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "prostÅ™edí z pÅ™epínaÄe -e" + +#: variable.c:1614 +msgid "command line" +msgstr "příkazový řádek" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "klíÄové slovo „override“" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (z „%s“, řádek %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# statistika haÅ¡ovací tabulky pro množinu promÄ›nných:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# PromÄ›nné\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Hodnoty promÄ›nných specifických pro vzor" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Žádné hodnoty promÄ›nných specifických pro vzor." + +# FIXME: Pluralize +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# Hodnot promÄ›nných specifických pro vzor: %u" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "pozor: nedefinovaná promÄ›nná „%.*s“" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "volání sys$search() selhalo s %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Pozor: Prázdné pÅ™esmÄ›rování\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "vnitÅ™ní chyba: command_state pro „%s“" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-pozor, možná byste mÄ›li znovu povolit obsluhu CTRL-Y z DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "VESTAVÄšNà [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "VESTAVÄšNà CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "VESTAVÄšNà CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Neznámý vestavÄ›ný příkaz „%s“\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Chyba, prázdný příkaz\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Vstup pÅ™esmÄ›rován z %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Chyby pÅ™esmÄ›rovány do %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Výstup pÅ™ipojen k %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Výstup pÅ™esmÄ›rován do %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "PÅ™ipojit %.*s a uklidit\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Místo toho se spustí %s\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Chyba oddÄ›lení podprocesu, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Vyhledávací cesty VPATH\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Žádné vyhledávací cesty „vpath“." + +# FIXME: Pluralize +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"$ Vyhledávacích cest „vpath“: %u\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Žádná obecná vyhledávací cesta (promÄ›nná „VPATH“)." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Obecná vyhledávací cesta (promÄ›nná „VPATH“):\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/po/da.gmo b/po/da.gmo new file mode 100644 index 0000000..02fa310 Binary files /dev/null and b/po/da.gmo differ diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..8640291 --- /dev/null +++ b/po/da.po @@ -0,0 +1,2360 @@ +# Danish messages for make +# Copyright (C) 2001 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# +# Byrial Ole Jensen , 2001 +# Ask Hjorth Larsen , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.82\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2011-01-05 02:26+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" + +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "forsøg pÃ¥ at bruge en ikke understøttet facilitet: '%s'" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "'berør arkivmedlem' er ikke tilgængelig pÃ¥ VMS" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Arkivet '%s' findes ikke" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: '%s' er ikke et gyldigt arkiv" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Medlemmet '%s' findes ikke i '%s'" + +#: ar.c:164 +#, fuzzy, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: Forkert returkode fra ar_member_touch pÃ¥ '%s'" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module() kunne ikke udtrække modulinformation, status = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() fejlede med status = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "kan ikke Ã¥bne biblioteket '%s' for at søge medlemmet '%s'" + +#: arscan.c:944 +#, fuzzy, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Medlem '%s'%s: %ld byte ved %ld (/%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (navnet kan være forkortet)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Tidsstempel %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modus = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Afbrydelse.\n" + +#: commands.c:629 +#, fuzzy, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Arkivmedlemmet '%s' er mÃ¥ske falsk; ikke slettet" + +#: commands.c:633 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Arkivmedlemmet '%s' er mÃ¥ske falsk; ikke slettet" + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Sletter filen '%s'" + +#: commands.c:649 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Sletter filen '%s'" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# kommandoer der skal køres" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (indbyggede):" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (fra '%s', linje %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Filkataloger\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: kunne ikke undersøges med stat.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (nøgle %s, mtime %d): kunne ikke Ã¥bnes.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (enhed %d, inode [%d,%d,%d]): kunne ikke Ã¥bnes.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (enhed %ld, inode %ld): kunne ikke Ã¥bnes.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (nøgle %s, mtime %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (enhed %d, inode [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (enhed %ld, inode %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Ingen" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " filer, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "ingen" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " umuligheder" + +#: dir.c:1068 +msgid " so far." +msgstr " indtil videre." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " umuligheder i %lu kataloger.\n" + +#: expand.c:125 +#, fuzzy, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekursiv variabel '%s' refererer (i sidste ende) til sig selv" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "uafsluttet variabelreference" + +#: file.c:271 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Kommandoer blev angivet for filen '%s' i %s:%lu," + +#: file.c:276 +#, fuzzy, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Kommandoer for filen '%s' blev fundet ved implicit regelsøgning," + +#: file.c:280 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "men '%s' bliver nu anset som samme fil som '%s'." + +#: file.c:283 +#, fuzzy, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "Kommandoer for '%s' vil blive ignoreret til fordel for de for '%s'." + +#: file.c:303 +#, fuzzy, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "kan ikke ændre enkelt-kolon '%s' til dobbelt-kolon '%s'" + +#: file.c:309 +#, fuzzy, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "kan ikke ændre dobbelt-kolon '%s' til enkelt-kolon '%s'" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Sletter mellemfil '%s'" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Sletter mellemfiler ...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Aktuel tid" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tidsstempel i forkert omrÃ¥de; bruger %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Ikke et mÃ¥l:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Værdifuld fil (forudsætning for .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Falsk mÃ¥l (forudsætning for .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# KommandolinjemÃ¥l." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Et forvalg, MAKEFILES, eller -include/sinclude makefile." + +#: file.c:968 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# Ingen implicitte regler." + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Der er udført implicit regelsøgning." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Der er ikke udført implicit regelsøgning." + +#: file.c:973 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Implicit/statisk mønsterstamme: '%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Filen er en mellemfil." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Skaber ogsÃ¥:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Ændringstid ikke tjekket." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Filen findes ikke." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Filen er meget gammel." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Sidst ændret %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Filen er blevet opdateret." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Filen er ikke blevet opdateret." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Der køres kommandoer nu (DETTE ER EN FEJL)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Kommandoer for afhængigheder køres nu (DETTE ER EN FEJL)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Opdateret med godt resultat." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Behøver opdatering (-q er sat)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Opdatering mislykkedes." + +#: file.c:1025 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Ugyldig værdi i 'command_state'-felt!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Filer" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# Statistik for fil-hash-spande:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "ikke-numerisk første argument til 'word'-funktionen" + +#: function.c:785 +#, fuzzy +msgid "first argument to 'word' function must be greater than 0" +msgstr "første argument til 'word'-functionen skal være større end 0" + +#: function.c:805 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "ikke-numerisk første argument til 'wordlist'-funktionen" + +#: function.c:807 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "ikke-numerisk andet argument til 'wordlist'-funktionen" + +#: function.c:1499 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe(): DuplicateHandle(In) mislykkedes (e=%ld)\n" + +#: function.c:1523 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_open_pipe(): DuplicateHandle(Err) mislykkedes (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() mislykkedes (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() mislykkedes\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Afrydder midlertidig batchfil %s\n" + +#: function.c:2193 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: function.c:2203 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "skrivefejl: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "utilstrækkeligt antal argumenter (%d) til funktionen '%s'" + +#: function.c:2336 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "ikke implementeret pÃ¥ denne platform: funktion '%s'" + +#: function.c:2399 +#, fuzzy, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "uafsluttet kald til funktionen '%s'; manglende '%c'" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "utilstrækkeligt antal argumenter (%d) til funktionen '%s'" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "utilstrækkeligt antal argumenter (%d) til funktionen '%s'" + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: tilvalg '%s' er flertydigt\n" + +#: getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: tilvalg '--%s' tillader ikke et argument\n" + +#: getopt.c:688 +#, fuzzy, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: tilvalg '%c%s' tillader ikke et argument\n" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s tilvalg '%s' kræver et argument\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: ikke genkendt tilvalg '--%s'\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: ikke genkendt tilvalg '%c%s'\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ulovligt tilvalg -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ugyldigt tilvalg -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: tilvalg kræver et argument -- %c\n" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: tilvalg '-W %s' er flertydigt\n" + +#: getopt.c:862 +#, fuzzy, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: tilvalg '-W %s' tillader ikke et argument\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "kan ikke tildele %lu byte til hashtabel: hukommelsen opbrugt" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Fyldning=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Omgrupperinger=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Sammenstød=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Kigger efter en implicit regel for '%s'.\n" + +#: implicit.c:54 +#, fuzzy, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Kigger efter en implicit arkivmedlemsregel for '%s'.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "UndgÃ¥r rekursion i implicitte regler.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, fuzzy, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Prøver mønsterregel med stammen '%.*s'.\n" + +#: implicit.c:697 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Afviser umulig regelforudsætning '%s'.\n" + +#: implicit.c:698 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Afviser umulig implicit forudsætning '%s'.\n" + +#: implicit.c:711 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Prøver regelforudsætning '%s'.\n" + +#: implicit.c:712 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Prøver implicit forudsætning '%s'.\n" + +#: implicit.c:751 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Fandt forudsætning '%s' som VPATH '%s'\n" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Kigger efter en regel med mellemfil '%s'.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Kan ikke oprette midlertidig fil\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (core-fil efterladt)" + +#: job.c:488 +#, fuzzy +msgid " (ignored)" +msgstr "[%s] Fejl %d (ignoreret)" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (indbyggede):" + +#: job.c:503 +#, fuzzy, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "advarsel: tilsidesætter kommandoer for mÃ¥l '%s'" + +#: job.c:516 job.c:524 +#, fuzzy, c-format +msgid "%s[%s] Error %d%s" +msgstr "*** [%s] Fejl %d" + +#: job.c:519 +#, fuzzy, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "*** [%s] Fejl 0x%x" + +#: job.c:529 +#, fuzzy, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s%s: %s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Venter pÃ¥ uafsluttede job...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Levende underproces %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (eksternt)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Høster tabende underproces %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Høster vindende underproces %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Afrydder midlertidig jobfil %s\n" + +#: job.c:855 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Afrydder midlertidig jobfil %s\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Fjerner underproces %p PID %s%s fra kæde.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Frigav symbol for underproces %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "write jobserver" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() fejlede ved igangsætning af proces (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Talte %d argumenter i fejlet igangsætning\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Sætter underproces %p (%s) PID %s%s pÃ¥ kæden.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Fik symbol for underproces %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "read jobs pipe" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: Arkivet '%s' findes ikke" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%sIngen regel til at skabe mÃ¥l '%s' som behøves af '%s'%s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "kan ikke gennemtvinge belastningsgrænser pÃ¥ dette styrestystem" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "kan ikke gennemtvinge belastningsgrænse: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "ikke flere filhÃ¥ndtag: Kunne ikke duplikere stdin\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "ikke flere filhÃ¥ndtag: Kunne ikke duplikere stdout\n" + +#: job.c:2278 +#, fuzzy +msgid "no more file handles: could not duplicate stderr\n" +msgstr "ikke flere filhÃ¥ndtag: Kunne ikke duplikere stdin\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Kunne ikke gendanne stdin\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Kunne ikke gendanne stdout\n" + +#: job.c:2309 +#, fuzzy +msgid "Could not restore stderr\n" +msgstr "Kunne ikke gendanne stdin\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make høstede underproces med pid %s, venter endnu pÃ¥ pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Kommando ikke fundet" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s; Skalprogram ikke fundet" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: miljøplads er mÃ¥ske opbrugt" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL ændret (var '%s', nu '%s')\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Opretter midlertidig jobfil %s\n" + +#: job.c:3206 +#, fuzzy +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Indhold af batchfil:%s\n" +"\t%s\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Indhold af batchfil:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (linje %d) Forkert skal-kontekst (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +#, fuzzy +msgid "The 'load' operation is not supported on this platform." +msgstr "Parallelle job (-j) er ikke understøttet pÃ¥ denne platform." + +#: main.c:313 +msgid "Options:\n" +msgstr "Tilvalg:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoreret af hensyn til kompabilitet.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Skab alle mÃ¥l betingelsesløst.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Udskriv en masse fejlsøgningsinformation.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAG] Udskriv forskellige slags " +"fejlsøgningsinformation.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Miljøvariable har forrang for makefiler.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=STRENG Evaluér STRENG som en makefil-erklæring.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Udskriv denne besked og afslut.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignorér fejl fra kommandoer.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Fortsæt selvom nogen mÃ¥l ikke kan skabes.\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Udskriv makes interne database.\n" + +#: main.c:360 +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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules SlÃ¥ de indbyggede implicitte regler fra.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables SlÃ¥ de indbyggede variabelværdier fra.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Udskriv ikke kommandoer.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" SlÃ¥r -k fra.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Berør mÃ¥l i stedet for at genskabe dem.\n" + +#: main.c:373 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr "" +" -d Udskriv en masse fejlsøgningsinformation.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version Udskriv makes versionnummer og afslut.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Udskriv det aktuelle katalog.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Advar nÃ¥r en udefineret variabel bruges.\n" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "en tom streng er ugyldig som filnavn" + +#: main.c:737 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "ukendt fejlsøgningsniveau-specifikation '%s'" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Afbrydelse/undtagelse fanget (kode = 0x%lx, addr = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Adgangskrænkelse: skriveoperation pÃ¥ adresse 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Adgangskrænkelse: læseoperation pÃ¥ adresse 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() sætter default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell()-stisøgning sætter default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s er standset i 30 sekunder..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "udført sleep(30). Fortsætter.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +# fd = fildeskriptor +#: main.c:1530 +#, fuzzy, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Jobserverklient (fd'er %d,%d)\n" + +#: main.c:1534 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "intern fejl: ugyldig '--jobserver-fds'-streng '%s'" + +# fd = fildeskriptor +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Jobserverklient (fd'er %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "advarsel: tvunget -jN i undermake: slÃ¥r jobserver tilstand fra." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1570 +#, fuzzy +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"advarsel: jobserver ikke tilgængelig: bruger -j1. Tilføj '+' til " +"ophavsmakeregel." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefil fra standard-ind er angivet to gange." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (midlertidig fil)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (midlertidig fil)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Parallelle job (-j) er ikke understøttet pÃ¥ denne platform." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Sætter tilbage til enkelt job-tilstand (-j1)." + +# fd = fildeskriptor +#: main.c:1994 +#, fuzzy, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Jobserverklient (fd'er %d,%d)\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "oprettelse af jobledning" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "klargøring af jobserver-ledning" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Symbolske lænker understøttes ikke: Deaktiverer -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Opdaterer makefiler....\n" + +#: main.c:2158 +#, fuzzy, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Makefilen '%s' fÃ¥r mÃ¥ske make til at gÃ¥ i ring; genskaber den ikke.\n" + +#: main.c:2237 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Genskabelse af makefilen '%s' mislykkedes." + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "Inkluderet makefil '%s' blev ikke fundet." + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefil '%s' blev ikke fundet." + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Kunne ikke skifte tilbage til det originale katalog." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Udfører igen[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (midlertidig fil): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL indeholder mere end et mÃ¥l" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Ingen angivne mÃ¥l og ingen makefil fundet" + +#: main.c:2511 +msgid "No targets" +msgstr "Ingen mÃ¥l" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Opdaterer endemÃ¥l....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "advarsel: Fejl i urets tid opdaget. Din bygning kan være ukomplet." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Brug: %s [tilvalg] [mÃ¥l] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Dette program er bygget til %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Dette program er bygget til %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "Send fejlmeldinger (pÃ¥ engelsk) til .\n" + +#: main.c:2807 +#, fuzzy, 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" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "'-%c'-tilvalget kræver et positivt heltalligt argument" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sBygget til %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sBygget til %s (%s)\n" + +#: main.c:3282 +#, 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 +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Makedatabase, udskrevet %s" + +# %s giver dato og klokkeslæt +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Afsluttet makedatabase %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Ukendt fejl %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: bruger %lu (reelt %lu), gruppe %lu (reelt %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Indledende adgang" + +#: misc.c:622 +msgid "User access" +msgstr "Brugeradgang" + +#: misc.c:670 +msgid "Make access" +msgstr "Make-adgang" + +#: misc.c:704 +msgid "Child access" +msgstr "Barneadgang" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: GÃ¥r til et ukendt katalog\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Forlader et ukendt katalog\n" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: GÃ¥r til katalog '%s'\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Forlader katalog '%s'\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: GÃ¥r til et ukendt katalog\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Forlader et ukendt katalog\n" + +#: output.c:120 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: GÃ¥r til katalog '%s'\n" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Forlader katalog '%s'\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "skrivefejl: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Stop.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Læser makefiler...\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Læser makefil '%s'" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (ingen standard-endemÃ¥l)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (søgesti)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (ikke nødvendig)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ingen ~-udfoldning)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "ugyldig syntaks i betingelse" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "kommandoer begynder før første mÃ¥l" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "manglende regel før kommandoer" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (mente du TAB i stedet for 8 mellemrum?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "manglende adskiller%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "manglende mÃ¥lmønster" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "flere mÃ¥lmønstre" + +#: read.c:1276 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "mÃ¥lmønster indeholder ingen '%%'" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "manglende 'endif'" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "tomt variabelnavn" + +#: read.c:1471 +#, fuzzy +msgid "extraneous text after 'define' directive" +msgstr "overskydende tekst efter 'define'-direktiv" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "manglende 'endef', uafsluttet 'define'" + +#: read.c:1524 +#, fuzzy +msgid "extraneous text after 'endef' directive" +msgstr "overskydende tekst efter 'endef'-direktiv" + +#: read.c:1595 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "Overskydende tekst efter '%s'-direktiv" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "fremmed '%s'" + +#: read.c:1624 +#, fuzzy +msgid "only one 'else' per conditional" +msgstr "kun én 'else' per betingelse" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Misdannet mÃ¥lspecifik variabeldefinition" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "der kan ikke defineres forudsætninger i kommandoer" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "blandede implicitte og statiske mønsterregler" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "blandede implicitte og normale regler" + +#: read.c:2091 +#, fuzzy, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "mÃ¥l '%s' passer ikke til mÃ¥lmønstret" + +#: read.c:2106 read.c:2152 +#, fuzzy, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "mÃ¥lfil '%s' har bÃ¥de :- og ::-angivelser" + +#: read.c:2112 +#, fuzzy, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "target '%s' optræder mere end én gang i samme regel." + +#: read.c:2122 +#, fuzzy, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "advarsel: tilsidesætter kommandoer for mÃ¥l '%s'" + +#: read.c:2125 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "advarsel: ignorerer gamle kommandoer for mÃ¥l '%s'" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "blandede implicitte og normale regler" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "advarsel: NUL-tegn set; resten af linjen ignoreres" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "Ingenting at gøre for '%s'." + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "'%s' er tidssvarende." + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Beskærer fil '%s'.\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sIngen regel til at skabe mÃ¥l '%s' som behøves af '%s'%s" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sIngen regel til at skabe mÃ¥l '%s'%s" + +#: remake.c:426 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "Overvejer mÃ¥lfil '%s'.\n" + +#: remake.c:433 +#, fuzzy, 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" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "Fil '%s' er allerede overvejet.\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "Opdaterer stadig fil '%s'.\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Opdatering af fil '%s' afsluttet.\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "Filen '%s' findes ikke.\n" + +#: remake.c:495 +#, fuzzy, 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" + +#: remake.c:508 remake.c:1040 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Fandt en implicit regel for '%s'.\n" + +#: remake.c:510 remake.c:1042 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Ingen implicit regel for '%s' fundet.\n" + +#: remake.c:516 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Bruger standardkommandoer for '%s'.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Cirkulær %s <- %s afhængighed opgivet." + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Afsluttet forudsætningerne for mÃ¥lfil '%s'.\n" + +#: remake.c:681 +#, fuzzy, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Forudsætningerne for '%s' er ved at blive skabt.\n" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Opgiver mÃ¥lfil '%s'.\n" + +#: remake.c:700 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "MÃ¥let '%s' ikke genskabt pÃ¥ grund af fejl." + +#: remake.c:752 +#, fuzzy, 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" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Forudsætningen '%s' for mÃ¥let '%s' findes ikke.\n" + +#: remake.c:762 +#, fuzzy, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Forudsætningen '%s' er nyere end mÃ¥let '%s'.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Forudsætningen '%s' er ældre end mÃ¥let '%s'.\n" + +#: remake.c:783 +#, fuzzy, 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" + +#: remake.c:790 +#, fuzzy, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "Ingen kommandoer til '%s', og ingen forudsætninger har ændret sig.\n" + +#: remake.c:795 +#, fuzzy, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Skaber '%s' pga. \"always-make\"-flag.\n" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Ingen grund til at genskabe mÃ¥let '%s'" + +#: remake.c:805 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr "; bruger VPATH-navnet '%s'" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "Skal genskabe mÃ¥let '%s'.\n" + +#: remake.c:831 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ignorerer VPATH-navnet '%s'.\n" + +#: remake.c:840 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Kommandoerne for '%s' er ved at blive kørt.\n" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Genskabelse af mÃ¥lfil '%s' mislykkedes.\n" + +#: remake.c:850 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "MÃ¥lfil '%s' genskabt.\n" + +#: remake.c:853 +#, fuzzy, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Med -q trænger mÃ¥lfilen '%s' til at blive genskabt.\n" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Bruger standardkommandoer for '%s'.\n" + +#: remake.c:1397 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Advarsel: Ændringstiden for filen '%s' er i fremtiden" + +#: remake.c:1411 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Advarsel: Filen '%s' har ændringstidspunkt %s s i fremtiden" + +#: remake.c:1610 +#, fuzzy, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS-element '%s' er ikke et mønster" + +# "remote job exportation interface to the Customs daemon": jeg aner ikke +# hvad der er tale om. I øvrigt ser remote-cstms.c forældet/ubrugt ud, og +# koden er ikke understøttet af GNU... +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs kan ikke eksporteres: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Implicitte regler." + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Ingen implicitte regler." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u implicitte regler, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminale." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FEJL: forkert num_pattern_rules! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "ukendt signal" + +# De fleste af signalnavnene fra signame.c er kopieret fra libc.da.po, +# kun ganske enkelte findes ikke der. +#: signame.c:92 +msgid "Hangup" +msgstr "Læg pÃ¥" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Afbrudt" + +#: signame.c:98 +msgid "Quit" +msgstr "Afslut" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Ulovlig instruktion" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Sporings-/stoppunkts-fælde" + +#: signame.c:109 +msgid "Aborted" +msgstr "Afbrudt" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT_fælde" + +#: signame.c:115 +msgid "EMT trap" +msgstr "Emulatorfælde" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Undtagelsestilfælde ved flydendetals-operation" + +#: signame.c:121 +msgid "Killed" +msgstr "Dræbt" + +#: signame.c:124 +msgid "Bus error" +msgstr "Busfejl" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Lagersegmentfejl" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Ugyldigt systemkald" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Røret blev brudt" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Alarmen gik" + +#: signame.c:139 +msgid "Terminated" +msgstr "Termineret" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Brugerdefineret signal 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Brugerdefineret signal 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Barnet afsluttet" + +#: signame.c:156 +msgid "Power failure" +msgstr "Strømmen gik" + +#: signame.c:159 +msgid "Stopped" +msgstr "Stoppet" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Stoppet (ville læse fra tty)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Stoppet (ville skrive til tty)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Stoppet (signal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Begrænsning af CPU-tid overskredet" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Grænse for filstørrelse overskredet" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtuel tidsgrænse overskredet" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Profileringstiden udløb" + +#: signame.c:186 +msgid "Window changed" +msgstr "Vinduet blev ændret" + +#: signame.c:189 +msgid "Continued" +msgstr "Fortsættes" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Kritisk I/O-tilstand" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "I/O mulig" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Resurse tabt" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Faresignal" + +#: signame.c:217 +msgid "Information request" +msgstr "Informationsforespørgsel" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Flydendetalshjælpeprocessor ikke tilgængelig" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: strcache.c:266 +#, fuzzy, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" +"%s strcache brugt: total = %d (%d) / maks = %d / min = %d / gnmsn = %d\n" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, fuzzy, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" +"%s strcache brugt: total = %d (%d) / maks = %d / min = %d / gnmsn = %d\n" + +#: strcache.c:283 +#, fuzzy, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "%s strcache fri: total = %d (%d) / maks = %d / min = %d / gnmsn = %d\n" + +#: strcache.c:287 +#, fuzzy, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s # strenge i strcache: %d / opslag = %lu / fundne = %lu\n" + +#: strcache.c:289 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# Statistik for fil-hash-spande:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automatisk" + +#: variable.c:1602 +msgid "default" +msgstr "forvalgt" + +#: variable.c:1605 +msgid "environment" +msgstr "miljø" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefil" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "miljø med -e" + +#: variable.c:1614 +msgid "command line" +msgstr "kommandolinje" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "'override'-direktiv" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (fra '%s', linje %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# Statistik for variabelsæt-hash-spande:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabler\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Mønsterspecifikke variabelværdier" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Ingen mønsterspecifikke variabelværdier." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u mønsterspecifikke variabelværdier" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "advarsel: udefineret vaiabel '%.*s'" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() mislykkedes med %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Advarsel: Tom omdirigering\n" + +#: vmsjobs.c:183 +#, fuzzy, c-format +msgid "internal error: '%s' command_state" +msgstr "intern fejl: '%s' command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-advarsel, du kan blive nødt til at genetablere CTRL-Y-behandling fra DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Ukendt indbygget kommando '%s'\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Fejl, tom kommando\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Omdirigeret inddata from %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Omdirigeret fejl to %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Tilføj uddata til slutningen af %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Omdirigeret uddata til %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Tilføj %.*s og ryd op\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Udfører i stedet %s\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Fejl ved spawn, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-søgestier\n" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# Ingen 'vpath'-søgestier." + +#: vpath.c:602 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u 'vpath'-søgestier.\n" + +#: vpath.c:605 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Ingen generel ('VPATH'-variabel) søgesti." + +#: vpath.c:611 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Generel ('VPATH'-variabel) søgesti:\n" +"# " + +#~ 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 "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 "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 "BUILTIN RM %s\n" +#~ msgstr "BUILTIN RM %s\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/po/de.gmo b/po/de.gmo new file mode 100644 index 0000000..d3250e2 Binary files /dev/null and b/po/de.gmo differ diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..1e3b1b3 --- /dev/null +++ b/po/de.po @@ -0,0 +1,2470 @@ +# German message translation file for GNU make +# Copyright © 1996, 1997, 2002, 2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Philipp Thomas 2013 +# 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.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-10-11 12:22+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" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "Versuch, eine nicht unterstützte Funktionalität zu verwenden: „%s“" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "" +"VMS bietet keine Möglichkeit einer Änderung \n" +"der Zeitmarken von Archiveinträgen" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Archiv „%s“ existiert nicht" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: „%s“ ist kein gültiges Archiv" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Eintrag „%s“ existiert nicht in „%s“" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "" +"touch: Ungültiger Rückgabewert beim Zugriff \n" +"von ar_member_touch auf „%s“" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "„lbr$set_module()“ konnte keine Modulinformation auslesen; Status = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "„lbr$ini_control()“ scheiterte mit Status = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "" +"Konnte die Bibliothek „%s“ nicht öffnen um nach Eintrag\n" +"„%s“ zu suchen" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "" +"Eintrag „%s“ %s: \n" +"%ld Bytes an Position %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (der Name ist möglicherweise abgeschnitten)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " Nutzer-ID = %d, Gruppen-ID = %d, Modus = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Die Regel hat zu viele Zeilen (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Abbruch.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Archiveintrag „%s“ ist möglicherweise falsch; nicht gelöscht" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Archiveintrag „%s“ ist möglicherweise falsch; nicht gelöscht" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Datei „%s“ wird gelöscht" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Datei „%s“ wird gelöscht" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# Auszuführende Regel" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (eingebaut):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (aus „%s“, Zeile %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Verzeichnisse\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: Status konnte nicht festgestellt werden.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "" +"# %s ( Schlüssel (key) %s, letzte Änderung (mtime) %d): \n" +"Konnte nicht geöffnet werden.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" +"# %s (Gerät %d, Inode [%d,%d,%d]): \n" +"Konnte nicht geöffnet werden.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" +"# %s (Gerät %ld, Inode %ld): \n" +"Konnte nicht geöffnet werden.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (Schlüssel (key) %s, letzte Änderung (mtime) %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (Gerät %d, Inode [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (Gerät %ld, Inode %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Keine" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " Dateien, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "keine" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " Unmöglichkeiten" + +#: dir.c:1068 +msgid " so far." +msgstr " bisher." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " Unmöglichkeiten in %lu Verzeichnissen.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekursive Variable „%s“ referenziert sich (schließlich) selbst" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "Nicht abgeschlossene Variablenreferenz" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Die Regel für die Datei „%s“ wurde in %s angegeben:%lu," + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" +"Die Regel für die Datei „%s“ wurden aufgrund \n" +"der Suche nach impliziten Regeln gefunden," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "" +"aber „%s“ wird jetzt als dieselbe Datei \n" +"wie „%s“ betrachtet." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" +"Die Regel für „%s“ wird ignoriert, \n" +"die für „%s“ wird bevorzugt." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" +"„%s“ mit einfachem Doppelpunkt kann nicht in \n" +"„%s“ mit doppeltem Doppelpunkt geändert werden" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" +"„%s“ mit doppeltem Doppelpunkt kann nicht in \n" +"„%s“ mit einfachem Doppelpunkt geändert werden" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Löschen der übergangsweise angelegten Datei „%s“" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Die übergangsweise angelegte Datei „%s“ wird gelöscht...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Aktuelle Zeit" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Zeitstempel außerhalb des Gültigkeitsbereichs; %s wird ersetzt" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Dies ist kein Ziel:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Wertvolle Datei (benötigt von .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Vorgetäuschtes Ziel (benötigt von .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Kommandozeilen-Ziel (target)." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Eine standardmässige, MAKEFILES oder -include/sinclude Makedatei." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# Eingebaute Regel" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Die Suche nach impliziten Regeln wurde durchgeführt." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Die Suche nach impliziten Regeln wurde nicht durchgeführt." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Wurzel impliziter/statischer Muster: „%s“\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Datei ist ein Zwischenschritt in den Abhängigkeiten." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Erzeugt außerdem:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Zeit der letzten Änderung wurde nicht überprüft." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Die Datei existiert nicht." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Datei ist sehr alt." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Zuletzt geändert %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Datei wurde aktualisiert." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Datei wurde nicht aktualisiert." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Derzeit laufende Regel (DAS IST EIN FEHLER)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Derzeit läuft die Regel für Abhängigkeiten (DAS IST EIN FEHLER)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Erfolgreich aktualisiert." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Eine Aktualisierung ist notwendig (-q ist angegeben)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Aktualisierung ist fehlgeschlagen." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Ungültiger Wert im „command_state“-Strukturelement!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Dateien" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# Statistik der Hash-Tabelle für Dateien:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Feld „%s“ wird nicht zwischengespeichert: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "Nicht-numerisches erstes Argument für die „word“-Funktion" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "Das erste Argument für die „word“-Funktion muss größer als 0 sein" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "Nicht-numerisches erstes Argument für die „wordlist“-Funktion" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "Nicht-numerisches zweites Argument zur „wordlist“-Funktion" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "„windows32_openpipe“: „DuplicateHandle(In)“ schlug fehl (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "„cwindows32_openpipe“: „DuplicateHandle(Err)“ schlug fehl (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "„CreatePipe()“ schlug fehl (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() schlug fehl\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Die temporäre Stapelverarbeitungsdatei %s wird gelöscht\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "Öffnen: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "Schreiben: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "Unzulässige Dateioperation: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "Zuwenig Argumente (%d) für die Funktion „%s“" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "Auf dieser Rechnerkonfiguration nicht implementiert: Funktion „%s“" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "Nicht beendeter Aufruf der Funktion „%s“: „%c“ fehlt" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "Leere Funktionsname\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Unzulässiger Funktionsname: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Funktionsname is zu lang: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "Ungültige minimale Anzahl von Argumenten (%d) für die Funktion „%s“\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "Ungülte maximale Anzahl an Argumenten (%d) für die Funktion „%s“\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: Option „%s“ ist mehrdeutig\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: Option „--%s“ erlaubt kein Argument\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: Option „%c%s“ erlaubt kein Argument\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: Option „%s“ erfordert ein Argument\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: unbekannte Option „--%s“\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: unbekannte Option „%c%s“\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: unzulässige Option -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ungültige Option -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: Option erfordert ein Argument -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: Option „-W %s“ ist mehrdeutig\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: Option „-W %s“ erlaubt kein Argument\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Verarbeite „%s“\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: begutachte „%s“\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"es können keine %lu Bytes für die Hashtabelle reserviert werden: " +"Hauptspeicher erschöpft" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Auslastung=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Kollisionen=%ld/%ld%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Es wird nach einer impliziten Regel für „%s“ gesucht.\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "" +"Es wird nach einer impliziten Regel für Archiveinträge für „%s“ gesucht.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Rekursion in den impliziten Regeln wird vermieden.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Wurzel zu lang: „%.*s“.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Muster-Regel mit Wurzel „%.*s“ wird probiert.\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Unmögliche Voraussetzung „%s“ für eine Regel wird abgelehnt.\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Unmögliche implizite Voraussetzung „%s“ wird abgelehnt.\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Regel-Voraussetzung „%s“ wird auprobiert.\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Implizite Voraussetzung „%s“ wird ausprobiert.\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Die Voraussetzung „%s“ wurde als VPATH „%s“ gefunden\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "" +"Es wird nach einer Regel mit der übergangsweise verwendeten Datei „%s“ " +"gesucht.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Eine temporäre Datei kann nicht erzeugt werden\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (Speicherauszug erstellt)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (ignoriert)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: die Regel für Ziel „%s“ scheiterte" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Fehler %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Fehler 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Es wird auf noch nicht beendete Prozesse gewartet..." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Aktiver Kindprozess %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (entfernt)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Sammle erfolglosen Kindprozess %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Sammle erfolgreichen Kindprozess %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Lösche temporäre Stapelverarbeitungsdatei „%s“\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Löschen der temporären Stapelverarbeitungsdatei „%s“ scheiterte (%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Entferne Kindprozess %p PID %s%s aus der Kette.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "Freigabe der Jobserver-Semaphore: (Fehler %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Token des Kindprozesses %p PID (%s) freigegeben.\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "Job-Server wird geschrieben" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "„process_easy()“ konnte den Prozess nicht starten (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"%d Argumente gehörten zum fehlgeschlagenen Prozessstart\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Nehme Kindprozess %p (%s) PID %s%s in die Kette auf.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "warten auf Semaphore oder Kindprozess: (Fehler %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Token für den Kindprozess %p (%s) erhalten.\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "Lese Pipe für die Jobs" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: Archiv „%s“ existiert nicht" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: Ziel „%s“ wird aktualisiert wegen: %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "" +"Auf diesem Betriebssystem kann die Einhaltung\n" +"der Lastbeschränkung nicht erzwungen werden" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "Lasteinschränkung kann nicht erzwungen werden: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"Keine weiteren Dateireferenzen verfügbar: die Standardeingabe konnte\n" +"nicht dupliziert werden\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"Keine weiteren Dateireferenzen verfügbar: die Standardausgabe konnte\n" +"nicht dupliziert werden\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" +"Keine weiteren Dateireferenzen verfügbar: Standardfehler konnte\n" +"nicht dupliziert werden\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Die Standardeingabe konnte nicht wieder hergestellt werden\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Die Standardausgabe konnte nicht wieder hergestellt werden\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Standardfehler konnte nicht wieder hergestellt werden\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"„make“ registrierte die Beendigung des Kindprozesses mit ID %s,\n" +"wartet jedoch noch auf den Prozess mit ID %s.\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Kommando nicht gefunden" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Shell-Programm wurde nicht gefunden" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: der Platz in der Programmumgebung könnte erschöpft sein" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL gewechselt (war „%s“, ist jetzt „%s“)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Temporäre Stapelverarbeitungsdatei %s wird erstellt\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Inhalt der Stapelverarbeitungsdatei:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Inhalt der Stapelverarbeitungsdatei:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (Zeile %d) Falscher Shell-Kontext (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" +"-O[TYPE] (--output-sync[=TYPE]) ist für diese Bau-Aufgabe nicht konfiguriert." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Die globale Symboltabelle konnte nicht geöffnet werden: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Ds geladede Objekt %s wurde nicht als GPL-kompatibel deklariert" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Symbol %s konnte nicht aus %s geladen werden: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Zu ladedender Symbolname ist leer: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Symbol %s wird aus %s geladen\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "Die Operation „load“ wird auf dieser Plattform nicht unterstützt." + +#: main.c:313 +msgid "Options:\n" +msgstr "Optionen:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m Wird aus Kompatibilitätsgründen ignoriert\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Alle Ziele ohne Bedingungen erstellen\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Viele Informationen zur Fehlersuche ausgeben.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=KENNUNGEN] Verschiedene Arten von Debug-Information " +"ausgeben\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Umgebungsvariablen überschreiben „make“-" +"Steuerdateien\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=ZEIENKETTE ZEICHENKETTE wie einen Makedatei-Eintrag " +"auswerten.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Diese Meldung ausgeben und beenden\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Fehler in Regeln werden irgnoriert\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Weiterlaufen, auch wenn einige Targets nicht\n" +" erzeugt werden konnten\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +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" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Die interne Datenbank von „make“ ausgeben\n" + +#: main.c:360 +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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Die eingebauten impliziten Regeln " +"deaktivieren.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Die eingebauten Variablenbelegungen " +"deaktivieren.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Regeln nicht ausgeben.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" -k abschalten.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Die Ziele werden nur als aktualisiert " +"markiert,\n" +" nicht tatsächlich erneuert\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr "" +" --trace Viele Informationen zur Fehlersuche ausgeben\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Die Versionsnummer von „make“ ausgeben und " +"Programm beenden\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Das aktuelle Verzeichnis ausgeben\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "Eine leere Zeichenkette ist als Dateiname ungültig" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "Unbekannte Debug-Level angegeben „%s“" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "unbekannter Typ von Ausgabesynchronisierung „%s“" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s: bekam Unterbrechung/Ausnahme signalisiert (Kode = 0x%lx, Adr = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Zugriffsverletzung: Schreiboperation an Adresse 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Zugriffsverletzung: Leseoperation an Adresse 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell setzt default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell Suche im Pfad setzte default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s setzt für 30 Sekunden aus..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "„sleep(30)“ ist abgeschlossen. Es geht weiter.\n" + +#: main.c:1527 +#, 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)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Jobserver-Klient (Semaphore %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "Interner Fehler: Falsche --jobserver-fds Angabe „%s“" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Jobserver-Klient (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"Warnung: -jN in „make“-Verarbeitungszweig erzwungen: \n" +"Jobserver-Modus nicht verfügbar." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "Jobserver verdoppelt" + +#: main.c:1570 +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." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Das Makefile wurde zweimal über die Standardeingabe angegeben." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (temporäre Datei)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (temporäre Datei)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "" +"Parallele Abarbeitung (-j) \n" +"wird auf dieser Plattform nicht unterstützt." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Umstellung auf Einzel-Job-Verarbeitung (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Zeitschlitze der Jobservers auf %d begranzt\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "Jobserver-Semaphore wird erzeugt: (Fehler %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "Öffnen der Pipe für die Jobs" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "Initialisierung der Pipe für den Jobserver" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "" +"Symbolische Verknfungen werdfen nicht unterstützt: -L wird abgeschaltet." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Aktualisiere „make“-Steuerdateien...\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "" +"„make“-Steuerdatei „%s“ könnte eine Schleife enthalten; \n" +"es wird nicht neu erzeugt.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Konnte die „make“-Steuerdatei „%s“ nicht neu erstellen." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Die eingebundene „make“-Steuerdatei „%s“ wurde nicht gefunden." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Die „make“-Steuerdatei „%s“ wurde nicht gefunden" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Konnte nicht in das ursprüngliche Verzeichnis wechseln." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Erneute Ausführung[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (temporäre Datei): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL beinhaltet mehr als ein Ziel" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden" + +#: main.c:2511 +msgid "No targets" +msgstr "Keine Ziele" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Aktualisieren der Ziele...\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"Warnung: Mit der Uhr stimmt etwas nicht. \n" +" Der Bauauftrag könnte unvollständig sein." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Aufruf: %s [Optionen] [Ziele] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Diese Programm wurde für %s gebaut\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Diese Programm wurde für %s (%s) gebaut\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "Fehlermeldungen (auf Englisch) an senden.\n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "Die Option „%s%s“ verlangt eine nicht-leere Zeichenkette als Argument" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "Die Option „-%c“ verlangt eine positive ganze Zahl als Argument" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sGebaut für %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sGebaut für %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# „Make“-Datenbank; erstellt am: %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# „Make“-Datenbank beendet am: %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Unbekannter Fehler %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: Nutzer %lu (tatsächlich %lu), Gruppe %lu (tatsächlich %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Initialisierter Zugriff" + +#: misc.c:622 +msgid "User access" +msgstr "Zugriff durch Benutzer" + +#: misc.c:670 +msgid "Make access" +msgstr "Zugriff durch „make“" + +#: misc.c:704 +msgid "Child access" +msgstr "Kindprozess" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: ein unbekanntes Verzeichnis wird betreten\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: ein unbekanntes Verzeichnis wird verlassen\n" + +# !!! Attention: concatenated with the previous messages!!! +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Verzeichnis „%s“ wird betreten\n" + +# !!! Attention: concatenated with the previous messages!!! +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Verzeichnis „%s“ wird verlassen\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Ein unbekanntes Verzeichnis wird betreten\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Ein unbekanntes Verzeichnis wird verlassen\n" + +# !!! Attention: concatenated with the previous messages!!! +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Verzeichnis „%s“ wird betreten\n" + +# !!! Attention: concatenated with the previous messages!!! +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Verzeichnis „%s“ wird verlassen\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "Schreibfehler: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Schluss.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "„make“-Steuerdateien werden gelesen...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "„make“-Steuerdatei „%s“ wird gelesen" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (kein Standard-Ziel)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (Suchpfad)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (macht nichts)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (keine ~-Auflösung)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "UTF-8 BOM in makefile „%s“ wird übersprungen\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "UTF-8 BOM im makefile-Puffer wird übersprungen\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "Ungültige Syntax in der Bedingung" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: konnte nicht geladen werden" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "Rezept beginnt vor dem ersten Ziel" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "Es fehlt eine Regel vor der Regel" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (Meinten Sie TAB anstelle von 8 Leerzeichen?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "Fehlende Trennung%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "Es fehlt ein Ziel-Muster" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "Mehrfache Ziel-Muster" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "Ziel-Muster enthält kein „%%“" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "Fehlendes „endif“" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "Leerer Variablenname" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "Ãœberflüssiger Text nach einer „define“-Anweisung" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "Fehlendes „endef“, nicht abgeschlossenes „define“" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "Ãœberflüssiger Text nach einer „endef“-Anweisung" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "Ãœberflüssiger Text nach einer „%s“-Anweisung" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "Ãœberflüssiges „%s“" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "Es ist nur ein „else“ pro Bedingung erlaubt" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Falsche Ziel-bezogene Variablendefinition" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "Voraussetzungen können nicht in Regeln definiert werden" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "Implizite und statische Muster-Regeln wurden vermischt" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "Implizite und normale Regeln wurden vermischt" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "Target „%s“ passt nicht zum Ziel-Muster" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "Das Ziel „%s“ enthält sowohl „:“- als auch „::“-Einträge" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "Das Ziel „%s“ steht mehrfach in derselben Regel." + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "Warnung: Die Befehle für das Ziel „%s“ werden überschrieben" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "Warnung: Alte Befehle für das Ziel „%s“ werden ignoriert" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "Implizite und normale Regeln wurden vermischt" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "Warnung: NULL-Zeichen gelesen; der Rest der Zeile wird ignoriert" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Für das Ziel „%s“ ist nichts zu tun." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "„%s“ ist bereits aktuell." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Die Datei „%s“ wird \"gestutzt\" (der Abhängigkeitsgraph).\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "" +"%sKeine Regel vorhanden, um das Ziel „%s“, \n" +" benötigt von „%s“, zu erstellen%s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sKeine Regel, um „%s“ zu erstellen%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Betrachte Ziel-Datei „%s“.\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "" +"Es wurde kürzlich versucht, die Datei „%s“ zu aktualisieren,\n" +"dies schlug aber fehl.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Die Datei „%s“ wurde bereits betrachtet.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Die Datei „%s“ wird immer noch aktualisiert.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Aktualisierung der Datei „%s“ beendet.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Die Datei „%s“ existiert nicht.\n" + +#: remake.c:495 +#, 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" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Eine implizite Regel für „%s“ wurde gefunden.\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Keine implizite Regel für „%s“ gefunden.\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Die Standard-Regel für „%s“ wird verwendet.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Zirkuläre Abhängigkeit %s <- %s wird nicht verwendet." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Fertig mit den Voraussetzungen für die Ziel-Datei „%s“.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Die Voraussetzungen von „%s“ werden fertiggestellt.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Die Arbeit an der Target-Datei „%s“ wurde aufgegeben.\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Das Ziel „%s“ wurde wegen Fehlern nicht aktualisiert." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Die Datei „%s“ ist älter als das davon abhängige Ziel „%s“.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "" +"Die Datei „%s“, Voraussetzung für das Ziel „%s“, \n" +"existiert nicht.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Die Datei „%s“ ist jünger als das davon abhängige Ziel „%s“.\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Die Datei „%s“ ist älter als das davon abhängige Ziel „%s“.\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" +"Das Ziel „%s“ hat einen doppelten Doppelpunkt \n" +"und keine Voraussetzungen.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" +"Kein Kommando für „%s“ und keine Voraussetzung \n" +"wurde tatsächlich verändert.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "„%s“ wird aufgrund der Keinnzeichnung als always-make erzeugt.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Es ist nicht notwendig, das Ziel „%s“ neu zu erzeugen" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; benutze VPATH-Name „%s“" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Das Target „%s“ muss neu erzeugt werden.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Der VPATH-Name „%s“ wird ignoriert.\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Die Regel für „%s“ wird gerade ausgeführt.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Fehler beim Aktualisieren der Ziel-Datei „%s“.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Die Zieldatei „%s“ wurde erfolgreich aktualisiert.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Zieldatei „%s“ muss bei -q aktualisiert werden.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Die Standard-Kommandos für „%s“ werden verwendet.\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Warnung: Datei „%s“ hat zukünftige Änderungszeit" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Warnung: Datei „%s“ hat hat in der Zukunft liegende Änderungszeit %s" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS Element „%s“ ist kein Muster" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs wird nicht exportieren: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Implizite Regeln" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Keine impliziten Regeln vorhanden." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u implizite Regeln, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " Terminal." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: „num_pattern_rules“ falsch! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "Unbekanntes Signal" + +#: signame.c:92 +msgid "Hangup" +msgstr "Aufgelegt" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Abgebrochen (Interrupt)" + +#: signame.c:98 +msgid "Quit" +msgstr "Quit" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Illegaler Befehl" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Verfolgen/anhalten abfangen (Trace/breakpoint trap)" + +#: signame.c:109 +msgid "Aborted" +msgstr "Abgebrochen (Aborted)" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT abfangen (IOT trap)" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT abfangen (EMT trap)" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Gleitkommafehler" + +#: signame.c:121 +msgid "Killed" +msgstr "Abgebrochen (Killed)" + +#: signame.c:124 +msgid "Bus error" +msgstr "Bus-Fehler" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Adressierungsdefekt" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Falscher Systemaufruf" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Zerstörte Pipe" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Wecksignal" + +#: signame.c:139 +msgid "Terminated" +msgstr "Abgebrochen (Terminated)" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Nutzersignal 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Nutzersignal 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Kindprozess beendet" + +#: signame.c:156 +msgid "Power failure" +msgstr "Stromausfall" + +#: signame.c:159 +msgid "Stopped" +msgstr "Angehalten" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Angehalten (tty input)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Angehalten (tty output)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Angehalten (signal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU-Zeitschranke überschritten" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Dateigrößenschranke überschritten" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtueller Timer erloschen" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Profiling Timer erloschen" + +#: signame.c:186 +msgid "Window changed" +msgstr "Fenster hat sich verändert" + +#: signame.c:189 +msgid "Continued" +msgstr "Fortgesetzt" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Dringende I/O-Bedingung" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "I/O möglich" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Ressource verloren gegangen" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Gefahrensignal" + +#: signame.c:217 +msgid "Information request" +msgstr "Informationsanforderung" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Es ist kein Koprozessor für Fließkommaoperationen vorhanden" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Keine Puffer für strcache\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s aktueller Puffer: Größe = %hu B / benutzt = %hu B / Anzahl = %hu / ø = " +"%hu B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s andere verwendete: Summe = %lu B / Anzahl = %lu / /ø = %lu B\n" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" +"%s andere freie: Summe = %lu B / Max = %lu B / Min = %lu B / ø = %hu B\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s Leistung von strcache: Suchen = %lu / Trefferrate = %lu%%\n" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# Statistik für Hashtabelle:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automatisch" + +#: variable.c:1602 +msgid "default" +msgstr "Standard" + +#: variable.c:1605 +msgid "environment" +msgstr "Umgebung" + +#: variable.c:1608 +msgid "makefile" +msgstr "Makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "Umgebung per -e" + +#: variable.c:1614 +msgid "command line" +msgstr "Kommandozeile" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "„override“-Anweisung" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (aus „%s“, Zeile %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "" +"# Hashtabellen-Statistik für Variablen:\n" +"\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variablen\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Musterspezifische Variablenwerte" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Keine musterspezifischen Variablenwerte." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u musterspezifische Variablenwerte" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "Warnung: undefinierte Variable „%.*s“" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "„sys$search“ schlug mit %d fehl\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Warnung: Umleitung ins Leere!\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "Interner Fehler: „%s“ command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-Warnung: Vielleicht müssen Sie STRG-Y aus DCL wieder ermöglichen.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Unbekanntes eingebautes Kommando „%s“\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Fehler: Leere Anweisung\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Datei %s auf Standardeingabe umgeleitet\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Fehlerausgabe nach %s umgeleitet\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Ausgabe nach %s umgeleitet\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Ausgabe nach %s umgeleitet\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "%.*s anhängen und aufräumen\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s wird stattdessen ausgeführt\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Fehler %d beim Starten eines Kindprozesses\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-Suchpfade\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Keine „vpath“-Suchpfade." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u „vpath“-Suchpfade.\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Kein allgemeiner Suchpfad (Variable „VPATH“)." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Allgemeiner Suchpfad (Variable „VPATH“):\n" +"# " + +#~ 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 "virtual memory exhausted" +#~ msgstr "Der virtuelle Speicher ist verbraucht" + +#~ msgid "write error" +#~ msgstr "Schreibfehler" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BUILTIN RM %s\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/po/en@boldquot.header b/po/en@boldquot.header new file mode 100644 index 0000000..fedb6a0 --- /dev/null +++ b/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/po/en@quot.header b/po/en@quot.header new file mode 100644 index 0000000..a9647fc --- /dev/null +++ b/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/po/es.gmo b/po/es.gmo new file mode 100644 index 0000000..b671030 Binary files /dev/null and b/po/es.gmo differ diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..904e1d3 --- /dev/null +++ b/po/es.po @@ -0,0 +1,2787 @@ +# Mensajes en español para GNU make. +# Copyright (C) 1996, 2001, 2011, 2013 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 +# +msgid "" +msgstr "" +"Project-Id-Version: GNU make 4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-12-08 23:28+0200\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" + +#: 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. +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "El programa para hacer un 'touch' no está disponible en VMS" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: El archivo '%s' no existe" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: '%s' no es un archivo válido" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: El miembro '%s' no existe en '%s'" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: Código de retorno erróneo de ar_member_touch en '%s'" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"fallo en lbr$set_module() para extraer la información del módulo, estado = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "fallo en lbr$ini_control() con estado = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "Error al abrir la biblioteca '%s' para buscar al elemento '%s'" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Miembro '%s'%s: %ld bytes en %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (el nombre puede estar truncado)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Fecha %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modo = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Las instrucciones tienen demasiadas líneas (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Interrumpir.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "" +"*** [%s] El miembro de archivo '%s' podría estar incorrecto; aunque no se " +"elimina" + +#: commands.c:633 +#, 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 +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Se borra el archivo '%s'" + +# Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv +# Ok. mm +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Se borra el archivo '%s'" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# las instrucciones para ejecutar" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (integrado):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (de '%s', linea %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directorios\n" + +#: dir.c:1001 +#, 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 +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (llave %s, mtime %d): no se pudo abrir.\n" + +# En el K & R aparece inode traducido como nodo-i. ¿qué te parece? sv +# Bien. Me gusta con el guioncito. mm +#: dir.c:1009 +#, 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 +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (dispositivo %ld, nodo-i %ld): no se pudo abrir.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (llave %s, mtime %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (dispositivo %d, nodo-i [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (dispositivo %ld, nodo-i %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "No" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " archivos, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "no" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " imposibilidades" + +# ¿"So far" no era "hasta ahora"? (no me hagas mucho caso) sv +# Si tu traducción es mejor. Aceptada. mm +#: dir.c:1068 +msgid " so far." +msgstr " hasta ahora." + +#: dir.c:1085 +#, 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 +#: 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. +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "la referencia a la variable está sin terminar" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Se especificaron instrucciones para el archivo '%s' en %s:%lu," + +# Buscando en las legras implícitas em+ +# Utilicé por búsqueda en para evitar el gerundio. mm +#: file.c:276 +#, 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 +#: file.c:280 +#, 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 +#: file.c:283 +#, 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 +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "no se puede cambiar un punto (.) '%s' por dos puntos (:) '%s'" + +# Lo mismo. sv +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "no se pueden cambiar dos puntos (:) '%s' por un punto (.) '%s'" + +# Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv +# Ok. mm +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Se borra el archivo intermedio '%s'" + +# Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv +# Ok. mm +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "*** Se borran los archivos intermedios...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Hora actual" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Fecha fuera de intervalo; sustituyéndola %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# No es un objetivo:" + +# Pondría: es una dependencia de em+ +# Si, tienes razón. mm +#: file.c:960 +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 +#: file.c:962 +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 +#: file.c:964 +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 +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Por omisión, MAKEFILES, o -include/sinclude makefile." + +#: file.c:968 +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 +#: file.c:970 +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 +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# La búsqueda de reglas implícitas ha sido efectuada." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Tema del patrón implícita/estática: '%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# El archivo es una dependencia intermedia." + +# Sugerencia: "crea". sv +# Ok. Aunque, viendolo bien, que tal "hace"? mm. +#: file.c:979 +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 +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# La fecha de modificación no se comprobó." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# El archivo no existe." + +#: file.c:989 +msgid "# File is very old." +msgstr "# El archivo es muy viejo." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Última modificación %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# El archivo ha sido actualizado." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# El archivo ha sido actualizado." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Las instrucciones continúan en ejecución (ESTO ES UN BUG)." + +# ¿No sería más bien "las instrucciones de las dependencias"? sv +# Si, que babas soy. Ahora corrijo. mm +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" +"# Las instrucciones de las dependencias continúan en ejecución (ESTO ES UN " +"BUG)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Actualizado con éxito." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Necesita ser actualizado (la opción -q está activa)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Fallo al ser actualizado." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# ¡Valor inválido en el miembro 'command_state'!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Archivos" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# estadísticas de la tabla «hash» de los archivos:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: El campo '%s' no está en «cache»: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "el primer argumento de la función 'word' no es numérico" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "el primer argumento de la función 'word' debe ser mayor que 0" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "el primer argumento de la función 'wordlist' no es numérico" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "el segundo argumento de la función 'wordlist' no es numérico" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: fallo en DuplicateHandle(In), (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: fallo en DuplicateHandle(Err), (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "Fallo en CreatePipe(), (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): fallo en process_init_fd()\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Limpiando el archivo temporal %s\n" + +#: function.c:2193 +#, 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. +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "escribir: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "Operación de archivo no válida: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "Número de argumentos (%d) insuficientes para la función '%s'" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "No implementado en esta plataforma: función '%s'" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "la llamada a la función '%s' no concluyó: falta '%c'" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "Nombre de función vacío\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Nombre de función no válido: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Nombre de función demasiado largo: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "Número insuficiente de argumentos (%d) para la función %s\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "El número máximo de argumentos (%d) no es válido para la función %s\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: la opción '%s' es ambigua\n" + +# No admite ningún argumento. sv +# Ok. Y vuelve la burra al trigo. mm +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: la opción '--%s' no admite ningún argumento\n" + +# Lo mismo. sv +# Ok. mm +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: la opción '%c%s' no admite ningún argumento\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: la opción '%s' requiere un argumento\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: opción no reconocida '--%s'\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: opción no reconocida '%c%s'\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción inválida -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción inválida -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: la opción requiere un argumento -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: la opción '-W %s' es ambigua\n" + +# No admite ningún argumento. sv +# Ok. Y vuelve la burra al trigo. mm +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: la opción '-W %s' no admite ningún argumento\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expandiendo '%s'\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Evaluando '%s'\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "no se pueden reservar %lu bytes para la tabla «hash»: memoria agotada" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Carga=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Colisiones=%ld/%ld=%.0f%%" + +# Y no sería mejor "Buscando una regla implícita ..." +# Ten en cuenta que este mensaje no parece un mensaje de error, sino más +# de "debug" o de "verbose". sv +# Cierto. mm +#: implicit.c:38 +#, 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 +#: 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 +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitando la recursión en la regla implícita.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Tema demasiado largo: '%.*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 +#: implicit.c:491 +#, 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 +#: implicit.c:697 +#, 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 +#: implicit.c:698 +#, 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 +#: implicit.c:711 +#, 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 +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Probando la dependencia implícita '%s'.\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Se encontró la dependencia '%s' como la VPATH '%s'.\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Se busca una regla con el archivo intermedio '%s'.\n" + +#: job.c:361 +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 +#: job.c:483 +msgid " (core dumped)" +msgstr " (core dumped) [Núcleo vaciado a un archivo]" + +# Preferiría mil veces "sin efecto" o algo parecido. sv +# Ok. Habíamos quedado en `no tiene efecto'. mm +#: job.c:488 +msgid " (ignored)" +msgstr " (no tiene efecto)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +# 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 +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: fallo en las instrucciones para el objetivo '%s'" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Error %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Error 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +# ¿Y job -> trabajos? sv +# Si, pero no hablas de una computadora multi-trabajos sino multi-tareas. +# Por eso elegí tareas. Lo platicamos con más calma? mm +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Se espera a que terminen otras tareas...." + +# ¿De verdad se dice "vivo"? Si es un proceso, se me ocurre "activo". sv +# Me gusta lo de activo. mm +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Hijo activo %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (remoto)" + +# Lo mismo, pon Proceso hijo, y quita lo que hay +# entre paréntesis em+ +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Se recupera al proceso hijo perdido %p PID %s %s\n" + +# Lo mismo, pon Proceso hijo, y quita lo que hay +# entre paréntesis em+ +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Se recupera al proceso hijo ganador %p PID %s %s\n" + +# Give up no es enfocar, es abandonar, o desistir em+ +# Si, metí la pata. mm +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Se limpia el archivo temporal %s\n" + +# Give up no es enfocar, es abandonar, o desistir em+ +# Si, metí la pata. mm +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Fallo al limpiar el archivo temporal por lotes %s (%d)\n" + +# Proceso hijo em+ +# Ok. +#: job.c:961 +#, 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" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "liberar semáforo del servidor de tareas: (Error %ld: %s)" + +# Lo mismo, pon Proceso hijo, y quita lo que hay +# entre paréntesis em+ +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Se libera el token para el proceso hijo %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "escribir en el servidor de tareas" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "fallo en process_easy() para lanzar al proceso (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, 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. +#: job.c:1735 +#, 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" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "semáforo o proceso hijo en espera: (Error %ld: %s)" + +# Lo mismo, pon Proceso hijo, y quita lo que hay +# entre paréntesis em+ +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Se obtiene el token para el proceso hijo %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "tubería de trabajos leídos" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: el objetivo '%s' no existe" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: actualizar el objetivo '%s' a causa de: %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "no se pueden forzar los límites de carga en este sistema operativo" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "no se puede forzar la carga límite: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "no hay más manejadores de archivos: no se puede duplicar stdin\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "no hay más manejadores de archivos: no se puede duplicar stdout\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "no hay más manejadores de archivos: no se puede duplicar stderr\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "No se puede restaurar stdin\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "No se puede restaurar stdout\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "No se puede restaurar stderr\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "hacer un hijo descarriado %s, aún se espera por el pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: No se encontró el programa" + +# ¿Y "el programa Shell"? (a secas) sv +# Si. Suena mucho mejor. mm +# Suena, pero no es mejor. Tal y como esta escrito, incluso +# yo pensaria que me falta un programa en mi sistema que se +# llame shell. No se ha encontrado el 'shell'em+ +# Es bueno contar con una segunda opinión ... mm +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: No se ha encontrado el `shell'" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: el espacio ambiental podría estar agotado" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL ha cambiado (era '%s' y ahora es '%s')\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Se crea el archivo temporal %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Contenido del archivo de lotes:%s\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Contenido del archivo de lotes:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (linea %d) Contexto de shell erróneo (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "-O[TIPO] (--output-sync[=TIPO]) no está configurado para este «build»." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Fallo al abrir tabla global de símbolos: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" +"El objeto %s que se ha cargado no está declarado como compatible con GPL" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Fallo al cargar símbolo %s desde %s: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Nombre de símbolo vacío en la carga: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Cargando símbolo %s desde %s\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "La operación 'load' no está implementada en esta plataforma." + +#: main.c:313 +msgid "Options:\n" +msgstr "Opciones:\n" + +# Lo mismo de arriba con "ignorar". sv +# Ok. mm. +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m No se tendrá en cuenta por compatibilidad.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Hace incondicionalmente todos los objetivos.\n" + +#: main.c:318 +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 +#: main.c:321 +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 +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=BANDERAS] Se imprimirán varios tipos de información de " +"depurado.\n" + +#: main.c:325 +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" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=CADENA Evalúla la CADENA como una instrucción de un " +"makefile.\n" + +#: main.c:330 +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" + +#: main.c:333 +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+ +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors No se toman en cuenta los errores provenientes " +"de las instrucciones.\n" + +#: main.c:337 +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 +#: main.c:340 +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 +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Sigue avanzando aún cuando no se puedan crear " +"algunos objetivos.\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +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 +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Se imprime la base de datos interna de " +"'make'.\n" + +#: main.c:360 +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 +#: main.c:362 +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 +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Se deshabilitan los ajustes a las variables " +"almacenadas internamente.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet No muestra las intrucciones.\n" + +#: main.c:368 +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 +#: main.c:371 +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 +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace Muestra trazas.\n" + +# Me comería el "Se" inicial. "Muestra la versión..." sv +# Ok. mm +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Muestra la versión del make y finaliza.\n" + +# Lo mismo. sv +#: main.c:377 +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 +#: main.c:379 +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" + +#: main.c:381 +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. +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "no se permite que una cadena vacía sea el nombre de un archivo" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "se especificó un nivel de depuración desconocido '%s'" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "tipo de sincronización de salida desconocido '%s'" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s: Se atrapó una interrupción/excepción (código = 0x%lx, dirección = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Violación de acceso: operación de escritura en la dirección 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Violación de acceso: operación de lectura en la dirección 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "la función find_and_set_shell() pone el valor del default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"la función find_and_set_shell() pone el valor de la ruta de búsceda " +"default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s está suspendida por 30 segundos..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "se hizo un sleep(30). Continuando.\n" + +#: main.c:1527 +#, 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)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Cliente del servidor de tareas (semáforo %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "error interno: cadena --jobserver-fds inválida '%s'" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Cliente del servidor de tareas (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"atención: se fuerza a -jN en el submake: se deshabilita el modo de servidor " +"de tareas." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "servidor de tareas duplicado" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"atención: el servidor de tareas no está disponible: se utilizará -j1. Añada " +"'+' a la regla padre del make." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "" +"El archivo Makefile ha sido especificado dos veces desde la entrada estándard" + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (archivo temporal)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (archivo temporal)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "" +"Los trabajos en paralelo (-j) no están implementados en esta plataforma." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Reajustando al modo monotarea (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Ranuras del servidor de tareas limitads a %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "creando semáforo del servidor de tareas: (Error %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "creando una tubería de tareas" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "se inicializa la tubería al servidor de tareas" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Los enlaces simbólicos no están implementados: se deshabilitan con -L." + +# Antes pusiste "makefiles". Coherencia. sv +# Cierto. mm +#: main.c:2133 +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. +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "" +"El makefile '%s' podría entrar en bucle; por lo tanto, no se reconstruye.\n" + +# Lo mismo. sv +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Fallo al reconstruir el makefile '%s'." + +# Lo mismo. sv +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "No se encontró el makefile incluído '%s'." + +# Lo mismo. sv +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "No se encontró el makefile '%s'" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "No se pudo regresar al directorio original." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Re-ejecutando[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (archivo temporal)" + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL contien más de un objetivo" + +# Sugerencia: "No se especificó ningún objetivo ... " sv +# Ok. Me gusta. mm +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "No se especificó ningún objetivo y no se encontró ningún makefile" + +#: main.c:2511 +msgid "No targets" +msgstr "No hay objetivos" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Actualizando los objetivos finales....\n" + +#: main.c:2541 +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 +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Modo de empleo: %s [opciones] [objetivo] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Este programa fue construido para %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Este programa construido para %s (%s)\n" + +#: main.c:2721 +#, 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 +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "la opción '%s%s' requiere un argumento no-vacío de tipo cadena" + +# Me comería el "de" de "requiere de" sv +# Ok. mm +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "la opción '-%c' requiere un argumento positivo y entero" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sEste programa fue construido para %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sEste programa fue construido para %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, 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 +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Se termina la base de datos de Make en %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Error desconocido %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: usuario %lu (real %lu), grupo %lu (real %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Acceso inicializado" + +#: misc.c:622 +msgid "User access" +msgstr "Acceso del usuario" + +#: misc.c:670 +msgid "Make access" +msgstr "Acceso del Make" + +#: misc.c:704 +msgid "Child access" +msgstr "Acceso del hijo" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: se ingresa a un directorio desconocido\n" + +#: output.c:106 +#, 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. +#: output.c:109 +#, 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. +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: se sale del directorio '%s'\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: se ingresa a un directorio desconocido\n" + +#: output.c:117 +#, 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. +#: output.c:120 +#, 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. +#: output.c:122 +#, 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. +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "error al escribir: %s" + +# Interrumpido (?). sv +# Mmgmh... El mensaje indica que hubo algún error muy grave y que por +# eso se detiene el make. Probablemente sea mejor dejarlo así. mm +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Alto.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +# Sugerencia: eliminar la palabra "archivo". sv +# Ok. Mejora. mm +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Leyendo makefiles...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Leyendo makefile '%s'" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (no hay objetivo por defecto)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (ruta de búsqueda)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (no importa)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (no hay expansión del ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "se salta BOM UTF-8 en el makefile '%s'\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "se salta BOM UTF-8 en el «buffer» del makefile\n" + +# ## Sintaxis no llevaba tilde. +# Ok. mm +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "sintaxis no válida en condicional" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: fallo al cargar" + +#: read.c:992 +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 +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "falta una regla antes de las instrucciones" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (¿Quiere decir TAB en vez de 8 espacios?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "falta un separador%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "falta un patrón de objetivos" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "hay varios patrones de objetivos" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "el patrón de objetivo no contiene '%%'" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "falta un 'endif'" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "nombre de variable vacío" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "" +"Hay un texto irrelevante o mal colocado después de la instrucción 'define'" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "falta un 'endef', no se terminó un 'define'" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "" +"Hay un texto irrelevante o mal colocado después de la instrucción 'endef'" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "Texto irrelevante o mal colocado después de la instrucción '%s'" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "irrelevante o mal colocado '%s'" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "sólo se admite un 'else' por condicional" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "" +"La definición de las variables específicas al blanco está mal construida" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "" +"los prerequisitos no pueden ser definidos por los guiones de instrucciones" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "las reglas implícitas y las de patrón estático están mezcladas" + +# Y 'las' normales em+ +# Ok. mm +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "las reglas implícitas y las normales están mezcladas" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "el objetivo '%s' no coincide con el patrón de objetivos" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "el archivo de objetivos '%s' tiene líneas con : y ::" + +# Cambiaría given por 'proporcionó' o 'indicó' em+ +# Ok. mm +#: read.c:2112 +#, 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 +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "atención: se anulan las instrucciones para el objetivo '%s'" + +# Ojo con ignora. sv +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "atención: se ignoran las instrucciones viejas para el objetivo '%s'" + +# Y 'las' normales em+ +# Ok. mm +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "las reglas implícitas y las normales están mezcladas" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "atención: hay un carácter NUL; se ignora el resto de la línea" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "No se hace nada para '%s'." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "'%s' está actualizado." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Se poda el archivo '%s'.\n" + +#: remake.c:390 remake.c:393 +#, 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 +#: remake.c:402 remake.c:405 +#, 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 +#: remake.c:426 +#, 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 +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Se intentó hace poco, sin éxito, actualizar el archivo '%s'.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Ya se ha tenido en cuenta el archivo '%s'.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Se continúa actualizando el archivo '%s'.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Se terminó de actualizar el archivo '%s'.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "El archivo '%s' no existe.\n" + +#: remake.c:495 +#, 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" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Se encontró una regla implícita para '%s'.\n" + +# Se ha encontrado em+ +# Ok, pero procuro evitar como a la muerte los gerundios. mm +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "No se ha encontrado ninguna regla implícita para '%s'.\n" + +# Por defecto, como haces arriba em+ +# en efecto, mm +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Se utilizan las instrucciones por omisión para '%s'.\n" + +#: remake.c:550 remake.c:1089 +#, 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 +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Se terminaron las dependencias del archivo objetivo '%s'.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Se están construyendo las dependencias de '%s'.\n" + +# Give up no es enfocar, es abandonar, o desistir em+ +# Si, metí la pata. mm +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Se abandona el archivo objetivo '%s'.\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Debido a los errores, el objetivo '%s' no se reconstruyó." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "La dependencia '%s' es solo de orden para el objetivo '%s'.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "La dependencia '%s' del objetivo '%s' no existe.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "La dependencia '%s' es más reciente que el objetivo '%s'.\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "La dependencia '%s' es anterior al objetivo '%s'.\n" + +# Ahorra espacio, y pon '::' en vez de eso :) em+ +# Bueno, no es mala idea. A ver si te gusta lo que puse. mm +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" +"El objetivo '%s' es de tipo dos puntos dos veces (::)\n" +"y no tiene dependencias.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "No hay instrucciones para '%s' y ninguna dependencia ha cambiado.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Haciendo '%s' debido a la bandera always-make.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "No es necesario reconstruir el objetivo '%s'." + +#: remake.c:805 +#, 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 +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Se debe reconstruir el objetivo '%s'.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Se ignora el nombre del VPATH '%s'.\n" + +#: remake.c:840 +#, 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 +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Fallo al reconstruir el archivo objetivo '%s'.\n" + +# Lo mismo em+ +# Ok. mm +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Se reconstruyó con éxito el archivo objetivo '%s'.\n" + +# Otra vez em+ +# Ok, no te puedes quejar de falta de consistencia en este caso! mm +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Se necesita reconstruir el archivo objetivo '%s' con la opción -q.\n" + +# Por defecto, como haces arriba em+ +# en efecto, mm +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Se utilizan las instrucciones por defecto para '%s'.\n" + +# Ubicada :)) , que tal futura, a secas ? em+ +# Bueno, sonaba como StarTrek, muy chido, pero acepto tu sugerencia. mm +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Atención: El archivo '%s' tiene una hora de modificación en el futuro" + +# Ubicada :)) , que tal futura, a secas ? em+ +# Bueno, sonaba como StarTrek, muy chido, pero acepto tu sugerencia. mm +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "" +"Atención: El archivo '%s' tiene una hora de modificación %s s en el futuro" + +#: remake.c:1610 +#, 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 +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Los valores definidos por el usuario no se exportarán: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Reglas implícitas." + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# No hay reglas implícitas." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u reglas implícitas, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminal." + +# ## Añado ¡ con tu permiso. sv +# Gracias. mm +# ¿ qué tal erróneo ? em+ +# Si, suena mejor. mm +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: ¡num_pattern_rules erróneo! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "señal desconocida" + +#: 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 +#: signame.c:95 +msgid "Interrupt" +msgstr "Interrumpir" + +#: signame.c:98 +msgid "Quit" +msgstr "Finalizar" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Instrucción no válida" + +# Los trap los hemos dejado como traps, simplemente. em+ +# Ok. mm +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Trace/breakpoint trap" + +#: 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 +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT trap" + +# Otra em+ +# Ok. mm +#: 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 +#: 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 +#: signame.c:121 +msgid "Killed" +msgstr "Terminado (killed)" + +#: signame.c:124 +msgid "Bus error" +msgstr "Error en el bus" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Fallo de segmentación" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Llamada al sistema errónea" + +#: 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 +#: signame.c:136 +msgid "Alarm clock" +msgstr "Alarma del reloj" + +#: signame.c:139 +msgid "Terminated" +msgstr "Finalizado" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Señal 1 definida por el usuario" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Señal 2 definida por el usuario" + +# Proceso hijo terminado em+ +# Ok. mm +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Proceso hijo terminado" + +# Fallo. sv +# Alimentación eléctrico em+ +# Ok. mm +#: signame.c:156 +msgid "Power failure" +msgstr "Falla de alimentación eléctrica" + +#: 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 +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Detenido (se requiere entrada de terminal)" + +# lo mismo, se requiere entrada de terminal , em+ +# Ok. mm +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Detenido (se requiere salida de terminal)" + +# idem em+ +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Detenido (se requiere una señal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Se agotó el tiempo de CPU permitido" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Se excedió el tamaño máximo de archivo permitido" + +#: 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 +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "El contador de tiempo para la generación del perfil ha expirado" + +#: signame.c:186 +msgid "Window changed" +msgstr "La ventana ha cambiado" + +#: signame.c:189 +msgid "Continued" +msgstr "Continuado" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Condición urgente de I/O" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "Posible I/O" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Recurso perdido" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Señal de peligro" + +#: signame.c:217 +msgid "Information request" +msgstr "Petición de información" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Coprocesador de punto flotante no disponible" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s No hay «buffers» strcache\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s «buffer» actual: tamaño = %hu B / utilizado = %hu B / número = %hu / " +"promedio = %hu B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" +"%s otros utilizado: total = %lu B / / número = %lu / promedio = %lu B\n" + +#: strcache.c:283 +#, 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" + +#: strcache.c:287 +#, 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" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# estadísticas de la tabla «hash»:\n" +"# " + +# Lo he cmabiado em+ +# Ok. Deberíamos platicarlo con Ulrich. mm +#: variable.c:1599 +msgid "automatic" +msgstr "automática/o" + +#: variable.c:1602 +msgid "default" +msgstr "por defecto" + +#: variable.c:1605 +msgid "environment" +msgstr "entorno" + +# Sugerencia: No poner archivo. sv +# Ok. mm +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +# 'bajo -e' = 'con -e activo' em+ +# Ok. Esta inversión en los idiomas sajones se pega. mm +#: variable.c:1611 +msgid "environment under -e" +msgstr "con -e activo" + +# Línea de comandos me parece correcto em+ +# Ver arriba. Estoy de acuerdo si así han traducido en otros lados. mm +#: variable.c:1614 +msgid "command line" +msgstr "línea de instrucciones" + +# Creo que tendremos un problema con instrucción, comando +# , programa y directiva . Está claro que aquí es directiva em+ +# Ok, pero no deja de sonar a RoboCop. A ver que te parece como quedó. mm +#: variable.c:1617 +msgid "'override' directive" +msgstr "directiva 'override'" + +#: variable.c:1628 +#, 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 +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# estadísticas del conjunto de variables de la tabla «hash»:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variables\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valores de variables específicas al patrón" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# No hay valores de variables específicas al patrón." + +#: variable.c:1722 +#, 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 +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "atención: la variable '%.*s' no ha sido definida" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "fallo en sys$search() con %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Atención: redirección vacía\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "error interno: '%s' command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-atención, deberás rehabilitar el manejo del CTRL-Y desde el DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "INTERCONSTRUIDO [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "CD INTERCONSTRUIDO %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "CD INTERCONSTRUIDO %s\n" + +# Por defecto, como haces arriba em+ +# en efecto, mm +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Instrucción integrada desconocida '%s'.\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Error, comando vacío\n" + +#: vmsjobs.c:674 +#, c-format +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. +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Se redirecciona el error a %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Salida redirigida a %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Salida redirigida a %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Agregada a %.*s y limpieza\n" + +# "en sustituto" me suena muy raro. Propongo: "en su lugar" en su lugar :-) sv +# Ok. mm +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "En su lugar, se ejecuta %s\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Error al lanzar el proceso %d\n" + +# ¿Y al revés?: Rutas de búsqueda VPATH. sv +# Mejora +#: vpath.c:583 +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 +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# No hay rutas de búsqueda 'vpath'." + +# ¡Ah! Aquí si que pones el vpath al final, ¿eh? :-) sv +# You really got me! mm +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u rutas de búsqueda 'vpath'.\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# No hay ruta de búsqueda general (variable 'VPATH')." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Ruta de búsqueda general (variable 'VPATH'):\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/po/fi.gmo b/po/fi.gmo new file mode 100644 index 0000000..4967e23 Binary files /dev/null and b/po/fi.gmo differ diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..ab3df02 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,2312 @@ +# 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 3.81-b3\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2005-07-06 21:36+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" + +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "yritettiin käyttää ominaisuutta, jolle ei ole tukea: \"%s\"" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "arkistojäsenten kosketus ei ole mahdollista VMS:ssä" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Arkistoa \"%s\" ei ole olemassa" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: \"%s\" ei ole kelvollinen arkisto" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Arkistossa \"%1$s\" ei ole jäsentä \"%2$s\"" + +#: ar.c:164 +#, fuzzy, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: ar_member_touch antoi virheellisen paluuarvon kohteesta \"%s\"" + +#: arscan.c:124 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module epäonnistui moduulitietojen noutamisessa, tila = %d" + +#: arscan.c:230 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control epäonnistui, tila = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "kirjastoa \"%s\" ei voi avata jäsenen \"%s\" etsimiseksi" + +#: arscan.c:944 +#, fuzzy, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Jäsen \"%s\"%s: %ld tavua kohdassa %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (nimi voi olla typistynyt)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Päiväys %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, oikeudet = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Katkaisu.\n" + +#: commands.c:629 +#, fuzzy, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Arkistojäsen \"%s\" voi olla viallinen - ei poisteta" + +#: commands.c:633 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Arkistojäsen \"%s\" voi olla viallinen - ei poisteta" + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Poistetaan tiedosto \"%s\"" + +#: commands.c:649 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Poistetaan tiedosto \"%s\"" + +#: commands.c:685 +#, fuzzy +msgid "# recipe to execute" +msgstr "# käynnisetttävät komennot" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (sisäänrakennettu):" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (tiedostosta \"%s\", rivi %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Hakemistot\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: tilaa ei voitu lukea.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (avain %s, maika %d): ei voitu avata.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (laite %d, i-solmu [%d,%d,%d]): ei voitu avata.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (laite %ld, i-solmu %ld): ei voitu avata.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (avain %s, maika %d: " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (laite %d, i-solmu [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (laite %ld, i-solmu %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Ei" + +# Juuri näin, muodostetaan käännöslause yksittäisistä sanoista... +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " tiedostoa, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "ei" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " mahdottomuutta" + +#: dir.c:1068 +msgid " so far." +msgstr " tähän mennessä." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " mahdottomuutta %lu hakemistossa.\n" + +#: expand.c:125 +#, fuzzy, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekursiivinen muuttuja \"%s\" viittaa (lopulta) itseensä" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "päättämätön muuttujaviittaus" + +#: file.c:271 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Tiedostolle \"%s\" määriteltiin komentoja paikassa %s:%lu," + +#: file.c:276 +#, fuzzy, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Tiedostolle \"%s\" löytyi komentoja oletussääntöhaussa," + +#: file.c:280 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "mutta \"%s\":n katsotaan nyt olevan sama tiedosto kuin \"%s\"." + +#: file.c:283 +#, fuzzy, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" +"Tiedoston \"%s\" komentoja ei huomioida, vaan käytetään komentoja " +"tiedostosta \"%s\"." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Poistetaan aputiedosto \"%s\"" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Poistetaan aputiedostot...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Tämänhetkinen aika" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Aikaleima ei ole sallitulla välillä, korvataan %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Ei kohde:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Arvokas tiedosto (ennakkoehto .PRECIOUS:ille)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Valekohde (ennakkoehto .PHONY:lle)." + +#: file.c:964 +#, fuzzy +msgid "# Command line target." +msgstr "# Komentorivikohde." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Oletus-, MAKEFILES- tai -include/sinclude -makefile-tiedosto." + +#: file.c:968 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# Ei oletussääntöjä." + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Oletussääntöhaku on suoritettu." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Oletussääntöhakua ei ole suoritettu." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Tiedosto on välitason ennakkoehto." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Tuotetaan myös:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Muutosaikaa ei koskaan tarkastettu." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Tiedosto ei ole olemassa." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Tiedosto on hyvin vanha." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Viimeksi muutettu %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Tiedosto on päivitetty." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Tiedostoa ei ole päivitetty." + +#: file.c:1001 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Ajossa olevat komennot (TÄMÄ ON OHJELMISTOVIKA)." + +#: file.c:1004 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Ajossa olevat riippuvuuskomennot (TÄMÄ ON OHJELMISTOVIKA)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Päivitetty onnistuneesti." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Vaatii päivitystä (-q on asetettu)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Päivitys epäonnistui." + +#: file.c:1025 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Virheellinen arvo \"command_state\"-jäsenessä!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Tiedostot" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# tilasto tiedostojen hajautustaulusta:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "ei-numeerinen ensimmäinen argumentti \"word\"-funktiolle" + +#: function.c:785 +#, fuzzy +msgid "first argument to 'word' function must be greater than 0" +msgstr "\"word\"-funktion ensimmäisen argumentin on oltava suurempi kuin 0" + +#: function.c:805 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "ei-numeerinen ensimmäinen argumentti \"wordlist\"-funktiolle" + +#: function.c:807 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "ei-numeerinen toinen argumentti \"wordlist\"-funktiolle" + +#: function.c:1499 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) epäonnistui (v=%d)\n" + +#: function.c:1523 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) epäonnistui (v=%d)\n" + +#: function.c:1530 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() epäonnistui (v=%d)\n" + +#: function.c:1538 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() epäonnistui\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Siivotaan väliaikainen komentotiedosto %s\n" + +#: function.c:2193 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: function.c:2203 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "kirjoitusvirhe: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "Liian vähän (%d) argumenttejeja funktiolle \"%s\"" + +#: function.c:2336 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "Ei toteutettu tällä alustalla: funktio \"%s\"" + +#: function.c:2399 +#, fuzzy, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "päättämätön kutsu funktioon \"%s\": puuttuva \"%c\"" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "Liian vähän (%d) argumenttejeja funktiolle \"%s\"" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "Liian vähän (%d) argumenttejeja funktiolle \"%s\"" + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: valitsin \"%s\" on moniselitteinen\n" + +#: getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: valitsin \"--%s\" ei salli argumenttia\n" + +#: getopt.c:688 +#, fuzzy, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: valitsin \"%c%s\" ei salli argumenttia\n" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: valitsin \"%s\" vaatii argumentin\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: tunnistamaton valitsin \"--%s\"\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: tunnistamaton valitsin \"%c%s\"\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: virheellinen valitsin -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: virheellinen valitsin -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: valitsin vaatii argumentin -- %c\n" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: valitsin \"-W %s\" on moniselitteinen\n" + +#: getopt.c:862 +#, fuzzy, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: valitsin \"-W %s\" ei salli argumenttia\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "ei voida varata %ld tavua hajautustaululle: muisti lopussa" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Kuormitus=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Uudelleenhajautus=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Törmäykset=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Etsitään oletussääntöä kohteelle \"%s\".\n" + +#: implicit.c:54 +#, fuzzy, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Etsitään arkistojäsenen oletussääntöä kohteelle \"%s\".\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Vältetään oletussääntörekursio.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, fuzzy, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Kokeillaan hahmosääntöä rungolla \"%.*s\".\n" + +#: implicit.c:697 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Hylätään mahdoton säännön ennakkoehto \"%s\".\n" + +#: implicit.c:698 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Hylätään mahdoton oletusennakkoehto \"%s\".\n" + +#: implicit.c:711 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Yritetään käyttää säännön ennakkoehtoa \"%s\".\n" + +#: implicit.c:712 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Yritetään käyttää oletusennakkoehtoa \"%s\".\n" + +#: implicit.c:751 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Löydettiin ennakkoehto \"%s\", joka on VPATH \"%s\"\n" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Etsitään sääntöä aputiedostolla \"%s\".\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Väliaikaistiedoston luominen ei onnistu\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (muisti vedostettu)" + +#: job.c:488 +#, fuzzy +msgid " (ignored)" +msgstr "[%s] Virhe %d (ei huomioida)" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (sisäänrakennettu):" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "" + +#: job.c:516 job.c:524 +#, fuzzy, c-format +msgid "%s[%s] Error %d%s" +msgstr "*** [%s] Virhe %d" + +#: job.c:519 +#, fuzzy, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "*** [%s] Virhe 0x%x" + +#: job.c:529 +#, fuzzy, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s%s: %s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Odotetaan keskeneräisiä töitä...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (etä)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Siivotaan väliaikainen komentotiedosto %s\n" + +#: job.c:855 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Siivotaan väliaikainen komentotiedosto %s\n" + +#: job.c:961 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Poistetaan ketjusta lapsiprosessi 0x%08lx PID %ld%s.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: job.c:1036 +msgid "write jobserver" +msgstr "työpalvelimen kirjoitus" + +#: job.c:1662 job.c:2387 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() epäonnistui prosessin käynnistämisessä (v=%d)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Laskettiin %d argumenttia epäonnistuneessa käynnistyksessä\n" + +#: job.c:1735 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Lisätään ketjuun lapsiprosessi 0x%08lx (%s) PID %ld%s.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "työputken luku" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: Arkistoa \"%s\" ei ole olemassa" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "" +"%1$s\"%3$s\"-kohteen tarvitseman kohteen \"%2$s\" tuottamiseen ei ole sääntöä" +"%4$s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "kuormarajoja ei voi ottaa käyttöön tässä käyttöjärjestelmässä" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "kuormarajaa ei voi ottaa käyttöön: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"tiedostokahvoja ei ole enempää: vakiosyötteen kahdentaminen ei onnistunut\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"tiedostokahvoja ei ole enempää: vakiotulosteen kahdentaminen epäonnistui\n" + +#: job.c:2278 +#, fuzzy +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" +"tiedostokahvoja ei ole enempää: vakiosyötteen kahdentaminen ei onnistunut\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Vakiosyötettä ei voitu palauttaa\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Vakiotulostetta ei voitu palauttaa\n" + +#: job.c:2309 +#, fuzzy +msgid "Could not restore stderr\n" +msgstr "Vakiosyötettä ei voitu palauttaa\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Komentoa ei löytynyt" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Kuoriohjelmaa ei löytynyt" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: ympäristötila saattaa olla lopussa" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL muuttunut (oli \"%s\", nyt \"%s\")\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Luodaan väliaikainen komentotiedosto %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (rivi %d) Väärä kuoriympäristö (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +#, fuzzy +msgid "The 'load' operation is not supported on this platform." +msgstr "Rinnakkaiset työt (-j) eivät ole tuettuja tällä alustalla." + +#: main.c:313 +msgid "Options:\n" +msgstr "Valitsimet:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m Yhteensopivuuden vuoksi jätetään huomiotta.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Tuota kaikki kohteet ehdoitta.\n" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C HAKEMISTO, --directory=HAKEMISTO\n" +" Siirry HAKEMISTOon ennen jatkamista.\n" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Näytä runsaasti vianetsintätietoja.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr " --debug[=LIPUT] Näytä monenlaisia vianetsintätietoja.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Ympäristömuuttujat kumoavat makefile-" +"tiedostot.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Näytä tämä viesti ja poistu.\n" + +#: main.c:335 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Älä huomioi suoritettujen komentojen " +"virheitä.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Jatka vaikka joidenkin kohteiden tuottaminen\n" +" epäonnistuisi.\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +#, 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" + +#: main.c:352 +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" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Näytä make:in sisäinen tietokanta.\n" + +#: main.c:360 +#, 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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Poista käytöstä sisäiset oletussäännöt.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Poista käytöstä sisäiset muuttuja-asetukset.\n" + +#: main.c:366 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Älä kaiuta komentoja.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Kumoaa valitsimen -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " -t, --touch Kosketa kohteita tuottamisen sijaan.\n" + +#: main.c:373 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr " -d Näytä runsaasti vianetsintätietoja.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version Näytä make:in versionumero ja poistu.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Näytä nykyinen hakemisto.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "tyhjä merkkijono ei kelpaa tiedostonimeksi" + +#: main.c:737 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "tuntematon vianetsintätason määritys \"%s\"" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Keskeytys/poikkeus siepattu (koodi = 0x%x, osoite = 0x%x)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Suojausvirhe: kirjoitusoperaatio osoitteeseen %x\n" + +#: main.c:844 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Suojausvirhe: lukuoperaatio osoitteeseen %x\n" + +#: main.c:920 main.c:935 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell asettaa default_shell = %s\n" + +#: main.c:988 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell: polkuhaku asetti default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s keskeytyy 30 sekunniksi..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) valmis. Jatketaan.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: main.c:1534 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "sisäinen virhe: virheellinen --jobserver-fds -merkkijono \"%s\"" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "varoitus: -jN pakotettu ali-make:ssa: poistetaan työpalvelin käytöstä." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "kaksinkertainen työpalvelin" + +#: main.c:1570 +#, fuzzy +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"varoitus: työpalvelin ei käytettävissä: käytetään -j1. Lisää \"+\" ylemmän " +"tason make-sääntöön." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile-tiedosto vakiosyötteestä määritelty kahdesti." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (väliaikaistiedosto)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (väliaikaistiedosto)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Rinnakkaiset työt (-j) eivät ole tuettuja tällä alustalla." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Palataan yhden työn (-j1) tilaan." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "luodaan työputki" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "alustetaan työpalvelimen putki" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Ei tukea symbolisille linkeille: poistetaan -L käytöstä." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Päivitetään makefile-tiedostoja....\n" + +#: main.c:2158 +#, fuzzy, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "" +"Ei uudelleentuoteta makefile-tiedostoa \"%s\" - vältetään mahdollinen " +"ikuinen silmukka.\n" + +#: main.c:2237 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Makefile-tiedoston \"%s\" uudelleentuottaminen epäonnistui." + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "Sisällytettyä makefile-tiedostoa \"%s\" ei löytynyt." + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefile-tiedostoa \"%s\" ei löytynyt" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Ei voitu siirtyä takaisin alkuperäiseen hakemistoon." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Uudelleenkäynnistetään[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (väliaikaistiedosto): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL sisältää yli yhden kohteen" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Kohteita ei ole annettu, eikä makefileä löytynyt" + +#: main.c:2511 +msgid "No targets" +msgstr "Ei kohteita" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"varoitus: Havaittu väärä kellonaika. Käännösversio saattaa olla " +"epätäydellinen." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Käyttö: %s [valitsimet] [kohde] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Tämä ohjelma on käännetty järjestelmälle %s.\n" + +#: main.c:2718 +#, 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" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Ilmoita ohjelmistovioista (englanniksi) osoitteeseen .\n" + +#: main.c:2807 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "valitsin \"-%c\" vaatii ei-tyhjän merkkijonoargumentin" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "valitsin \"-%c\" vaatii positiivisen kokonaislukuargumentin" + +#: main.c:3269 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sTämä ohjelma on käännetty järjestelmälle %s.\n" + +#: main.c:3271 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sTämä ohjelma on käännetty järjestelmälle %s (%s).\n" + +#: main.c:3282 +#, 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 "" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make-tietokanta, tulostettu %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Make-tietokanta saatu valmiiksi %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Tuntematon virhe %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: käyttäjä %lu (todellinen %lu), ryhmä %lu (todellinen %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Alkuperäiset käyttöoikeudet" + +#: misc.c:622 +msgid "User access" +msgstr "Käyttäjän käyttöoikeudet" + +#: misc.c:670 +msgid "Make access" +msgstr "Make-prosessin käyttöoikeudet" + +#: misc.c:704 +msgid "Child access" +msgstr "Lapsiprosessin käyttöoikeudet" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Siirrytään tuntemattomaan hakemistoon\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Poistutaan tuntemattomasta hakemistosta\n" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Siirrytään hakemistoon \"%s\"\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Poistutaan hakemistosta \"%s\"\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Siirrytään tuntemattomaan hakemistoon\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Poistutaan tuntemattomasta hakemistosta\n" + +#: output.c:120 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Siirrytään hakemistoon \"%s\"\n" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Poistutaan hakemistosta \"%s\"\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "kirjoitusvirhe: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Seis.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Luetaan makefile-tiedostoja...\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Luetaan makefile-tiedosto \"%s\"" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr "" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (hakupolku)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (ei välitetä)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ei ~-laajennusta)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "virheellinen syntaksi ehtolauseessa" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +#, fuzzy +msgid "recipe commences before first target" +msgstr "komennot alkavat ennen ensimmäistä kohdetta" + +#: read.c:1041 +#, fuzzy +msgid "missing rule before recipe" +msgstr "puuttuva sääntö ennen komentoja" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (ehkä tarkoitit sarkainta eikä kahdeksaa välilyöntiä?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "puuttuva erotin%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "puuttuva kohdehahmo" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "useita kohdehahmoja" + +#: read.c:1276 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "kohdehahmo ei sisällä %%-merkkiä" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "puuttuva \"endif\"" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "tyhjä muuttujan nimi" + +#: read.c:1471 +#, fuzzy +msgid "extraneous text after 'define' directive" +msgstr "Ylimääräistä tekstiä \"endef\"-toimintaohjeen jälkeen" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "puuttuva \"endef\", päättämätön \"define\"" + +#: read.c:1524 +#, fuzzy +msgid "extraneous text after 'endef' directive" +msgstr "Ylimääräistä tekstiä \"endef\"-toimintaohjeen jälkeen" + +#: read.c:1595 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "Ylimääräistä tekstiä \"%s\"-toimintaohjeen jälkeen" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "ylimääräinen \"%s\"" + +#: read.c:1624 +#, fuzzy +msgid "only one 'else' per conditional" +msgstr "vain yksi \"else\" ehtolausetta kohden" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Väärin muotoiltu kohdekohtainen muuttujamäärittely" + +# skripti? +#: read.c:1957 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "ennakkoehtoja ei voi määritellä komentoskripteissä" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "" + +#: read.c:2091 +#, fuzzy, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "kohde \"%s\" ei täsmää kohdehahmon kanssa" + +#: read.c:2106 read.c:2152 +#, fuzzy, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "kohdetiedostolla \"%s\" on sekä :- että ::-merkinnät" + +#: read.c:2112 +#, fuzzy, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "kohde \"%s\" annettu yli yhden kerran samassa säännössä." + +#: read.c:2122 +#, fuzzy, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "varoitus: syrjäytetään kohteen \"%s\" komennot" + +#: read.c:2125 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "varoitus: ei huomioida vanhoja komentoja kohteelle \"%s\"" + +#: read.c:2229 +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "varoitus: havaittu NUL-merkki, rivin loppuosaa ei huomioida" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "Kohteelle \"%s\" ei tarvitse tehdä mitään." + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "\"%s\" on ajan tasalla." + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Karsitaan tiedosto \"%s\".\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "" +"%1$s\"%3$s\"-kohteen tarvitseman kohteen \"%2$s\" tuottamiseen ei ole sääntöä" +"%4$s" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sKohteen \"%s\" tuottamiseen ei ole sääntöä%s" + +#: remake.c:426 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "Tarkastellaan tiedostoa \"%s\".\n" + +#: remake.c:433 +#, fuzzy, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Tiedoston \"%s\" päivitysyritys epäonnistui äskettäin.\n" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "Tiedostoa \"%s\" on jo tarkasteltu.\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "Päivitetään edelleen tiedostoa \"%s\".\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Tiedosto \"%s\" päivitetty.\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "Tiedosto \"%s\" ei ole olemassa.\n" + +#: remake.c:495 +#, fuzzy, 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" + +#: remake.c:508 remake.c:1040 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Kohteelle \"%s\" löytyi oletussääntö.\n" + +#: remake.c:510 remake.c:1042 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Kohteelle \"%s\" ei löytynyt oletussääntöä.\n" + +#: remake.c:516 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Käytetään oletuskomentoja kohteelle \"%s\".\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Kehäriippuvuus %s <- %s hylätty." + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Kohdetiedoston \"%s\" ennakkoehdot täytetty.\n" + +#: remake.c:681 +#, fuzzy, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Kohteen \"%s\" ennakkoehtoja täytetään.\n" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Luovutaan kohdetiedostosta \"%s\".\n" + +#: remake.c:700 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Kohdetta \"%s\" ei tuotettu uudelleen virheiden vuoksi." + +#: remake.c:752 +#, fuzzy, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Ennakkoehto \"%s\" on vanhempi kuin kohde \"%s\".\n" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Kohteen \"%2$s\" ennakkoehto \"%1$s\" ei ole olemassa.\n" + +#: remake.c:762 +#, fuzzy, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Ennakkoehto \"%s\" on uudempi kuin kohde \"%s\".\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Ennakkoehto \"%s\" on vanhempi kuin kohde \"%s\".\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" + +#: remake.c:795 +#, fuzzy, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Tuotetaan \"%s\", koska --always-make -valitsin on käytössä.\n" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Ei tarvetta uudelleentuottaa kohdetta \"%s\"" + +#: remake.c:805 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr "; käytetään VPATH-nimeä \"%s\"" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "Kohde \"%s\" on tuotettava uudelleen.\n" + +#: remake.c:831 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ei huomioida VPATH-nimeä \"%s\".\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Kohdetiedoston \"%s\" uudelleentuottaminen epäonnistui.\n" + +#: remake.c:850 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Kohdetiedosto \"%s\" uudelleentuotettiin onnistuneesti.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Käytetään oletuskomentoja kohteelle \"%s\".\n" + +#: remake.c:1397 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Varoitus: Tiedoston \"%s\" muutosaika on tulevaisuudessa" + +#: remake.c:1411 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Varoitus: Tiedoston \"%s\" muutosaika on %.2g sekuntia tulevaisuudessa" + +#: remake.c:1610 +#, fuzzy, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS-elementti \"%s\" ei ole hahmo" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Oletussäännöt" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Ei oletussääntöjä." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u oletussääntöä, %u" + +#: rule.c:522 +msgid " terminal." +msgstr "" + +#: rule.c:530 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "VIKA: num_pattern_rules väärä! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "tuntematon signaali" + +#: signame.c:92 +msgid "Hangup" +msgstr "Linjankatkaisu" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Keskeytys" + +#: signame.c:98 +msgid "Quit" +msgstr "Lopetettu" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Virheellinen käsky" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Jäljitys/katkaisupisteansa" + +#: signame.c:109 +msgid "Aborted" +msgstr "Keskeytetty" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT-ansa" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT-ansa" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Liukulukupoikkeus" + +#: signame.c:121 +msgid "Killed" +msgstr "Tapettu" + +#: signame.c:124 +msgid "Bus error" +msgstr "Väylävirhe" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Muistialueen ylitys" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Virheellinen järjestelmäkutsu" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Katkennut putki" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Herätyskello" + +#: signame.c:139 +msgid "Terminated" +msgstr "Päätetty" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Käyttäjän määrittelemä signaali 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Käyttäjän määrittelemä signaali 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Lapsi lopetti" + +#: signame.c:156 +msgid "Power failure" +msgstr "Sähkökatko" + +#: signame.c:159 +msgid "Stopped" +msgstr "Pysäytetty" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Pysäytetty (päätteen syöte)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Pysäytetty (päätteen tuloste)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Pysäytetty (signaali)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Suoritinaikaraja ylittynyt" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Tiedoston kokoraja ylitetty" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtuaaliajastin vanhentunut" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Profilointiajastin vanhentunut" + +#: signame.c:186 +msgid "Window changed" +msgstr "Ikkuna vaihtunut" + +#: signame.c:189 +msgid "Continued" +msgstr "Jatkettu" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Kiireellinen I/O-tilanne" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "I/O mahdollista" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Resurssi menetetty" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Vaarasignaali" + +#: signame.c:217 +msgid "Information request" +msgstr "Tietopyyntö" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Käytettävissä ei ole liukulukusuoritinta" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: strcache.c:266 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: strcache.c:289 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# tilasto tiedostojen hajautustaulusta:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automaattinen" + +#: variable.c:1602 +msgid "default" +msgstr "oletus" + +#: variable.c:1605 +msgid "environment" +msgstr "ympäristö" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "-e:n alainen ympäristö" + +#: variable.c:1614 +msgid "command line" +msgstr "komentorivi" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "\"override\"-toimintaohje" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (tiedostosta \"%s\", rivi %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# muuttujajoukon hajautustaulutilastot:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Muuttujat\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Hahmokohtaisia muuttujien arvoja" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Ei hahmokohtaisia muuttuja-arvoja." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u hahmokohtaista muuttuja-arvoa" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "varoitus: määrittelemätön muuttuja \"%.*s\"" + +#: vmsfunctions.c:91 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search epäonnistui, arvo %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Varoitus: Tyhjä uudelleenohjaus\n" + +#: vmsjobs.c:183 +#, fuzzy, c-format +msgid "internal error: '%s' command_state" +msgstr "sisäinen virhe: \"%s\" command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-varoitus, Ctrl-Y-käsittely on ehkä otettava uudelleen käyttöön DCL:stä.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "SISÄÄNRAKENNETTU [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "SISÄÄNRAKENNETTU CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "SISÄÄNRAKENNETTU CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Tuntematon sisäänrakennettu komento \"%s\"\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Virhe, tyhjä komento\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Syöte uudelleenohjattu kohteesta %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Virhetuloste uudelleenohjattu kohteeseen %s\n" + +#: vmsjobs.c:690 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Tuloste uudelleenohjattu kohteeseen %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Tuloste uudelleenohjattu kohteeseen %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Käynnistetään sen sijaan %s\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Virhe käynnistyksessä, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-hakupolut\n" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# Ei \"vpath\"-hakupolkuja." + +#: vpath.c:602 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u \"vpath\"-hakupolkua.\n" + +#: vpath.c:605 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Ei yleistä (\"VPATH\"-muuttuja) hakupolkua." + +#: vpath.c:611 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Yleinen (\"VPATH\"-muuttuja) hakupolku:\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/po/fr.gmo b/po/fr.gmo new file mode 100644 index 0000000..095850c Binary files /dev/null and b/po/fr.gmo differ diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..287bb62 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,2602 @@ +# 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 +# Kevin Raymond , 2012, 2013 +# +msgid "" +msgstr "" +"Project-Id-Version: GNU make 4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-11-01 16:15+0100\n" +"Last-Translator: Kevin Raymond \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 1.5.4\n" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "tentative d'utiliser une fonctionnalité non prise en charge : « %s »" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "impossible de modifier la date d'un membre d'une archive sur VMS" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch : l'archive « %s » n'existe pas" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch : « %s » n'est pas une archive valide" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch : le membre « %s » n'existe pas dans « %s »" + +#: 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 »" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module() n'a pas pu extraire les infos du module. Code = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() a échoué avec un code = %d" + +#: arscan.c:255 +#, fuzzy, 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 membre « %s »" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Membre `%s'%s : %ld octets à %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (le nom peut être tronqué)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Date %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "La recette contient trop de lignes (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Break.\n" + +#: commands.c:629 +#, 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é" + +#: commands.c:633 +#, 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é" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Suppression du fichier « %s »" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Suppression du fichier « %s »" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# recette à exécuter" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (commande interne) :" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (de « %s », ligne %lu) : \n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Répertoires\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: « stat » impossible.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (clé %s, mtime %d) : ouverture impossible.\n" + +#: dir.c:1009 +#, 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" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (périphérique %ld, inode %ld) : ouverture impossible.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (périphérique %s, mtime %d) : " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (périphérique %d, inode [%d,%d,%d]) : " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (périphérique %ld, inode %ld) : " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Aucun" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " fichier(s), " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "aucune" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " impossibilité(s)" + +#: dir.c:1068 +msgid " so far." +msgstr " jusqu'ici." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilités dans %lu répertoires.\n" + +#: 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)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "référence incomplète à une variable" + +#: file.c:271 +#, 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," + +#: file.c:276 +#, 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," + +#: file.c:280 +#, 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 »." + +#: file.c:283 +#, 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 »." + +#: file.c:303 +#, 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 »" + +#: file.c:309 +#, 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 »" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Suppression du fichier intermédiaire « %s »" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Suppression des fichiers intermédiaires...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Heure actuelle" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s : horodatage hors limite ; remplacement par %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Pas une cible :" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Fichier précieux (dépendance de .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Cible factice (dépendance de .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Cible de la ligne de commande." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Une valeur par défaut, MAKEFILES ou -include/sinclude makefile." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# Pas de règle interne" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# La recherche de règle implicite a été effectuée." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# La recherche de règle implicite n'a pas été effectuée." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Préfixe de motif implicite ou statique : « %s »\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Le fichier est une dépendance intermédiaire." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Fabrique également :" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Heure de modification jamais vérifiée." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Le fichier n'existe pas." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Le fichier est très ancien." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Dernière modification %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Le fichier a été mis à jour." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Le fichier n'a pas été mis à jour." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Recette en cours d'exécution (CECI EST UNE ANOMALIE)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" +"# Recette de dépendances en cours d'exécution (CECI EST UNE ANOMALIE)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Mise à jour réussie." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# À besoin d'être mis à jour (l'option -q est activée)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# N'a pas pu être mis à jour." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Valeur non valable dans le membre « command_state » !" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Fichiers" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# stats des tables de hachage des fichiers :\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s : le champ « %s » n'est pas en cache : %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "le premier argument de la fonction « word » doit être numérique" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "le premier argument de la fonction « word » doit être supérieur à 0" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "le premier argument de la fonction « wordlist » doit être numérique" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "le deuxième argument de la fonction « wordlist » doit être numérique" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe : DuplicateHandle(In) a échoué (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe : DuplicateHandle(Err) a échoué (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() a échoué (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe() : process_init_fd() a échoué\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Nettoyage du fichier de commandes temporaire %s\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "open : %s : %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "write : %s : %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "Fichier d'opérations invalide : %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "nombre d'arguments insuffisant (%d) pour la fonction « %s »" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "non implémenté sur cette plateforme : fonction « %s »" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "appel à la fonction « %s » non terminé : « %c » manquant" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "Nom de fonction absent\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Nom de fonction invalide : %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Nom de fonction trop long : %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "nombre d'arguments insuffisant (%d) pour la fonction « %s »\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "nombre d'arguments insuffisant (%d) pour la fonction « %s »\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s : l'option « %s » est ambiguë\n" + +#: 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" + +#: 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" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s : l'option « %s » nécessite un argument\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s : option non reconnue « --%s »\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s : option non reconnue « %c%s »\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s : option non admise -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s : option incorrecte -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s : l'option nécessite un argument -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s : l'option « -W %s » est ambiguë\n" + +#: 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" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile : expansion de « %s »\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile : évaluation de « %s »\n" + +#: hash.c:49 +#, 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" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Charge=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Collisions=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Recherche d'une règle implicite pour « %s ».\n" + +#: 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" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Évitement de récursion dans une règle implicite.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Motif trop long : « %.*s ».\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Essai du motif avec « %.*s » comme radical.\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Rejet d'une dépendance de règle impossible « %s ».\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Rejet d'une dépendance implicite impossible « %s ».\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Essai de la dépendance de règle « %s ».\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Essai de la dépendance implicite « %s ».\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Dépendance trouvée « %s » comme VPATH « %s »\n" + +#: implicit.c:765 +#, 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" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Impossible de créer un fichier temporaire\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (core dump créé)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (ignorée)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s : la recette pour la cible « %s » a échouée" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Erreur %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Erreur 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Attente des tâches non terminées...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Processus fils actif %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (distant)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Récolte du processus fils perdant %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Récolte du processus fils gagnant %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Nettoyage du fichier de commande temporaire %s\n" + +#: job.c:855 +#, 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" + +#: job.c:961 +#, 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" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "libération de la sémaphore jobserver : erreur (%ld : %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Jeton relâché pour le processus fils %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "écriture vers le serveur de tâches" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() n'a pas pu lancer de processus (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"%d arguments comptés lors du lancement échoué\n" + +#: job.c:1735 +#, 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" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "attente de la sémaphore ou du processus fils : (erreur %ld : %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Jeton obtenu pour le processus fils %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "lecture du tube des processus" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s : la cible « %s » n'existe pas" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s : mise à jour de la cible « %s » nécessaire pour : %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "" +"impossible d'imposer des limites de charge sur ce système d'exploitation" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "impossible d'imposer des limites de charge : " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"plus d'identificateur de fichier disponible : impossible de dupliquer stdin\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"plus d'identificateur de fichier disponible : impossible de dupliquer " +"stdout\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" +"plus d'identificateurs de fichier disponible : impossible de dupliquer " +"stderr\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Impossible de restaurer stdin\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Impossible de restaurer stdout\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Impossible de restaurer stderr\n" + +#: job.c:2420 +#, 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" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s : commande introuvable" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s : programme Shell introuvable" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe : l'espace d'environnement est peut-être épuisé" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL a été modifié (de « %s » à « %s »)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Création d'un fichier de commande temporaire %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Contenu du fichier de commande :\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Contenu du fichier Batch :%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (ligne %d) Mauvais contexte du shell (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" +"-O[TYPE] (--output-sync[=TYPE]) n'est pas configuré pour cette construction." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Echec de l'ouverture de la table des symboles générale : %s" + +#: 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" + +#: 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" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Nom du symbole absent pour l'opération « load » : %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Chargement du symbole %s à partir de %s\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "" +"Les opérations « load » ne sont pas prises en charge sur cette plateforme." + +#: main.c:313 +msgid "Options:\n" +msgstr "Options :\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoré pour compatibilité.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Fabriquer toutes les cibles sans condition.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Afficher beaucoup d'informations de débogage.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGS] Afficher divers types d'informations de " +"débogage.\n" + +#: main.c:325 +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" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=CHAINE Evaluer la CHAINE comme une instruction de " +"makefile.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Afficher ce message et quitter.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Ignorer les erreurs venant des recettes.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +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" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +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" + +#: main.c:358 +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" + +#: main.c:360 +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" + +#: main.c:362 +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" + +#: main.c:364 +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" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Ne pas répéter les recettes.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Désactiver -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Assigner l'heure actuelle aux cibles au lieu " +"de les refabriquer.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace Afficher les traces mémoire.\n" + +#: main.c:375 +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" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Afficher le répertoire courant.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "une chaîne vide n'est pas un nom de fichier valable" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "niveau de débogage inconnu « %s »" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "type de output-sync « %s » inconnu" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s: interception de l'interruption/exception (code = 0x%lx, addr = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, 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" + +#: main.c:844 +#, 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" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() définit default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"La recherche de chemin de find_and_set_shell() a définit default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s s'arrête pendant 30 secondes..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) terminé. On continue.\n" + +#: main.c:1527 +#, 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) " + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "client Jobserver (semaphore %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "erreur interne : chaîne --jobserver-fds incorrecte « %s »" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "client Jobserver (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"AVERTISSEMENT : -jN forcé dans un submake : désactivation du mode serveur de " +"tâches." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "duplication du serveur de tâches" + +#: main.c:1570 +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." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile depuis l'entrée standard spécifié deux fois." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (fichier temporaire)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (fichier temporaire)" + +#: main.c:1974 +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." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "On revient en mode monotâche (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Nombre de clients jobserver limités à %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "création de la sémaphore du jobserver : (erreur %ld : %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "création d'un tube pour les tâches" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "initialisation du tube du serveur de tâches" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "" +"Les liens symboliques ne sont pas pris en charge : désactivation de -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Mise à jour des makefiles....\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Le makefile « %s » pourrait boucler ; on ne recommence pas.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Échec de refabrication du makefile « %s »." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Le makefile inclus « %s » est introuvable." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Le makefile « %s » est introuvable" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Impossible de revenir dans le répertoire d'origine." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Réexécution[%u] :" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (fichier temporaire) :" + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL contient plus d'une cible" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Pas de cible spécifiée et aucun makefile n'a été trouvé" + +#: main.c:2511 +msgid "No targets" +msgstr "Pas de cible" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Mise à jour des objectifs cibles....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"AVERTISSEMENT : décalage d'horloge détecté. La construction peut être " +"incomplète." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Utilisation : %s [options] [cible] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Ce programme est construit pour %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Ce programme est construit pour %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "Signaler les anomalies à .\n" + +#: main.c:2807 +#, 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" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "l'option « -%c » prend en argument un entier positif" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sConstruit pour %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sConstruit pour %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Base de données de Make, imprimée le %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Base de données de Make terminée le %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Erreur inconnue %d" + +#: misc.c:522 +#, 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" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Accès initialisé" + +#: misc.c:622 +msgid "User access" +msgstr "Accès utilisateur" + +#: misc.c:670 +msgid "Make access" +msgstr "Accès de Make" + +#: misc.c:704 +msgid "Child access" +msgstr "Accès des fils" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s : on entre dans un répertoire inconnu\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s : on quitte un répertoire inconnu\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s : on entre dans le répertoire « %s »\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s : on quitte le répertoire « %s »\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u] : on entre dans un répertoire inconnu\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u] : on quitte un répertoire inconnu\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u] : on entre dans le répertoire « %s »\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u] : on quitte le répertoire « %s »\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "erreur d'écriture : %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Arrêt.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s : %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s : %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Lecture des makefiles...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Lecture du makefile « %s »" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (pas d'objectif par défaut)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (chemin de recherche)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (peu importe)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (pas de remplacement du ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "On saute les BOM UTF-8 du makefile « %s »\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "On saute les BOM UTF-8 du tampon makefile\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "syntaxe incorrecte dans la condition" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s : echec du chargement" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "La recette commence avant la première cible" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "règle manquante avant la recette" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (vouliez-vous dire TAB au lieu des 8 espaces ?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "séparateur manquant %s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "motif de cible manquant" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "motifs de cible multiples" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "le motif de cible ne contient pas « %% »" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "« endif » manquant" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "nom de variable vide" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "texte superflu après la directive « define »" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "« endef » manquant, « define » non terminé" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "texte superflu après la directive « endef »" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "texte superflu après la directive « %s »" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "« %s » superflu" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "un seul « else » par condition" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Définition malformée de variable spécifique à une cible" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "les prérequis ne peuvent être définis dans des recettes" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "mélange de règles implicites et statiques pour le motif" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "mélange de règles implicites et normales" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "la cible « %s » ne correspond pas au motif de cible" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "le fichier cible « %s » possède à la fois des entrées : et ::" + +#: read.c:2112 +#, 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." + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "avertissement : surchargement de la recette pour la cible « %s »" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "avertissement : ancienne recette ignorée pour la cible « %s »" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "mélange de règles implicites et normales" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" +"AVERTISSEMENT : caractère NUL détecté ; le reste de la ligne est ignoré" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "rien à faire pour « %s »." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "« %s » est à jour." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Élagage du fichier « %s ».\n" + +#: remake.c:390 remake.c:393 +#, 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" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sAucune règle pour fabriquer la cible « %s »%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Étude du fichier cible « %s ».\n" + +#: remake.c:433 +#, 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" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Le fichier « %s » a déjà été étudié.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Mise à jour du fichier « %s » en cours.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Fin de la mise à jour du fichier « %s ».\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Le fichier « %s » n'existe pas.\n" + +#: remake.c:495 +#, 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" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Règle implicite trouvée pour « %s ».\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Pas de règle implicite trouvée pour « %s ».\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Utilisation de la recette par défaut pour « %s ».\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Dépendance circulaire %s <- %s abandonnée." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Fin des dépendances du fichier cible « %s ».\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Les dépendances de « %s » sont en cours de fabrication.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Abandon du fichier cible « %s ».\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "La cible « %s » n'a pas été refabriquée à cause d'erreurs." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "La dépendance « %s » ne commande que la cible « %s ».\n" + +#: remake.c:757 +#, 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" + +#: remake.c:762 +#, 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" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "uLa dépendance « %s » est plus ancienne que la cible « %s ».\n" + +#: remake.c:783 +#, 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" + +#: remake.c:790 +#, 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" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Fabrication de « %s » à cause de l'indicateur « always-make ».\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Inutile de refabriquer la cible « %s »" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr " ; utilisation du nom VPATH « %s »" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Il faut refabriquer la cible « %s ».\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " On ignore le nom VPATH « %s ».\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "La recette de « %s » est en cours d'exécution.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Échec de refabrication du fichier cible « %s ».\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Refabrication réussie du fichier cible « %s ».\n" + +#: remake.c:853 +#, 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" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Utilisation des commandes par défaut pour « %s ».\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "" +"Avertissement : le fichier « %s » a une date de modification dans le futur" + +#: remake.c:1411 +#, 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" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "l'élément « %s » de .LIBPATTERNS n'est pas un motif" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "« customs » n'exportera pas : %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Règles implicites" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Pas de règle implicite." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u règles implicites, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminal." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ANOMALIE : num_pattern_rules est faux ! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "signal inconnu" + +#: signame.c:92 +msgid "Hangup" +msgstr "Raccroche" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Interrompt" + +#: signame.c:98 +msgid "Quit" +msgstr "Quitte" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Instruction non admise" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Point de trace/arrêt" + +#: signame.c:109 +msgid "Aborted" +msgstr "Annulé" + +#: signame.c:112 +msgid "IOT trap" +msgstr "Appel IOT" + +#: signame.c:115 +msgid "EMT trap" +msgstr "Appel EMT" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Exception en virgule flottante" + +#: signame.c:121 +msgid "Killed" +msgstr "Tué" + +#: signame.c:124 +msgid "Bus error" +msgstr "Erreur de bus" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Erreur de segmentation" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Mauvais appel système" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Tube cassé" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Alarme" + +#: signame.c:139 +msgid "Terminated" +msgstr "Terminé" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Signal utilisateur 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Signal utilisateur 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Processus fils terminé" + +#: signame.c:156 +msgid "Power failure" +msgstr "Coupure d'alimentation" + +#: signame.c:159 +msgid "Stopped" +msgstr "Arrêté" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Arrêté (entrée tty)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Arrêté (sortie tty)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Arrêté (signal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Limite du temps CPU dépassée" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Limite de taille de fichier dépassée" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Compteur virtuel expiré" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Compteur de profiling expiré" + +#: signame.c:186 +msgid "Window changed" +msgstr "Fenêtre modifiée" + +#: signame.c:189 +msgid "Continued" +msgstr "Reprise" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Condition d'E/S urgente" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "E/S possible" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Ressource perdue" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Signal de danger" + +#: signame.c:217 +msgid "Information request" +msgstr "Demande d'informations" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Coprocesseur en virgule flottante non disponible" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s pas de tampons strcache\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s tampon courant : taille = %hu o / utilisé = %hu o / nombre = %hu / moy = " +"%hu o\n" + +#: strcache.c:280 +#, 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" + +#: strcache.c:283 +#, 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" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s performance strcache : lookups = %lu / accès = %lu%%\n" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# stats des tables de hachage :\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automatique" + +#: variable.c:1602 +msgid "default" +msgstr "défaut" + +#: variable.c:1605 +msgid "environment" +msgstr "environnement" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "environnement avec l'option -e" + +#: variable.c:1614 +msgid "command line" +msgstr "ligne de commande" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "directive « override »" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (depuis « %s », ligne %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# stats des tables de hachage de la variable « set » :\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variables\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valeurs de variable spécifiques au motif" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# pas de valeurs de variable spécifiques au motif" + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valeurs de variable spécifiques au motif" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "avertissement : variable « %.*s » indéfinie" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() a échoué avec %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "AVERTISSEMENT : redirection vide\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "erreur interne : « %s » command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-warning, vous pourriez avoir besoin de réactiver le traitement de CTRL-Y " +"par DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "COMMANDE INTERNE [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "COMMANDE CD INTERNE %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "COMMANDE CD INTERNE %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Commande interne inconnue « %s »\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Erreur, commande vide\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Entrée redirigée depuis %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Erreur redirigée vers %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Sortie ajoutée à %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Sortie redirigée vers %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Ajoute %.*s et nettoie\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Exécution de %s à la place\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Erreur de lancement, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Chemins de recherche VPATH\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Aucun chemin de recherche « vpath »." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u chemins de recherche « vpath ».\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Aucun chemin de recherche général (variable « VPATH »)." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Chemin de recherche général (variable « VPATH ») :\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/po/ga.gmo b/po/ga.gmo new file mode 100644 index 0000000..39e658e Binary files /dev/null and b/po/ga.gmo differ diff --git a/po/ga.po b/po/ga.po new file mode 100644 index 0000000..7e865a5 --- /dev/null +++ b/po/ga.po @@ -0,0 +1,2323 @@ +# Irish translations for make. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Kevin Patrick Scannell , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2006-04-22 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=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "rinneadh iarracht ar ghné gan tacaíocht a úsáid: `%s'" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "ní féidir ball cartlainne a `touch'áil ar VMS" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Níl an chartlann `%s' ann" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: Níl `%s' ina cartlann bhailí" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Níl a leithéid de bhall `%s' i `%s'" + +#: ar.c:164 +#, fuzzy, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: Droch-chód aisfhillidh ó ar_member_touch ar `%s'" + +#: arscan.c:124 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"níorbh fhéidir le lbr$set_module an t-eolas modúil a bhaint amach, stádas = " +"%d" + +#: arscan.c:230 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "theip ar lbr$ini_control le stádas = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "" +"ní féidir leabharlann `%s' a oscailt chun cuardach a dhéanamh ar an mball `" +"%s'" + +#: arscan.c:944 +#, fuzzy, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Ball `%s'%s: %ld beart ag %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (is féidir go bhfuil an t-ainm teasctha)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Dáta %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mód = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Briseadh.\n" + +#: commands.c:629 +#, fuzzy, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Is féidir gur ball bréige é `%s'; ní scriosadh" + +#: commands.c:633 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Is féidir gur ball bréige é `%s'; ní scriosadh" + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Comhad `%s' á scriosadh" + +#: commands.c:649 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Comhad `%s' á scriosadh" + +#: commands.c:685 +#, fuzzy +msgid "# recipe to execute" +msgstr "# orduithe le rith" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (insuite):" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (ó `%s', líne %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Comhadlanna\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: níorbh fhéidir é a stat.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (eochair %s, am-m %d): ní féidir é a oscailt.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (gléas %d, i-nód [%d,%d,%d]): ní féidir é a oscailt.\n" + +#: dir.c:1014 +#, 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" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (eochair %s, am-m %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (gléas %d, i-nód [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (gléas %ld, i-nód %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Ná Déan" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " comhad, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "níl" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " rudaí neamhfhéideartha" + +#: dir.c:1068 +msgid " so far." +msgstr " go dtí seo." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " rudaí neamhfhéideartha i %lu comhadlann.\n" + +#: expand.c:125 +#, fuzzy, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Déanann an athróg athchúrsach `%s' tagairt dó féin (sa deireadh)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "tagairt athróige gan chríochnú" + +#: file.c:271 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Sonraíodh orduithe le haghaidh comhaid `%s' ag %s:%lu," + +#: file.c:276 +#, fuzzy, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" +"Aimsíodh orduithe le haghaidh `%s' trí chuardach ar rialacha intuigthe," + +#: file.c:280 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "ach anois is ionann iad na comhaid `%s' agus `%s'." + +#: file.c:283 +#, fuzzy, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" +"Déanfar neamhshuim ar orduithe le haghaidh `%s'; úsáidfear na cinn le " +"haghaidh `%s' ina n-ionad." + +#: file.c:303 +#, fuzzy, 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'" + +#: file.c:309 +#, fuzzy, 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'" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Comhad idirmheánach `%s' á scriosadh" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Comhaid idirmheánacha á mbaint...\n" + +#: file.c:811 +msgid "Current time" +msgstr "An t-am anois" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Stampa ama as raon; %s á úsáid ina ionad" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Ní sprioc é:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Comhad luachmhar (réamhriachtanas de .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Sprioc bhréige (réamhriachtanas de .PHONY)." + +#: file.c:964 +#, fuzzy +msgid "# Command line target." +msgstr "# Sprioc líne na n-orduithe." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Makefile réamhshocraithe, nó ó MAKEFILES, nó -include/sinclude." + +#: file.c:968 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# Níl aon riail intuigthe." + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Rinneadh cuardach ar rialacha intuigthe." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Ní dhearna cuardach ar rialacha intuigthe." + +#: file.c:973 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Stoc patrúin intuigthe/statach: `%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Tá an comhad ina réamhriachtanas idirmheánach." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Déantar fosta:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Níor seiceáladh an t-am mionathraithe riamh." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Níl a leithéid de chomhad ann." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Is cianaosta an comhad seo." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Athraithe %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Nuashonraíodh an comhad." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Níor nuashonraíodh an comhad." + +#: file.c:1001 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Tá orduithe ann atá ag rith faoi láthair (IS FABHT É SEO)." + +#: file.c:1004 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Tá orduithe spleáchais ag rith (IS FABHT É SEO)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# D'éirigh leis an nuashonrú." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Tá gá le nuashonrú (-q ceaptha)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Theip ar nuashonrú." + +#: file.c:1025 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Luach neamhbhailí sa bhall `command_state'!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Comhaid" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# comhaid hais-tábla stait:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "tá an chéad argóint neamhuimhriúil leis an fheidhm `word'" + +#: function.c:785 +#, fuzzy +msgid "first argument to 'word' function must be greater than 0" +msgstr "caithfidh an chéad argóint leis an fheidhm `word' a bheith deimhneach" + +#: function.c:805 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "is neamhuimhriúil í an chéad argóint leis an fheidhm `wordlist'" + +#: function.c:807 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "is neamhuimhriúil í an dara hargóint leis an fheidhm `wordlist'" + +#: function.c:1499 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: theip ar DuplicateHandle(In) (e=%ld)\n" + +#: function.c:1523 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: theip ar DuplicateHandle(Earr) (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "Theip ar CreatePipe() (e=%ld)\n" + +#: function.c:1538 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): theip ar process_init_fd()\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Baisc-chomhad sealadach %s á ghlanadh\n" + +#: function.c:2193 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: function.c:2203 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "earráid sa scríobh: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "easpa argóintí (%d) d'fheidhm `%s'" + +#: function.c:2336 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "níl an fheidhm `%s' ar fáil ar an chóras seo" + +#: function.c:2399 +#, fuzzy, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "glao ar fheidhm `%s' gan chríochnú: `%c' ar iarraidh" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "easpa argóintí (%d) d'fheidhm `%s'" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "easpa argóintí (%d) d'fheidhm `%s'" + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: Tá an rogha `%s' débhríoch\n" + +#: getopt.c:683 +#, fuzzy, 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" + +#: getopt.c:688 +#, fuzzy, 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" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: tá argóint de dhíth i ndiaidh na rogha `%s'\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: rogha anaithnid `--%s'\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: rogha anaithnid `%c%s'\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: rogha neamhcheadaithe -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: rogha neamhbhailí -- %c\n" + +#: getopt.c:797 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" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: Tá an rogha `-W %s' débhríoch\n" + +#: getopt.c:862 +#, fuzzy, 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" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "ní féidir %ld beart a dháileadh le haghaidh hais-tábla: cuimhne ídithe" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Lód=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Ath-haiseáil=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Tuairteanna haiseála=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Ag déanamh cuardach ar riail intuigthe le haghaidh `%s'.\n" + +#: implicit.c:54 +#, fuzzy, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "" +"Ag déanamh cuardach ar riail intuigthe le haghaidh bhall cartlainne `%s'.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Athchúrsáil de bharr rialacha intuigthe á seachaint.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, fuzzy, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Ag baint triail as riail phatrúin le stoc `%.*s'.\n" + +#: implicit.c:697 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Réamhriachtanas neamhfhéideartha rialach `%s' á dhiúltú.\n" + +#: implicit.c:698 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Réamhriachtanas intuigthe neamhfhéideartha `%s' á dhiúltú.\n" + +#: implicit.c:711 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Ag baint triail as an réamhriachtanas rialach `%s'.\n" + +#: implicit.c:712 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Ag baint triail as an réamhriachtanas intuigthe `%s'.\n" + +#: implicit.c:751 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Aimsíodh réamhriachtanas `%s' mar VPATH `%s'\n" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Ag déanamh cuardach ar riail le comhad idirmheánach `%s'.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Ní féidir comhad sealadach a chruthú\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (córdhumpa)" + +#: job.c:488 +#, fuzzy +msgid " (ignored)" +msgstr "[%s] Earráid %d (rinneadh neamhshuim)" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (insuite):" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "" + +#: job.c:516 job.c:524 +#, fuzzy, c-format +msgid "%s[%s] Error %d%s" +msgstr "*** [%s] Earráid %d" + +#: job.c:519 +#, fuzzy, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "*** [%s] Earráid 0x%x" + +#: job.c:529 +#, fuzzy, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s%s: %s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Ag fanacht le jabanna neamhchríochnaithe..." + +#: job.c:651 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Mac beo 0x%08lx (%s) PID %ld %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (cianda)" + +#: job.c:841 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Mac caillteach á bhaint: 0x%08lx PID %ld %s\n" + +#: job.c:842 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Mac buaiteach á bhaint: 0x%08lx PID %ld %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Baisc-chomhad sealadach %s á ghlanadh\n" + +#: job.c:855 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Baisc-chomhad sealadach %s á ghlanadh\n" + +#: job.c:961 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Mac 0x%08lx PID %ld%s á dhealú ón slabhra.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Saoradh ceadchomhartha le haghaidh mac 0x%08lx (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "scríobh jabfhreastalaí" + +#: job.c:1662 job.c:2387 +#, 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" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"%d argóint sa tosú theipthe\n" + +#: job.c:1735 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Ag cur mac 0x%08lx (%s) PID %ld%s ar an slabhra.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Fuarthas ceadchomhartha le haghaidh mac 0x%08lx (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "léadh píopa na jabanna" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: Níl an chartlann `%s' ann" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "" +"%sNíl aon riail chun an sprioc `%s' a dhéanamh, riachtanach le haghaidh `" +"%s'%s" + +#: job.c:2171 +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" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "ní féidir srian lóid a chur i bhfeidhm: " + +#: job.c:2252 +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" + +#: job.c:2264 +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" + +#: job.c:2278 +#, fuzzy +msgid "no more file handles: could not duplicate stderr\n" +msgstr "níl aon hanla comhaid le fáil: níorbh fhéidir stdin a chóipeáil\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Níorbh fhéidir stdin a athchóiriú\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Níorbh fhéidir stdout a athchóiriú\n" + +#: job.c:2309 +#, fuzzy +msgid "Could not restore stderr\n" +msgstr "Níorbh fhéidir stdin a athchóiriú\n" + +#: job.c:2420 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "ghin make mac le pid %ld, ag feitheamh le pid %ld fós\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Ní bhfuarthas an t-ordú" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Ní bhfuarthas an clár blaoisce" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: is féidir gur ídithe í cuimhne na timpeallachta" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "Athraíodh $SHELL (ba `%s' é, agus is `%s' é anois)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Baisc-chomhad sealadach %s á chruthú\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (líne %d) Droch-chomhthéacs blaoisce (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +#, fuzzy +msgid "The 'load' operation is not supported on this platform." +msgstr "Níl jabanna parailéalacha (-j) ar fáil ar an gcóras seo." + +#: main.c:313 +msgid "Options:\n" +msgstr "Roghanna:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Déan neamhshuim (comhoiriúnacht)\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Déan gach sprioc, gan choinníollacha.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Taispeáin go leor eolas dífhabhtaithe.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=BRATACHA] Taispeáin eolas fabhtaithe de chineálacha " +"éagsúla.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Sáraíonn athróga timpeallachta makefileanna.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Taispeáin an chabhair seo agus scoir.\n" + +#: main.c:335 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Déan neamhshuim ar earráidí ó orduithe.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +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" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +#, 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á rith aon ordú; taispeáin torthaí mar dhea " +"amháin.\n" + +#: main.c:352 +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" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Taispeáin an bunachar sonraí inmheánach.\n" + +#: main.c:360 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Ná rith aon ordú; stádas scortha = 0 mura gá " +"le nuashonrú.\n" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Díchumasaigh na rialacha intuigthe insuite.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables Díchumasaigh na hathróga insuite.\n" + +#: main.c:366 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Ná déan macalla ar orduithe.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Múch -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Teagmhaigh spriocanna in ionad iad a " +"athdhéanamh.\n" + +#: main.c:373 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr " -d Taispeáin go leor eolas dífhabhtaithe.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Taispeáin eolas faoin leagan agus scoir.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Taispeáin an chomhadlann reatha.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "ní féidir teaghrán folamh a úsáid mar ainm comhaid" + +#: main.c:737 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "sonrú anaithnid `%s' ar an leibhéal dífhabhtaithe" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Fuarthas idirbhriseadh/eisceacht (cód = 0x%lx, seoladh = 0x%lx)\n" + +#: main.c:835 +#, 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" +"Glaodh scagaire eisceachta gan láimhseáil ón chlár %s\n" +"CódEisceachta = %lx\n" +"BratachaEisceachta = %lx\n" +"SeoladhEisceachta = %lx\n" + +#: main.c:843 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Sárú rochtana: oibríocht scríofa ag seoladh %lx\n" + +#: main.c:844 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Sárú rochtana: oibríocht léimh ag seoladh %lx\n" + +#: main.c:920 main.c:935 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "tá find_and_set_shell ag socrú default_shell = %s\n" + +#: main.c:988 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "shocraigh find_and_set_shell conair chuardaigh default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "cuirfear %s ar fionraí ar feadh tréimhse 30 soicind..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) críochnaithe. Ag gabháil ar aghaidh.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: main.c:1534 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "earráid inmheánach: teaghrán neamhbhailí --jobserver-fds `%s'" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "rabhadh: -jN fórsáilte i bhfo-make: mód jabfhreastalaí á dhíchumasú." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "jabfhreastalaí dup" + +#: main.c:1570 +#, fuzzy +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"rabhadh: níl jabfhreastalaí ar fáil: ag baint úsáid as -j1. Cuir `+' leis " +"an máthair-riail." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Sonraíodh Makefile ón ionchur caighdeánach faoi dhó." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (comhad sealadach)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (comhad sealadach)" + +#: main.c:1974 +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." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Á athshocrú le haghaidh jabanna aonair (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "píopa na jabanna á chruthú" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "píopa an jabfhreastalaí á thúsú" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "ní thacaítear le naisc shiombalacha: -L á dhíchumasú." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Makefileanna á nuashonrú....\n" + +#: main.c:2158 +#, fuzzy, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "is féidir go lúbfar an Makefile `%s'; ní athdhéanfar é.\n" + +#: main.c:2237 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Theip ar athdhéanamh an makefile `%s'." + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "Níor aimsíodh an makefile `%s' san áireamh." + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "Níor aimsíodh an makefile `%s'" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Níorbh fhéidir an chomhadlann oibre a athrú ar ais." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Á rith arís[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (comhad sealadach): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "tá níos mó ná aon sprioc amháin i .DEFAULT_GOAL" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Níor sonraíodh aon sprioc agus níor aimsíodh aon makefile" + +#: main.c:2511 +msgid "No targets" +msgstr "Níl aon sprioc ann" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Cinn sprice á nuashonrú....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "rabhadh: Clog ar sceabha. Is féidir go bhfuil an tógáil neamhiomlán." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Úsáid: %s [roghanna] [sprioc] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Tógadh an clár seo le haghaidh %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Tógadh an clár seo le haghaidh %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "Seol tuairiscí fabhtanna chuig \n" + +#: main.c:2807 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "caithfidh tú teaghrán nach folamh a thabhairt mar argóint le `-%c'" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "caithfidh tú slánuimhir dheimhneach a thabhairt mar argóint le `-%c'" + +#: main.c:3269 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sTógadh an clár seo le haghaidh %s\n" + +#: main.c:3271 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sTógadh an clár seo le haghaidh %s (%s)\n" + +#: main.c:3282 +#, 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 "" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Bunachar sonraí Make, priontáilte ar %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Críochnaíodh an bunachar sonraí Make seo ar %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Earráid anaithnid %d" + +#: misc.c:522 +#, 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" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Rochtain túsaithe" + +#: misc.c:622 +msgid "User access" +msgstr "Rochtain úsáideora" + +#: misc.c:670 +msgid "Make access" +msgstr "Rochtain make" + +#: misc.c:704 +msgid "Child access" +msgstr "Rochtain mic" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Ag dul isteach i gcomhadlann anaithnid\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Ag dul amach as comhadlann anaithnid\n" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Ag dul isteach sa chomhadlann `%s'\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Ag dul amach as an gcomhadlann `%s'\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Ag dul isteach i gcomhadlann anaithnid\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Ag dul amach as comhadlann anaithnid\n" + +#: output.c:120 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Ag dul isteach sa chomhadlann `%s'\n" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Ag dul amach as an gcomhadlann `%s'\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "earráid sa scríobh: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Stop.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Makefileanna á léamh...\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Makefile `%s' á léamh" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (gan ceann sprice réamhshocraithe)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (conair chuardaigh)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (is cuma)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ná fairsing ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "comhréir neamhbhailí i gcoinníollach" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +#, fuzzy +msgid "recipe commences before first target" +msgstr "tá orduithe ann roimh an chéad sprioc" + +#: read.c:1041 +#, fuzzy +msgid "missing rule before recipe" +msgstr "riail ar iarraidh roimh orduithe" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (Ar mhian leat TÁB in ionad ocht spás?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "deighilteoir%s ar iarraidh" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "patrún sprice ar iarraidh" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "patrúin iomadúla sprice" + +#: read.c:1276 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "níl aon `%%' sa phatrún sprice" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "`endif' ar iarraidh" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "ainm folamh athróige" + +#: read.c:1471 +#, fuzzy +msgid "extraneous text after 'define' directive" +msgstr "Téacs gan mhaith i ndiaidh treorach `endef'" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "`endef' ar iarraidh, `define' gan chríochnú" + +#: read.c:1524 +#, fuzzy +msgid "extraneous text after 'endef' directive" +msgstr "Téacs gan mhaith i ndiaidh treorach `endef'" + +#: read.c:1595 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "Téacs gan mhaith i ndiaidh treorach `%s'" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "`%s' breise" + +#: read.c:1624 +#, fuzzy +msgid "only one 'else' per conditional" +msgstr "ní cheadaítear ach aon `else' amháin le gach coinníollach" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Is míchumtha é an sainmhíniú athróige (le haghaidh aon sprioc amháin)" + +#: read.c:1957 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "ní féidir réamhriachtanais a shonrú i scripteanna ordaithe" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "rialacha intuigthe agus rialacha statacha measctha le chéile" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "rialacha intuigthe agus gnáthrialacha measctha le chéile" + +#: read.c:2091 +#, fuzzy, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "níl an sprioc `%s' comhoiriúnach leis an phatrún sprice" + +#: read.c:2106 read.c:2152 +#, fuzzy, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "tá iontrálacha : agus :: araon ann don chomhad sprice `%s'" + +#: read.c:2112 +#, fuzzy, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "tá an sprioc `%s' i riail amháin níos mó ná uair amháin." + +#: read.c:2122 +#, fuzzy, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "rabhadh: ag sárú na n-orduithe le haghaidh na sprice `%s'" + +#: read.c:2125 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "" +"rabhadh: ag déanamh neamhshuim ar sheanorduithe le haghaidh sprice `%s'" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "rialacha intuigthe agus gnáthrialacha measctha le chéile" + +#: read.c:2539 +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" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "Níl faic le déanamh i gcomhair `%s'." + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "Níl gá le `%s' a nuashonrú." + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Comhad `%s' á bhearradh.\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "" +"%sNíl aon riail chun an sprioc `%s' a dhéanamh, riachtanach le haghaidh `" +"%s'%s" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sNíl aon riail chun an sprioc `%s' a dhéanamh%s" + +#: remake.c:426 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "Comhad sprice `%s' idir lámha.\n" + +#: remake.c:433 +#, fuzzy, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "" +"Rinneadh iarracht ar an chomhad `%s' a nuashonrú le déanaí, agus theip air.\n" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "Rinneadh scrúdú ar an chomhad `%s' cheana.\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "Comhad `%s' á nuashonrú fós.\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Nuashonraíodh an comhad `%s'.\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "Níl a leithéid de chomhad `%s' ann.\n" + +#: remake.c:495 +#, fuzzy, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Warning: comhad .LOW_RESOLUTION_TIME `%s' le stampa ama ardtaifeach" + +#: remake.c:508 remake.c:1040 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Aimsíodh riail intuigthe le haghaidh `%s'.\n" + +#: remake.c:510 remake.c:1042 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Níor aimsíodh aon riail intuigthe le haghaidh `%s'.\n" + +#: remake.c:516 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Ag baint úsáid as orduithe réamhshocraithe le haghaidh `%s'.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Tréigeadh an spleáchas ciorclach %s <- %s." + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Críochnaíodh na réamhriachtanais den chomhad sprice `%s'.\n" + +#: remake.c:681 +#, fuzzy, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Réamhriachtanais de `%s' á ndéanamh anois.\n" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Ag tréigean an chomhaid sprice `%s'.\n" + +#: remake.c:700 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Ní dhearna an sprioc `%s' arís ós rud é go bhfuil earráidí ann." + +#: remake.c:752 +#, fuzzy, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "" +"Sonraíonn an réamhriachtanas `%s' ord rite amháin le haghaidh sprice `%s'.\n" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Níl an réamhriachtanas `%s' den sprioc `%s' ann.\n" + +#: remake.c:762 +#, fuzzy, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Tá an réamhriachtanas `%s' níos nuaí ná an sprioc `%s'.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Tá an réamhriachtanas `%s' níos sine ná an sprioc `%s'.\n" + +#: remake.c:783 +#, fuzzy, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Tá dhá idirstad ag an sprioc `%s' agus níl aon réamhriachtanas aice.\n" + +#: remake.c:790 +#, fuzzy, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" +"Níl aon ordú le haghaidh `%s' agus níor athraigh aon réamhriachtanas.\n" + +#: remake.c:795 +#, fuzzy, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "`%s' á dhéanamh de bharr bratach --always-make.\n" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Níl gá leis an sprioc `%s' a athdhéanamh" + +#: remake.c:805 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr "; ag baint úsáid as ainm VPATH `%s'" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "Caithfidh an sprioc `%s' a athdhéanamh.\n" + +#: remake.c:831 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ag déanamh neamhshuim ar ainm VPATH `%s'.\n" + +#: remake.c:840 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Orduithe de `%s' á rith.\n" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Theip ar athdhéanamh an sprioc-chomhaid `%s'.\n" + +#: remake.c:850 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "D'éirigh le hathdhéanamh an sprioc-chomhaid `%s'.\n" + +#: remake.c:853 +#, fuzzy, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Tá gá leis an chomhad sprice `%s' a athdhéanamh leis an rogha -q.\n" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Ag baint úsáid as orduithe réamhshocraithe le haghaidh `%s'.\n" + +#: remake.c:1397 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Rabhadh: Tá an t-am mionathraithe den chomhad `%s' sa todhchaí" + +#: remake.c:1411 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "" +"Rabhadh: Tá an t-am mionathraithe den chomhad `%s' %.2g soicind sa todhchaí" + +#: remake.c:1610 +#, fuzzy, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "Níl eilimint .LIBPATTERNS `%s' ina patrún" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Ní easpórtálfar Customs: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Rialacha Intuigthe" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Níl aon riail intuigthe." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u riail intuigthe, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " teirminéal." + +#: rule.c:530 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FABHT: num_pattern_rules mícheart! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "comhartha anaithnid" + +#: signame.c:92 +msgid "Hangup" +msgstr "Croch suas" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Idirbhriseadh" + +#: signame.c:98 +msgid "Quit" +msgstr "Scoir" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Treoir Neamhcheadaithe" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Rianaigh/brisphointe" + +#: signame.c:109 +msgid "Aborted" +msgstr "Tobscortha" + +#: signame.c:112 +msgid "IOT trap" +msgstr "Gaiste IOT" + +#: signame.c:115 +msgid "EMT trap" +msgstr "Gaiste EMT" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Eisceacht snámhphointe" + +#: signame.c:121 +msgid "Killed" +msgstr "Maraithe" + +#: signame.c:124 +msgid "Bus error" +msgstr "Busearráid" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Fabht deighilte" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Drochghlao ar an gcóras" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Píopa briste" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Clog aláraim" + +#: signame.c:139 +msgid "Terminated" +msgstr "Scortha" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Comhartha saincheaptha 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Comhartha saincheaptha 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Scoir an mhacphróiseas" + +#: signame.c:156 +msgid "Power failure" +msgstr "Cliseadh cumhachta" + +#: signame.c:159 +msgid "Stopped" +msgstr "Stoptha" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Stoptha (ionchur tty)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Stoptha (aschur tty)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Stoptha (comhartha)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Teorainn ama LAP sáraithe" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Uasmhéid na gcomhad sáraithe" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Am fíorúil caite" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Am próifíle caite" + +#: signame.c:186 +msgid "Window changed" +msgstr "Athraíodh an fhuinneog" + +#: signame.c:189 +msgid "Continued" +msgstr "Leanta" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Staid phráinneach A/I" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "A/I indéanta" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Acmhainn caillte" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Comhartha guaise" + +#: signame.c:217 +msgid "Information request" +msgstr "Iarratas ar eolas" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Níl comhphróiseálaí snámhphointe ar fáil" + +#: strcache.c:236 +#, fuzzy, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "%s líon na maolán strcache: %d\n" + +#: strcache.c:266 +#, fuzzy, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "%s strcache saor: iomlán = %d / uas = %d / íos = %d / meán = %d\n" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, fuzzy, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s méid strcache: iomlán = %d / uas = %d / íos = %d / meán = %d\n" + +#: strcache.c:283 +#, fuzzy, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "%s strcache saor: iomlán = %d / uas = %d / íos = %d / meán = %d\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: strcache.c:289 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# comhaid hais-tábla stait:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "uathoibríoch" + +#: variable.c:1602 +msgid "default" +msgstr "réamhshocraithe" + +#: variable.c:1605 +msgid "environment" +msgstr "timpeallacht" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "timpeallacht le -e" + +#: variable.c:1614 +msgid "command line" +msgstr "líne na n-orduithe" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "treoir `override'" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (ó `%s', líne %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# athróg tacar hais-tábla stait:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Athróga\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Luachanna Athróige sainiúil don phatrún" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Níl aon luach athróige atá sainiúil don phatrún." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u luach athróige atá sainiúil don phatrún" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "rabhadh: athróg gan sainmhíniú: `%.*s'" + +#: vmsfunctions.c:91 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "Theip ar sys$cuardach le %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Rabhadh: Atreorú folamh\n" + +#: vmsjobs.c:183 +#, fuzzy, c-format +msgid "internal error: '%s' command_state" +msgstr "earráid inmheánach: `%s' command_state" + +#: vmsjobs.c:290 +#, 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" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "INSUITE [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "CD INSUITE %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "CD INSUITE %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Ordú anaithnid insuite '%s'\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Earráid, ordú folamh\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Atreoraíodh ionchur ó %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Atreoraíodh earráidí go %s\n" + +#: vmsjobs.c:690 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Atreoraíodh aschur go %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Atreoraíodh aschur go %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s á rith ina áit\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Earráid le linn sceitheadh, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Conairí Cuardaigh\n" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# Níl aon chonair chuardaigh `vpath'." + +#: vpath.c:602 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u conair chuardaigh `vpath'.\n" + +#: vpath.c:605 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Níl aon chonair ghinearálta cuardaigh (athróg `VPATH')." + +#: vpath.c:611 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Conair ghinearálta cuardaigh (athróg `VPATH'):\n" +"# " + +#~ 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 "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 "" +#~ "%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, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-rabhadh, fágfaidh CTRL-Y fo-phróisis gan ghlanadh.\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "RM INSUITE %s\n" diff --git a/po/gl.gmo b/po/gl.gmo new file mode 100644 index 0000000..209a1a4 Binary files /dev/null and b/po/gl.gmo differ diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..254e2a5 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,2604 @@ +# 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: 2014-10-05 12:25-0400\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" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "tentouse usar unha característica non admitida: «%s»" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "a operación de tocar un membro do arquivo non está dispoñíbel en VMS" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: O arquivo «%s» non existe" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: «%s» non é un arquivo válido" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: O membro «%s» non existe en «%s»" + +#: ar.c:164 +#, fuzzy, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: Código de retorno incorrecto de ar_member_touch en «%s»" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"a chamada a lbr$set_module() fallou ao extraer a información do módulo, " +"estado = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "a chamada a lbr$ini_control() fallou con estado = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "non é posíbel abrir a biblioteca «%s» para buscar o membro «%s»" + +#: arscan.c:944 +#, fuzzy, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Membro «%s»%s: %ld bytes en %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (o nome pode quedar truncado)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Data %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modo = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Interrompido.\n" + +#: commands.c:629 +#, fuzzy, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] O membro do arquivo «%s» pode non ser correcto; non eliminado" + +#: commands.c:633 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** O membro do arquivo «%s» pode non ser correcto; non eliminado" + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Eliminando o ficheiro «%s»" + +#: commands.c:649 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Eliminando o ficheiro «%s»" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (incorporadas):" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (desde «%s», liña %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directorios\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: non foi posíbel facer a operación de stat.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (clave %s, mtime %d): non foi posíbel abrir.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (dispositivo %d, inodo [%d,%d,%d]): non foi posíbel abrir.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (dispositivo %ld, inodo %ld): non foi posíbel abrir.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (clave %s, mtime %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (dispositivo %d, inodo [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (dispositivo %ld, inodo %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Non" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " ficheiros, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "non" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " imposíbeis" + +#: dir.c:1068 +msgid " so far." +msgstr " ata aquí." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " imposíbeis en %lu directorios.\n" + +#: expand.c:125 +#, fuzzy, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "A variábel recursiva «%s» fai referencia a si mesma (ao final)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "referencia a variábel non rematada" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "" + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" + +#: file.c:280 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "pero agora considérase que «%s» é o mesmo ficheiro que «%s»." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" + +#: file.c:303 +#, fuzzy, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "non é posíbel renomear «%s» con dous puntos a «%s» con catro puntos" + +#: file.c:309 +#, fuzzy, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "non é posíbel renomear «%s» con catro puntos a «%s» con dous puntos" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Eliminando o ficheiro intermedio «%s»" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Retirando os ficheiros intermedios...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Hora actual" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Marca de tempo fóra de rango; substituíndo %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Non é un obxectivo:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Ficheiro precioso (prerrequisito de .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Obxectivo falso (prerrequisito de .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Obxectivo da liña de ordes." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Un ficheiro de make por defecto, MAKEFILES, ou -include/sinclude." + +#: file.c:968 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# Non hai regras implícitas." + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Fíxose a busca de regras implícitas." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Non se fixo a busca de regras implícitas." + +#: file.c:973 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Raíz do patrón implícito/estático: «%s»\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# O ficheiro é un prerrequisito intermedio." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Tamén se fai:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Nunca se comprobou o tempo de modificación." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# O ficheiro non existe." + +#: file.c:989 +msgid "# File is very old." +msgstr "# O ficheiro é moi antigo." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Última modificación: %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# O ficheiro foi actualizado." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# O ficheiro non foi actualizado." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "" + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Actualizado con éxito." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Ten que ser actualizado (-q está definido)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Produciuse un erro ao actualizar." + +#: file.c:1025 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Valor non válido no membro «command_state»!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Ficheiros" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# estatísticas da táboa hash de ficheiros:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "primeiro argumento da función «word» non numérico" + +#: function.c:785 +#, fuzzy +msgid "first argument to 'word' function must be greater than 0" +msgstr "o primeiro argumento da función «word» debe ser maior que 0" + +#: function.c:805 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "primeiro argumento da función «wordlist» non numérico" + +#: function.c:807 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "segundo argumento da función «wordlist» non numérico" + +#: function.c:1499 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe(): a chamada a DuplicateHandle(In) fallou (e=%ld)\n" + +#: function.c:1523 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" +"windows32_open_pipe(): a chamada a DuplicateHandle(Err) fallou (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "A chamada a CreatePipe() fallou (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): a chamada a process_init_fd() fallou\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Limpando o ficheiro de lotes temporal %s\n" + +#: function.c:2193 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: function.c:2203 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "erro de escritura: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "número de argumentos insuficiente (%d) na chamada á función «%s»" + +#: function.c:2336 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "non implementada nesta plataforma: función «%s»" + +#: function.c:2399 +#, fuzzy, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "chamada á función «%s» non rematada: falta «%c»" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "número de argumentos insuficiente (%d) na chamada á función «%s»" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "número de argumentos insuficiente (%d) na chamada á función «%s»" + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: a opción «%s» é ambigua\n" + +#: getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: a opción «--%s» non permite ningún argumento\n" + +#: getopt.c:688 +#, fuzzy, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: a opción «%c%s» non permite ningún argumento\n" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: a opción «%s» require un argumento\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: opción «--%s» non recoñecida\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: opción «%c%s» non recoñecida\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción inaceptábel -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción incorrecta -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: a opción require un argumento -- %c\n" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: a opción «-W %s» é ambigua\n" + +#: getopt.c:862 +#, fuzzy, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: a opción «-W %s» non permite ningún argumento\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "non se poden reservar %lu bytes para a táboa hash: memoria esgotada" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Carga=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Colisións=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Buscando unha regra implícita para «%s».\n" + +#: implicit.c:54 +#, fuzzy, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Buscando unha regra implícita membro do arquivo para «%s».\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitando a recursión de regras implícitas.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, fuzzy, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Probando a regra de patrón con raíz «%.*s».\n" + +#: implicit.c:697 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Rexeitando o prerrequisito imposíbel «%s».\n" + +#: implicit.c:698 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Rexeitando o prerrequisito implícito imposíbel «%s».\n" + +#: implicit.c:711 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Probando o prerrequisito «%s».\n" + +#: implicit.c:712 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Probando o prerrequisito implícito «%s».\n" + +#: implicit.c:751 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Atopouse a o prerrequisito «%s» como VPATH «%s»\n" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Buscando unha regra co ficheiro intermedio «%s».\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Non foi posíbel crear un ficheiro temporal\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (memoria envorcada)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (ignorado)" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (incorporadas):" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "" + +#: job.c:516 job.c:524 +#, fuzzy, c-format +msgid "%s[%s] Error %d%s" +msgstr "*** [%s] Erro %d" + +#: job.c:519 +#, fuzzy, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "*** [%s] Erro 0x%x" + +#: job.c:529 +#, fuzzy, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s%s: %s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Agardando por traballos non rematados...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Proceso fillo vivo %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (remoto)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Colleitando o proceso fillo perdedor %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Colleitando o proceso fillo gañador %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Limpando o ficheiro de lotes temporal %s\n" + +#: job.c:855 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Limpando o ficheiro de lotes temporal %s\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Retirando o proceso fillo %p PID %s%s da cadea.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Liberouse un elemento para o proceso fillo %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "produciuse un erro ao iniciar process_easy() o proceso (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Contáronse %d argumentos no inicio que fallou\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Poñendo o proceso fillo %p (%s) PID %s%s na cadea.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Obtívose un elemento para o proceso fillo %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "lectura da canalización de traballos" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: O arquivo «%s» non existe" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%sNon hai unha regra para facer o obxectivo «%s», que precisa «%s»%s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "non é posíbel impoñer límites de carga neste sistema operativo" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "non é posíbel impoñer un límite de carga: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"make colleitou un proceso fillo de pid %s, aínda se agarda polo pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Orde non atopada" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Programa para o intérprete de ordes non atopado" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "O valor de $SHELL cambiou (antes era «%s», agora é «%s»)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Creando un ficheiro por lotes temporal %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (liña %d) Contexto do intérprete de ordes incorrecto (!unixy && !" +"batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +#, fuzzy +msgid "The 'load' operation is not supported on this platform." +msgstr "Non se admiten os traballos en paralelo (-j) nesta plataforma." + +#: main.c:313 +msgid "Options:\n" +msgstr "Opcións:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorado por compatibilidade.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Facer todos os obxectivos incondicionalmente.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Mostrar moita información de depuración.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=MODIFICADORES] Mostrar varios tipos de información de " +"depuración.\n" + +#: main.c:325 +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" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Mostrar esta mensaxe e saír.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Continuar cando no se poidan facer\n" +" algúns obxectivos.\n" + +#: main.c:344 +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" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:349 +#, 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" + +#: main.c:352 +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" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Mostrar a base de datos interna de make.\n" + +#: main.c:360 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Desactivar as regras implícitas incorporadas.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Desactivar os valores das variábeis " +"incorporadas.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Desactiva -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Tocar os obxectivos no canto de os refacer.\n" + +#: main.c:373 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr "" +" -d Mostrar moita información de depuración.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Mostrar o número de versión de make e saír.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Mostrar o directorio actual.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "a cadea baleira non é válida como nome de ficheiro" + +#: main.c:737 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "especificación de nivel de depuración descoñecido «%s»" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s: Atrapouse unha Interrupción/Excepción (código = 0x%lx, enderezo = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Violación de acceso: operación de escritura no enderezo 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Violación de acceso: operación de lectura no enderezo 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() definindo default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "A busca de rutas de find_and_set_shell() define default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s está suspendido durante 30 segundos..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "rematouse sleep(30). Continuando.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: main.c:1534 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "erro interno: cadea --jobserver-fds non válida «%s»" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"aviso: -jN forzado no submake: desactivando o modo de servidor de traballos." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1570 +#, fuzzy +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"aviso: o servidor de traballos non está dispoñíbel: usando -j1. Engada «+» á " +"regra do make pai." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "O ficheiro de make da entrada estándar especificouse dúas veces." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (ficheiro temporal)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (ficheiro temporal)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Non se admiten os traballos en paralelo (-j) nesta plataforma." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Reiniciando para entrar no modo de traballo único (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "creando a canalización de traballos" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "inicializar a canalización do servidor de traballos" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Actualizando os ficheiros de make....\n" + +#: main.c:2158 +#, fuzzy, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "O ficheiro de make «%s» podería causar un bucle; non se refai.\n" + +#: main.c:2237 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Produciuse un erro ao refacer o ficheiro de make «%s»." + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "Non se atopou o ficheiro de make incluído «%s»." + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "Non se atopou o ficheiro de make «%s»" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Non foi posíbel volver ao directorio orixinal." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Re-executando[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (ficheiro temporal)" + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Non se especificaron obxectivos e non se atopou un ficheiro de make" + +#: main.c:2511 +msgid "No targets" +msgstr "Non hai obxectivos" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Actualizando os obxectivos meta....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"aviso: Detectáronse inconsistencias de reloxo. A operación pode quedar " +"incompleta." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uso: %s [opcións] [obxectivo] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Este programa compilou para %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Este programa compilou para %s (%s)\n" + +#: main.c:2721 +#, 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" + +#: main.c:2807 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "a opción «%s%s» require un argumento de cadea non baleira" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "a opción «-%c» require un argumento integral positivo" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sCompilado para %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sCompilado para %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Base de datos de Make, imprimida en %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Base de datos de Make rematada en %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Erro %d descoñecido" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: usuario %lu (real %lu), grupo %lu (real %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Acceso inicializado" + +#: misc.c:622 +msgid "User access" +msgstr "Acceso de usuario" + +#: misc.c:670 +msgid "Make access" +msgstr "Acceso de make" + +#: misc.c:704 +msgid "Child access" +msgstr "Acceso de fillo" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Entrando nun directorio descoñecido\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Saíndo dun directorio descoñecido\n" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Entrando no directorio «%s»\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Saíndo do directorio «%s»\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Entrando nun directorio descoñecido\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Saíndo dun directorio descoñecido\n" + +#: output.c:120 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Entrando no directorio «%s»\n" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Saíndo do directorio «%s»\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "erro de escritura: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Detido.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Lendo os ficheiros de make...\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Lendo o ficheiro de make «%s»" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (non hai unha meta por defecto)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (ruta de busca)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (non importa)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (non hai expansión de ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "sintaxe non válida no condicional" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (quixo dicir TAB no canto de 8 espazos?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "falta un separador%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "falta un patrón obxectivo" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "patróns de obxectivo múltiples" + +#: read.c:1276 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "o patrón obxectivo non contén «%%»" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "falta «endif»" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "nome de variábel baleiro" + +#: read.c:1471 +#, fuzzy +msgid "extraneous text after 'define' directive" +msgstr "texto superfluo trala directiva «define»" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "falta «endef», «define» sen rematar" + +#: read.c:1524 +#, fuzzy +msgid "extraneous text after 'endef' directive" +msgstr "Texto superfluo trala directiva «endef»" + +#: read.c:1595 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "Texto superfluo trala directiva «%s»" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "«%s» superfluo" + +#: read.c:1624 +#, fuzzy +msgid "only one 'else' per conditional" +msgstr "só un «else» por condicional" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Definición dunha variábel por obxectivo mal formada" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "regras de patrón implícitas e estáticas mesturadas" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "regras implícitas e normais mesturadas" + +#: read.c:2091 +#, fuzzy, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "o obxectivo «%s» non coincide co patrón do obxectivo" + +#: read.c:2106 read.c:2152 +#, fuzzy, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "o ficheiro obxectivo «%s» ten entradas : e ::" + +#: read.c:2112 +#, fuzzy, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "o obxectivo «%s» aparece máis dunha vez na mesma regra." + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "regras implícitas e normais mesturadas" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "aviso: viuse un carácter NUL; ignórase o resto da liña" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "Non hai nada que facer para «%s»" + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "«%s» está actualizado." + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Podando o ficheiro «%s».\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sNon hai unha regra para facer o obxectivo «%s», que precisa «%s»%s" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sNon hai unha regra para facer o obxectivo «%s»%s" + +#: remake.c:426 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "Considerando o ficheiro obxectivo «%s».\n" + +#: remake.c:433 +#, fuzzy, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "" +"Hai pouco probouse a actualizar o ficheiro «%s» e non foi posíbel facelo.\n" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "O ficheiro «%s» xa fora considerado.\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "Aínda se está actualizando o ficheiro «%s».\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Rematouse de actualizar o ficheiro «%s».\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "O ficheiro «%s» non existe.\n" + +#: remake.c:495 +#, 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" + +#: remake.c:508 remake.c:1040 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Atopouse unha regra implícita de «%s».\n" + +#: remake.c:510 remake.c:1042 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Non se atopou unha regra implícita para «%s».\n" + +#: remake.c:516 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Usando as ordes por defecto para «%s».\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "A dependencia circular %s <- %s foi eliminada." + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Rematáronse os prerrequisitos do ficheiro obxectivo «%s».\n" + +#: remake.c:681 +#, fuzzy, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Están a se facer os prerrequisitos de «%s».\n" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Abandonando no ficheiro obxectivo «%s».\n" + +#: remake.c:700 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Non se refai o obxectivo «%s» a causa dos erros." + +#: remake.c:752 +#, fuzzy, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "O prerrequisito «%s» é só-orde para o obxectivo «%s».\n" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "O prerrequisito «%s» do obxectivo «%s» non existe.\n" + +#: remake.c:762 +#, fuzzy, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "O prerrequisito «%s» é máis novo que o obxectivo «%s».\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "O prerrequisito «%s» é máis vello que o obxectivo «%s».\n" + +#: remake.c:783 +#, fuzzy, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "O obxectivo «%s» ten catro puntos e non ten prerrequisitos.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" + +#: remake.c:795 +#, fuzzy, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Facendo «%s» debido á marca de sempre-facer.\n" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Non é preciso refacer o obxectivo «%s»" + +#: remake.c:805 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr "; usando o nome de VPATH «%s»" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "Debe refacerse o obxectivo «%s».\n" + +#: remake.c:831 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ignorando o nome VPATH «%s».\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Produciuse un erro ao refacer o ficheiro obxectivo «%s».\n" + +#: remake.c:850 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "O ficheiro obxectivo «%s» foi feito de novo con éxito.\n" + +#: remake.c:853 +#, fuzzy, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "O ficheiro obxectivo «%s» precisa refacerse con -q.\n" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Usando as ordes por defecto para «%s».\n" + +#: remake.c:1397 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Aviso: O ficheiro «%s» ten un tempo de modificación no futuro" + +#: remake.c:1411 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Aviso: O ficheiro «%s» ten un tempo de modificación %s seg no futuro" + +#: remake.c:1610 +#, fuzzy, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "O elemento de .LIBPATTERNS «%s» non é un patrón" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "A Aduana non exporta: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Regras implícitas" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Non hai regras implícitas." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u regras implícitas, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminal." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FALLO: num_pattern_rules é incorrecto! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "sinal descoñecido" + +#: signame.c:92 +msgid "Hangup" +msgstr "Colgar" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Interrompido" + +#: signame.c:98 +msgid "Quit" +msgstr "Saír" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Instrución inaceptábel" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Trampa de trazado/punto de detención" + +#: signame.c:109 +msgid "Aborted" +msgstr "Abortado" + +#: signame.c:112 +msgid "IOT trap" +msgstr "Trampa de IOT" + +#: signame.c:115 +msgid "EMT trap" +msgstr "Trampa EMT" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Excepción de coma flotante" + +#: signame.c:121 +msgid "Killed" +msgstr "Matado" + +#: signame.c:124 +msgid "Bus error" +msgstr "Erro do bus" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Fallo de segmento" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Chamada ao sistema incorrecta" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Canalización rota" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Temporizador" + +#: signame.c:139 +msgid "Terminated" +msgstr "Terminado" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Sinal definido polo usuario 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Sinal definido polo usuario 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "O proceso fillo saíu" + +#: signame.c:156 +msgid "Power failure" +msgstr "Fallo de subministración eléctrica" + +#: signame.c:159 +msgid "Stopped" +msgstr "Detido" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Detido (entrada de consola)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Detido (saída de consola)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Detido (sinal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Excedeuse o límite de tempo de CPU" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Excedeuse o límite de tamaño do ficheiro" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Temporizador virtual esgotado" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "" + +#: signame.c:186 +msgid "Window changed" +msgstr "A xanela cambiou" + +#: signame.c:189 +msgid "Continued" +msgstr "Continuado" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Condición de E/S urxente" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "A E/S é posíbel" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Recurso perdido" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Sinal de perigo" + +#: signame.c:217 +msgid "Information request" +msgstr "Petición de información" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "O coprocesador de coma flotante non está dispoñíbel" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: strcache.c:266 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: strcache.c:289 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# estatísticas da táboa hash de ficheiros:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automático" + +#: variable.c:1602 +msgid "default" +msgstr "por defecto" + +#: variable.c:1605 +msgid "environment" +msgstr "ambiente" + +#: variable.c:1608 +msgid "makefile" +msgstr "ficheiro de make" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "ambiente baixo -e" + +#: variable.c:1614 +msgid "command line" +msgstr "liña de ordes" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "directiva «override»" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (desde «%s», liña %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# estatísticas da táboa hash de conxunto de variábeis:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variábeis\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valores de variábeis específicas do patrón" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Non hai valores específicos do patrón." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valores de variábeis específicos do patrón" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "aviso: variábel non definida «%.*s»" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "a chamada a sys$search() fallou con %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Aviso: Redirección baleira\n" + +#: vmsjobs.c:183 +#, fuzzy, c-format +msgid "internal error: '%s' command_state" +msgstr "erro interno: «%s» command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-aviso, pode que teña que reactivar o manexo de CTRL-Y desde o DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Orde incorporada descoñecida «%s»\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Erro, orde baleira\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Entrada redirixida desde %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Erros redirixidos a %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Saída redirixida a %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Executando %s no canto\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Erro ao lanzar, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Rutas de busca VPATH\n" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# Non hai rutas de busca «vpath»" + +#: vpath.c:602 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u rutas de busca «vpath».\n" + +#: vpath.c:605 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Non hai unha ruta de busca xeral (variábel «VPATH»)." + +#: vpath.c:611 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Ruta de busca xeral (variábel «VPATH»):\n" +"# " + +#~ 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 %d (ignored)" +#~ msgstr "[%s] Erro %d (ignorado)" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "erro interno: opcións --jobserver-fds múltiples" + +#~ msgid "virtual memory exhausted" +#~ msgstr "memoria virtual esgotada" + +#~ msgid "write error" +#~ msgstr "erro de escritura" + +#~ msgid "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# estatísticas da táboa hash strcache:\n" +#~ "# " + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BUILTIN RM %s\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/po/he.gmo b/po/he.gmo new file mode 100644 index 0000000..0603509 Binary files /dev/null and b/po/he.gmo differ diff --git a/po/he.po b/po/he.po new file mode 100644 index 0000000..0de9871 --- /dev/null +++ b/po/he.po @@ -0,0 +1,2362 @@ +# 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: 2014-10-05 12:25-0400\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" + +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "úëîúð äððéàù `%s' äðåëúá ùåîéù ïåéñð" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "VMS úëøòîá ïåéëøàá øáà ìù äòù/êéøàú éåðéùá äëéîú ïéà" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "íéé÷ åðéà `%s' ïåéëøà õáå÷ :touch" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "ïé÷ú ïåéëøà õáå÷ åðéà `%s' :touch" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "`%s' øáà ìéëî åðéà `%s' ïåéëøà :touch" + +#: ar.c:164 +#, fuzzy, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "`%s' øåáò ïé÷ú-àì ãå÷ äøéæçä ar_member_touch :touch" + +#: arscan.c:124 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "%d ñåèèñ ,lib$rset_module é\"ò ìåãåî ìò òãéî úôéìùá ïåìùë" + +#: arscan.c:230 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "%d ñåèèñ íò ìùëð lbr$ini_control" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "(`%s' äéøôñ) `%s' øáà øåáò äéøôñ úçéúôá äì÷ú" + +# These are not translated, since they belong to a test program. +#: arscan.c:944 +#, fuzzy, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Member `%s'%s: %ld bytes at %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (name might be truncated)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Date %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Break. ***\n" + +#: commands.c:629 +#, fuzzy, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] ÷çîéé àì ;ïé÷ú-éúìá úåéäì ìåìò `%s' ïåéëøà øáà ***" + +#: commands.c:633 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** ÷çîéé àì ;ïé÷ú-éúìá úåéäì ìåìò `%s' ïåéëøà øáà ***" + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] `%s' õáå÷ ÷çåî ***" + +#: commands.c:649 +#, 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. +#: commands.c:685 +#, fuzzy +msgid "# recipe to execute" +msgstr "# commands to execute" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (built-in):" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (from `%s', line %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directories\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: could not be stat'd.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (key %s, mtime %d): could not be opened.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (device %ld, inode %ld): could not be opened.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (key %s, mtime %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (device %d, inode [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (device %ld, inode %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "No" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " files, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "no" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " impossibilities" + +#: dir.c:1068 +msgid " so far." +msgstr " so far." + +#: dir.c:1085 +#, fuzzy, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilities in %u directories.\n" + +#: expand.c:125 +#, fuzzy, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "(øáã ìù åôåñá) åîöòì äééðôäì íøåâ `%s' éáéñøå÷ø äðúùî" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "äëìäë úîééúñî äðéà äðúùîì äééðôä" + +#: file.c:271 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr ",`%s' õáå÷ øåáò úåãå÷ô åðúéð %s õáå÷á %lu äøåùá" + +#: file.c:276 +#, fuzzy, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr ",íéùøåôî-éúìá íéììëá ùåôéç é\"ò åàöîð `%s' õáå÷ øåáò úåãå÷ô" + +#: file.c:280 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr ".õáå÷ åúåàì äúò íéáùçð `%s' ïäå `%s' ïä íìåàå" + +#: file.c:283 +#, fuzzy, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr ".`%s' øåáò åìà ìò úåôéãò `%s' øåáò úåãå÷ô" + +#: file.c:303 +#, fuzzy, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "`%s' íéããåá íééúåãå÷ðî `%s' íéìåôë íééúåãå÷ðì êåôäì ïúéð àì" + +#: file.c:309 +#, fuzzy, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "`%s' íéìåôë íééúåãå÷ðî `%s' íéããåá íééúåãå÷ðì êåôäì ïúéð àì" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** `%s' íééðéá õáå÷ ÷çåî ***" + +#: file.c:405 +#, fuzzy +msgid "Removing intermediate files...\n" +msgstr "*** `%s' íééðéá õáå÷ ÷çåî ***" + +#: file.c:811 +msgid "Current time" +msgstr "úëøòî ïåòù" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "øúåîä íåçúì õåçî äðéäù ,%s ìù ïîæä úîéúç úà %s-á óéìçî" + +# See the comment above about translations of text printed under -p. +#: file.c:955 +msgid "# Not a target:" +msgstr "# Not a target:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Precious file (prerequisite of .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Phony target (prerequisite of .PHONY)." + +#: file.c:964 +#, fuzzy +msgid "# Command line target." +msgstr "# Command-line target." + +#: file.c:966 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# A default or MAKEFILES makefile." + +#: file.c:968 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# No implicit rules." + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Implicit rule search has been done." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Implicit rule search has not been done." + +#: file.c:973 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Implicit/static pattern stem: `%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# File is an intermediate prerequisite." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Also makes:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Modification time never checked." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# File does not exist." + +#: file.c:989 +msgid "# File is very old." +msgstr "# File is very old." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Last modified %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# File has been updated." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# File has not been updated." + +#: file.c:1001 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Commands currently running (THIS IS A BUG)." + +#: file.c:1004 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Dependencies commands running (THIS IS A BUG)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Successfully updated." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Needs to be updated (-q is set)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Failed to be updated." + +#: file.c:1025 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Invalid value in `command_state' member!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Files" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "øôñî åðéà `word' úééö÷ðåôì ïåùàø èðîåâøà" + +#: function.c:785 +#, fuzzy +msgid "first argument to 'word' function must be greater than 0" +msgstr "éáåéç úåéäì áééç `word' úééö÷ðåôì ïåùàø èðîåâøà" + +#: function.c:805 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "øôñî åðéà `wordlist' úééö÷ðåôì ïåùàø èðîåâøà" + +#: function.c:807 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "øôñî åðéà `wordlist' úééö÷ðåôì éðù èðîåâøà" + +#: function.c:1499 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) failed (e=%d)\n" + +#: function.c:1523 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) failed (e=%d)\n" + +#: function.c:1530 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() failed (e=%d)\n" + +#: function.c:1538 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() failed\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "`%s' éðîæ batch õáå÷ ÷ìñî\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "÷ôñî åðéàù (%d) íéèðîåâøà øôñî íò äàø÷ð `%s' äéö÷ðåô" + +#: function.c:2336 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "åæ úëøòîá úùîåîî äðéà `%s' äéö÷ðåô" + +#: function.c:2399 +#, fuzzy, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "`%s' äéö÷ðåôì äàéø÷á `%c' øñç" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "÷ôñî åðéàù (%d) íéèðîåâøà øôñî íò äàø÷ð `%s' äéö÷ðåô" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "÷ôñî åðéàù (%d) íéèðîåâøà øôñî íò äàø÷ð `%s' äéö÷ðåô" + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s úéðëú øåáò éòîùî-ãç åðéà `%s' ïééôàî\n" + +#: getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `--%s' ïééôàî\n" + +#: getopt.c:688 +#, fuzzy, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `%c%s' ïééôàî\n" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà áééçî `%s' ïééôàî\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s úéðëú øåáò `--%s' ääåæî-éúìá ïééôàî\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s úéðëú øåáò `%c%s' ääåæî-éúìá ïééôàî\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: é÷åç-éúìá ïééôàî -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s úéðëú øåáò éåâù ïééôàî -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: èðîåâøà áééçî ïééôàî -- %c\n" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s úéðëú øåáò éòîùî-ãç åðéà `-W %s' ïééôàî\n" + +#: getopt.c:862 +#, fuzzy, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `-W %s' ïééôàî\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr ".`%s' øåáò ùøåôî-éúìá ììë ùôçî\n" + +#: implicit.c:54 +#, fuzzy, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr ".`%s' øåáò ïåéëøà éøáàì ùøåôî-éúìá ììë ùôçî\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr ".úùøåôî-éúìá äéñøå÷øî òðîð\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, fuzzy, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr ".`%.*s' ùøåù íò úéðáú ììë äñðî\n" + +#: implicit.c:697 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr ".úéøùôà-éúìá äðéäù íåùî `%s' íã÷ úùéøã äçåã\n" + +#: implicit.c:698 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr ".úéøùôà-éúìá äðéäù íåùî `%s' úùøåôî-éúìá íã÷ úùéøã äçåã\n" + +#: implicit.c:711 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr ".`%s' íã÷ úùéøã ììë äñðî\n" + +#: implicit.c:712 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr ".`%s' úùøåôî-éúìá íã÷ úùéøã äñðî\n" + +#: implicit.c:751 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "`%s' íã÷ úùéøãë VPATH `%s' éúàöî\n" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr ".`%s' éðîæ õáå÷ íò ììë ùôçî\n" + +#: job.c:361 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (temporary file)" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (core õáå÷á íùøð ïåøëæä ïëåú)" + +#: job.c:488 +#, fuzzy +msgid " (ignored)" +msgstr "[%s] %d äì÷úî éúîìòúä" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (built-in):" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "" + +#: job.c:516 job.c:524 +#, fuzzy, c-format +msgid "%s[%s] Error %d%s" +msgstr "*** [%s] %d äì÷ú" + +#: job.c:519 +#, fuzzy, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "*** [%s] 0x%x äì÷ú ***" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** ...åîééúñð íøèù úåãåáòì ïéúîî" + +#: job.c:651 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "äöø 0x%08lx (%s) PID=%ld %s úá-úéðëú\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr "(ú÷çåøî)" + +#: job.c:841 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "äìùëðù 0x%08lx PID=%ld %s úá-úéðëú óñåà\n" + +#: job.c:842 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "äçéìöäù 0x%08lx PID=%ld %s úá-úéðëú óñåà\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "`%s' éðîæ batch õáå÷ ÷ìñî\n" + +#: job.c:855 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "`%s' éðîæ batch õáå÷ ÷ìñî\n" + +#: job.c:961 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr ".úåãåáò úøùøùî 0x%08lx PID=%ld %s úá-úéðëú ÷éçøî\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr ".øøçåù 0x%08lx (%s) úá-úéðëú øåáò ïåîéñàä\n" + +# Here and elsewhere leading strings passed to perror are not translated, +# since they will be followed by an error message in English. +#: job.c:1036 +msgid "write jobserver" +msgstr "write jobserver" + +#: job.c:1662 job.c:2387 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "(e=%d) úéðëú-úú øåâéùá ìùëð process_easy()\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"ìùëðù øåâéùá åðîð íéèðîåâøà %d\n" + +#: job.c:1735 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr ".úåãåáò úøùøùì 0x%08lx (%s) PID=%ld %s úá-úéðëú óøöî\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr ".0x%08lx (%s) úá-úéðëú øåáò ïåîéñà ìá÷úä\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "read jobs pipe" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "íéé÷ åðéà `%s' ïåéëøà õáå÷ :touch" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%säúééðáì íéììë ïéà êà ,`%s' úùøåã `%s'%s äøèî" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "åæ úëøòîá ñîåò úåìáâî úåôëì ïúéð àì" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "cannot enforce load limit: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "" + +#: job.c:2420 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "äôñàð pid %d úá-úéðëú ,pid %d-ì äëçî ïééãò\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "äàöîð àì åæ äãå÷ô :%s" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "äàöîð àì shell úãå÷ô :%s" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "(`%s' äéä íãå÷ ,`%s' åéùëò) äðúùä $SHELL ìù åëøò" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "`%s' éðîæ batch õáå÷ øöåé\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"(!unixy && !batch_mode_shell) shell-mode úòéá÷á äì÷ú :%s õáå÷ ìù %d äøåù\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +#, fuzzy +msgid "The 'load' operation is not supported on this platform." +msgstr ".åæ úëøòîá êîúð åðéà (-j) éìéá÷î òåöéá" + +#: main.c:313 +msgid "Options:\n" +msgstr " :íéðééôàî\n" + +#: main.c:314 +#, fuzzy +msgid " -b, -m Ignored for compatibility.\n" +msgstr "úåîéàú ïòîì èîùåî" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: main.c:321 +#, fuzzy +msgid " -d Print lots of debugging information.\n" +msgstr "úåàéâù éåôéð úáåèì òãéî ìù òôù âöä" + +#: main.c:323 +#, fuzzy +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "úåàéâù éåôéð úáåèì òãéî ìù íéðåù íéâåñ âöä" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:330 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: main.c:333 +#, fuzzy +msgid " -h, --help Print this message and exit.\n" +msgstr "úéðëúäî àöå äæ äøæò êñî âöä" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: main.c:340 +#, fuzzy +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "äìáâî ïéà èðîåâøà àìì ;úéðîæ-åá úåãåáò N-î øúåé àì" + +#: main.c:342 +#, fuzzy +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "äéðáì úåðúéð ïðéà úåøèîäî äîë íà åìéôà êùîä" + +#: main.c:344 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:349 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:352 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +#, fuzzy +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "Make ìù éîéðô íéðåúð ñéñá âöä" + +#: main.c:360 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "úðëãåòî äøèî íàá øîåà äàéöé ãå÷ ;úåãå÷ô õéøú ìà" + +#: main.c:362 +#, fuzzy +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "íéùøåôî-éúìá íéðáåî íéììë ìøèð" + +#: main.c:364 +#, fuzzy +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "íéðúùî ìù úåðáåî úåøãâä ìøèð" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" + +#: main.c:371 +#, fuzzy +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "ïúåðáì íå÷îá úåøèî ìù ïîæ úîéúç ïëãò" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr "" + +#: main.c:375 +#, fuzzy +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "úéðëúäî àöå Make ìù àñøéâ øôñî âöä" + +#: main.c:377 +#, fuzzy +msgid " -w, --print-directory Print the current directory.\n" +msgstr "úéçëåð äé÷éú íù âöä" + +#: main.c:379 +#, fuzzy +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "ùøåôîá ïéåö àåä íà åìéôà -w ìèá" + +#: main.c:381 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:384 +#, fuzzy +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "øãâåä àìù äðúùîì äééðôä äø÷îá äøäæà âöä" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "õáå÷ íùë úìá÷úî äðéà ä÷éø úæåøçî" + +#: main.c:737 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "úåàéâù éåôéðì òãéî ìù `%s' øëåî-éúìá ïééôàî" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s úéðëúá (code = 0x%x, addr = 0x%x) äâéøç åà ä÷éñô\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "%x úáåúëì äáéúë :ïåøëæì äùéâ úì÷ú\n" + +#: main.c:844 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "%x úáåúëî äàéø÷ :ïåøëæì äùéâ úì÷ú\n" + +#: main.c:920 main.c:935 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell setting default_shell = %s\n" + +#: main.c:988 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell path search set default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr ".úåéðù 30 ìù %s úééäùä" + +# Pay attention: this is written to the _right_ of the previous string, +# but should look like a single sentence together with it. +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr " äîééúñð\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: main.c:1534 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "--jobserver-fds ïééôàîá `%s' äéåâù úæåøçî :úéîéðô äðëú úì÷ú" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "jobserver ïôåà ìèáî ;-jN áééçî Make-úú :äøäæà" + +#: main.c:1567 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1570 +#, fuzzy +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +".Make ìù áàä ììëì `+' óñåä .-j1-á ùåîéù äùòéé ;ïéîæ åðéà jobserver :äøäæà" + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr ".úçà íòôî øúåé ïúéð éð÷ú èì÷ õåøòî Makefile" + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (temporary file)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (temporary file)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr ".åæ úëøòîá êîúð åðéà (-j) éìéá÷î òåöéá" + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr ".(-j1) éúøãñ ïôåàá åòöåáé úåãå÷ô" + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "creating jobs pipe" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "init jobserver pipe" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "...makefile éöá÷ ïëãòî\n" + +#: main.c:2158 +#, fuzzy, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr ".ùãçî åøöééìî òðîð ;úéôåñðéà äàìåì øåöéì ìåìò `%s' Makefile\n" + +#: main.c:2237 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr ".`%s' makefile ìù ùãçî-äøéöéá äì÷ú" + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr ".àöîð àì `%s' ììëåî makefile" + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "àöîð àì `%s' Makefile" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr ".úéøå÷îä äé÷éúì øåæçì ïúéð àì" + +#: main.c:2343 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "Re-executing:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (temporary file): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "makefile éöá÷ åàöîð àìå úåøèî ïåéö ïéà" + +#: main.c:2511 +msgid "No targets" +msgstr "úåøèî ïéà" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "...ãòé úåøèî ïëãòî\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr ".äîìù àì úåéäì äìåìò äéðáä .ïåòù úùéìâ äúìâúð :úåøéäæ" + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "%s [íéðééôàî] [äøèî] ... :ùåîéù ïôåà\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" + +#: main.c:2721 +#, fuzzy, c-format +msgid "Report bugs to \n" +msgstr "" +"\n" +".-ì äì÷ú éçååéã çåìùì àð\n" + +#: main.c:2807 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "éáåéçå íìù èðîåâøà áééçî `-%c' ïééôàî" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "éáåéçå íìù èðîåâøà áééçî `-%c' ïééôàî" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" + +#: main.c:3282 +#, 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 "" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make data base, printed on %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Finished Make data base on %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Unknown error %d" + +#: misc.c:522 +#, fuzzy, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s access: user %lu (real %lu), group %lu (real %lu)\n" + +#: misc.c:543 +#, fuzzy +msgid "Initialized access" +msgstr "Initialized" + +#: misc.c:622 +msgid "User access" +msgstr "" + +#: misc.c:670 +msgid "Make access" +msgstr "" + +#: misc.c:704 +msgid "Child access" +msgstr "" + +#: output.c:104 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "an unknown directory" + +#: output.c:106 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "an unknown directory" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "directory `%s'\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "directory `%s'\n" + +#: output.c:115 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "an unknown directory" + +#: output.c:117 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "an unknown directory" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "directory `%s'\n" + +#: output.c:495 output.c:497 +msgid "write error: stdout" +msgstr "" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Stop.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "...makefile éöá÷ àøå÷\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Reading makefile `%s'" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (no default goal)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (search path)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (don't care)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (no ~ expansion)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "éàðú ìù éåâù øéáçú" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +#, fuzzy +msgid "recipe commences before first target" +msgstr "äðåùàø äøèî éðôì úåìéçúî úåãå÷ô" + +#: read.c:1041 +#, fuzzy +msgid "missing rule before recipe" +msgstr "ïäéðôì ììë àìì úåãå÷ô" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr "(?íéçååø 8 íå÷îá TAB-ì úðååëúä íàä) " + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "%sãéøôî øñç" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "äøèî úéðáú ïéà" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "úåáåøî äøèî úåéðáú" + +#: read.c:1276 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "`%%' àìì äøèî úéðáú" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "øñç `endif'" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "÷éø äðúùî íù" + +#: read.c:1471 +#, fuzzy +msgid "extraneous text after 'define' directive" +msgstr "`endef' úàøåä éøçà øúåéî èñ÷è" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "íåéñ àìì `define' úàøåä ,øñç `endef'" + +#: read.c:1524 +#, fuzzy +msgid "extraneous text after 'endef' directive" +msgstr "`endef' úàøåä éøçà øúåéî èñ÷è" + +#: read.c:1595 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "`%s' úàøåä éøçà øúåéî èñ÷è" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "øúåéî `%s'" + +#: read.c:1624 +#, fuzzy +msgid "only one 'else' per conditional" +msgstr "éàðú ìëì ãéçé `else' ÷ø øúåî" + +#: read.c:1899 +#, fuzzy +msgid "Malformed target-specific variable definition" +msgstr "äøèîì éôéöôñ äðúùî ìù äéåâù äøãâä" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "íéùøåôî-éúìáå íééèèñ úéðáú éììë ìù áåáøò" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "íéùøåôî-éúìáå íéìéâø íéììë ìù áåáøò" + +#: read.c:2091 +#, fuzzy, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "ãòéä úéðáú úà úîàåú äðéà `%s' äøèî" + +#: read.c:2106 read.c:2152 +#, fuzzy, c-format +msgid "target file '%s' has both : and :: entries" +msgstr ":: ïäå : âåñî ïä íéììë ùé `%s' äøèî õáå÷ì" + +#: read.c:2112 +#, fuzzy, c-format +msgid "target '%s' given more than once in the same rule" +msgstr ".ììë åúåàá úçà íòôî øúåé äòéôåî `%s' äøèî" + +#: read.c:2122 +#, fuzzy, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "`%s' äøèî øåáò úåãå÷ô ñøåã :úåøéäæ" + +#: read.c:2125 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "`%s' äøèî øåáò úåîãå÷ úåãå÷ôî íìòúî :úåøéäæ" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "íéùøåôî-éúìáå íéìéâø íéììë ìù áåáøò" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "äçðæð äøåùä úøúé ;NUL åú éúùâô :äøäæà" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr ".`%s øåáò úåùòì äî ïéà" + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr ".éðëãò øáë `%s'" + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr ".`%s' øåáò úåéåìú óøâ õö÷î\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%säúééðáì íéììë ïéà êà ,`%s' úùøåã `%s'%s äøèî" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%s`%s'%s äøèî úééðáì íéììë ïéà" + +#: remake.c:426 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr ".`%s' äøèî õáå÷ ïçåá\n" + +#: remake.c:433 +#, fuzzy, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr ".`%s' õáå÷ ïåëãòá éúìùëðå éúéñéð ïîæî àì\n" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr ".ïë-éðôì ïçáð øáë `%s' õáå÷\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr ".`%s' õáå÷ ïëãòî ïééãò\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr ".`%s' õáå÷ ïëãòì éúîééñ\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr ".íéé÷ åðéà `%s' õáå÷\n" + +#: remake.c:495 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:508 remake.c:1040 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr ".`%s' øåáò ùøåôî-éúìá ììë éúàöî\n" + +#: remake.c:510 remake.c:1042 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr ".`%s' øåáò íéùøåôî-éúìá íéììë åàöîð àì\n" + +#: remake.c:516 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr ".`%s' øåáò ìãçî úøéøá úåãå÷ôá ùîúùî\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr ".%s <- %s úéìâòî ìåìú èéîùî" + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr ".`%s' äøèî õáå÷ ìù íã÷-úåùéøã íò éúîééñ\n" + +#: remake.c:681 +#, fuzzy, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr ".äéðáá `%s' ìù íã÷ä úåùéøã\n" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr ".`%s' äøèî õáå÷ éáâì íééãé éúîøä\n" + +#: remake.c:700 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr ".úåàéâù á÷ò ùãçî äúðáð àì `%s' äøèî" + +#: remake.c:752 +#, fuzzy, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr ".`%s' íã÷ä úùéøãî äùãç `%s' äøèî\n" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr ".íéé÷ åðéàù `%s' éàðúë úùøåã `%s' äøèî\n" + +#: remake.c:762 +#, fuzzy, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr ".`%s' íã÷ä úùéøãî äðùé `%s' äøèî\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr ".`%s' íã÷ä úùéøãî äùãç `%s' äøèî\n" + +#: remake.c:783 +#, fuzzy, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr ".íã÷ úåùéøã àììå íéìåôë íééúåãå÷ð íò äðéä `%s' äøèî\n" + +#: remake.c:790 +#, fuzzy, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr ".äùòîì äúðúùä àì íã÷ úùéøã óàå `%s' øåáò úåãå÷ô ïéà\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "`%s' äøèî ùãçî úåðáì êøåö ïéà" + +#: remake.c:805 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr " (`%s' :VPATH õáå÷ íù)" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr ".`%s' äøèî ùãçî úåðáì áééç\n" + +#: remake.c:831 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " .`%s' VPATH íùî íìòúî\n" + +#: remake.c:840 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr ".`%s' øåáò úåãå÷ô õéøî\n" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr ".ùãçî `%s' úåðáì ïåéñð ìùëð\n" + +#: remake.c:850 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr ".`%s' ùãçî úééðáá äçìöä\n" + +#: remake.c:853 +#, fuzzy, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr ".-q íò úåðáéäì êéøö `%s' äøèî õáå÷\n" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr ".`%s' øåáò ìãçî úøéøá úåãå÷ôá ùîúùî\n" + +#: remake.c:1397 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "*** `%s' õáå÷ øåáò (%s > %s) ãéúòá åðéä ïåøçà éåðéù ïîæ :äøäæà ***" + +#: remake.c:1411 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "*** `%s' õáå÷ øåáò (%s > %s) ãéúòá åðéä ïåøçà éåðéù ïîæ :äøäæà ***" + +#: remake.c:1610 +#, fuzzy, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "úéðáú åðéà .LIBPATTERNS ìù `%s' èðîìà" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "%s àöééî åðéà Customs\n" + +#: rule.c:495 +#, fuzzy +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# No implicit rules." + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# No implicit rules." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u implicit rules, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminal." + +#: rule.c:530 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: num_pattern_rules wrong! %u != %u" + +# It's no use to try to translate the signal names. +#: signame.c:84 +msgid "unknown signal" +msgstr "unknown signal" + +#: signame.c:92 +msgid "Hangup" +msgstr "Hangup" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Interrupt" + +#: signame.c:98 +msgid "Quit" +msgstr "Quit" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Illegal Instruction" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Trace/breakpoint trap" + +#: signame.c:109 +msgid "Aborted" +msgstr "Aborted" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT trap" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT trap" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Floating point exception" + +#: signame.c:121 +msgid "Killed" +msgstr "Killed" + +#: signame.c:124 +msgid "Bus error" +msgstr "Bus error" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Segmentation fault" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Bad system call" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Broken pipe" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Alarm clock" + +#: signame.c:139 +msgid "Terminated" +msgstr "Terminated" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "User defined signal 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "User defined signal 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Child exited" + +#: signame.c:156 +msgid "Power failure" +msgstr "Power failure" + +#: signame.c:159 +msgid "Stopped" +msgstr "Stopped" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Stopped (tty input)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Stopped (tty output)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Stopped (signal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU time limit exceeded" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "File size limit exceeded" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtual timer expired" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Profiling timer expired" + +#: signame.c:186 +msgid "Window changed" +msgstr "Window changed" + +#: signame.c:189 +msgid "Continued" +msgstr "Continued" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Urgent I/O condition" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "I/O possible" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Resource lost" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Danger signal" + +#: signame.c:217 +msgid "Information request" +msgstr "Information request" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Floating point co-processor not available" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: strcache.c:266 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" + +#: variable.c:1599 +msgid "automatic" +msgstr "automatic" + +# These are printed under -p, so they are left in English. +#: variable.c:1602 +msgid "default" +msgstr "default" + +#: variable.c:1605 +msgid "environment" +msgstr "environment" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "environment under -e" + +#: variable.c:1614 +msgid "command line" +msgstr "command line" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "`override' directive" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (from `%s', line %lu):\n" + +#: variable.c:1691 +#, fuzzy +msgid "# variable set hash-table stats:\n" +msgstr "# %u variables in %u hash buckets.\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variables\n" + +#: variable.c:1706 +#, fuzzy +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Pattern-specific variable values" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# No pattern-specific variable values." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u pattern-specific variable values" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "`%.*s' øãâåî-éúìá äðúùî :úåøéäæ" + +#: vmsfunctions.c:91 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "%d íò ìùëð sys$search\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "ä÷éø äééðôä :úåøéäæ\n" + +#: vmsjobs.c:183 +#, fuzzy, c-format +msgid "internal error: '%s' command_state" +msgstr "command_state `%s' :úéîéðô äðëú úì÷ú" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr ".DCL-î CTRL-Y-á ìåôéè øåùôéàá êøåö úåéäì ìåìò :úåøéäæ\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "úøëåî äðéà '%s'úéðáåî äãå÷ô\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "ä÷éø äãå÷ô :äì÷ú\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "%s-î èì÷ úééðôä\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "%s-ì úåàéâù úééðôä\n" + +#: vmsjobs.c:690 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "%s-ì èìô úééðôä\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "%s-ì èìô úééðôä\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s õéøî úàæ íå÷îá\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "%d :úá-úéðëú úìòôäá äì÷ú\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Search Paths\n" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# No `vpath' search paths." + +#: vpath.c:602 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u `vpath' search paths.\n" + +#: vpath.c:605 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# No general (`VPATH' variable) search path." + +#: vpath.c:611 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " + +#~ 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 "Syntax error, still inside '\"'\n" +#~ msgstr "'\"' êåúá ïééãò ,øéáçú úàéâù\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr ".åôñàð íøèù úá-úåéðëú %u ;SIGCHLD ìá÷úä\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr ".úåìéòô úá-úåéðëú øéàùäì ìåìò CTRL-Y :úåøéäæ\n" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BUILTIN RM %s\n" + +#~ 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 "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 "" +#~ ", 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 "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 "# 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/po/hr.gmo b/po/hr.gmo new file mode 100644 index 0000000..6340916 Binary files /dev/null and b/po/hr.gmo differ diff --git a/po/hr.po b/po/hr.po new file mode 100644 index 0000000..36db598 --- /dev/null +++ b/po/hr.po @@ -0,0 +1,2427 @@ +# Translation of make to Croatian. +# Copyright (C) 2002 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Hrvoje Niksic , 2002. +# Tomislav Krznar , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.82\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2012-10-31 17:32+0100\n" +"Last-Translator: Tomislav Krznar \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" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "pokuÅ¡aj koriÅ¡tenja nepodržane mogućnosti: „%sâ€" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "touch elementa arhive nije dostupan na VMS-u" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Arhiva „%s†ne postoji" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: „%s†nije ispravna arhiva" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Element „%s†ne postoji u „%sâ€" + +#: ar.c:164 +#, fuzzy, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: Neispravan povratni kod iz ar_member_touch na „%sâ€" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module() nije izdvojio informacije o modulu, status = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() nije uspio sa stanjem = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "ne mogu otvoriti biblioteku „%s†za traženje elementa „%sâ€" + +#: arscan.c:944 +#, fuzzy, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Älan „%sâ€%s: %ld bajtova na %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (ime je možda odsjeÄeno)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mod = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Prekid.\n" + +#: commands.c:629 +#, fuzzy, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Element arhive „%s†je možda lažan; nije izbrisan" + +#: commands.c:633 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Element arhive „%s†je možda lažan; nije izbrisan" + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] BriÅ¡em datoteku „%sâ€" + +#: commands.c:649 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** BriÅ¡em datoteku „%sâ€" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# recept za izvrÅ¡avanje" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (ugraÄ‘eno):" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (iz „%sâ€, redak %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Direktoriji\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: ne može se izvrÅ¡iti stat.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (tipka %s, vrijeme ureÄ‘ivanja %d): ne može se otvoriti.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (ureÄ‘aj %d, indeksni Ävor [%d,%d,%d]): ne može se otvoriti.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (ureÄ‘aj %ld, indeksni Ävor %ld): ne može se otvoriti.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (tipka %s, vrijeme ureÄ‘ivanja %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (ureÄ‘aj %d, indeksni Ävor [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (ureÄ‘aj %ld, indeksni Ävor %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Nijedna" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " datoteka, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "nijedna" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " nemogućnost" + +#: dir.c:1068 +msgid " so far." +msgstr " do sada." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " nemogućnosti u %lu direktorija.\n" + +#: expand.c:125 +#, fuzzy, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekurzivna varijabla „%s†pokazuje (na kraju) na sebe" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "nedovrÅ¡ena referenca na varijablu" + +#: file.c:271 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Naveden je recept za datoteku „%s†na %s:%lu," + +#: file.c:276 +#, fuzzy, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Recept za datoteku „%s†naÄ‘en je implicitnim pretraživanjem propisa," + +#: file.c:280 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "ali se „%s†sada smatra istom datotekom kao i „%sâ€." + +#: file.c:283 +#, fuzzy, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "Recept za „%s†će se zanemariti u korist onog za „%sâ€." + +#: file.c:303 +#, fuzzy, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "ne mogu preimenovati „%s†s jednim dvotoÄjem u „%s†s dva dvotoÄja" + +#: file.c:309 +#, fuzzy, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "ne mogu preimenovati „%s†s dva dvotoÄja u „%s†s jednim dvotoÄjem" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** BriÅ¡em posrednu datoteku „%sâ€" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Uklanjam posredne datoteke...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Trenutno vrijeme" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Vremenska oznaka izvan granica; zamjenjujem s %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Nije meta:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Vrijedna datoteka (preduvjet mete .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Lažna meta (preduvjet mete .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Meta naredbenog retka." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Zadana, MAKEFILES ili -include/sinclude datoteka izrade." + +#: file.c:968 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# Nema implicitnih propisa." + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Implicitna pretraga propisa je izvrÅ¡ena." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Implicitna pretraga propisa nije izvrÅ¡ena." + +#: file.c:973 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Korijen implicitnog/statiÄkog uzorka: „%sâ€\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Datoteka je posredni preduvjet." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# TakoÄ‘er napravi:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Vrijeme promjene nikada nije provjereno." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Datoteka ne postoji." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Datoteka je vrlo stara." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Zadnja promjena %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Datoteka je ažurirana." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Datoteka nije ažurirana." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Recept koji se trenutno izvrÅ¡ava (OVO JE BUG)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Recept ovisnosti koji se izvrÅ¡ava (OVO JE BUG)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# UspjeÅ¡no ažuriran." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Treba ga ažurirati (-q je postavljen)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Nije ažuriran." + +#: file.c:1025 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Neispravna vrijednost u elementu „command_stateâ€!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Datoteke" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistike tablice rasprÅ¡ivanja datoteka:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "prvi argument funkcije „word†nije broj" + +#: function.c:785 +#, fuzzy +msgid "first argument to 'word' function must be greater than 0" +msgstr "prvi argument funkcije „word†mora biti veći od 0" + +#: function.c:805 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "drugi argument funkcije „wordlist†nije broj" + +#: function.c:807 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "drugi argument funkcije „wordlist†nije broj" + +#: function.c:1499 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe(): DuplicateHandle(In) nije uspio (e=%ld)\n" + +#: function.c:1523 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_open_pipe(): DuplicateHandle(Err) nije uspio (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() nije uspio (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() nije uspio\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "ÄŒistim privremenu skupnu datoteku %s.\n" + +#: function.c:2193 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: function.c:2203 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "greÅ¡ka pisanja: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "nedovoljan broj argumenata (%d) funkciji „%sâ€" + +#: function.c:2336 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "neimplementirano na ovoj platformi: funkcija „%sâ€" + +#: function.c:2399 +#, fuzzy, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "nedovrÅ¡en poziv funkciji „%sâ€: nedostaje „%câ€" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "nedovoljan broj argumenata (%d) funkciji „%sâ€" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "nedovoljan broj argumenata (%d) funkciji „%sâ€" + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: opcija „%s†je viÅ¡eznaÄna\n" + +#: getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: opcija „--%s†ne dozvoljava argument\n" + +#: getopt.c:688 +#, fuzzy, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: opcija „%c%s†ne dozvoljava argument\n" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: opcija „%s†zahtijeva argument\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: neprepoznata opcija „--%sâ€\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: neprepoznata opcija „%c%sâ€\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: nedozvoljena opcija -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: neispravna opcija -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opcija zahtijeva argument -- %c\n" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: opcija „-W %s†je viÅ¡eznaÄna\n" + +#: getopt.c:862 +#, fuzzy, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: opcija „-W %s†ne dozvoljava argument\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"ne mogu alocirati %lu bajtova za tablicu rasprÅ¡ivanja: memorija iscrpljena" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Opterećenje=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Preraspodjela=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Sudari=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Tražim implicitni propis za „%sâ€.\n" + +#: implicit.c:54 +#, fuzzy, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Tražim implicitni propis za „%s†koji pripada elementu arhive.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Izbjegavam rekurziju implicitnog propisa.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, fuzzy, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "PokuÅ¡avam propis uzorka s korijenom „%.*sâ€.\n" + +#: implicit.c:697 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Odbacujem nemoguće pravilo preduvjeta „%sâ€.\n" + +#: implicit.c:698 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Odbacujem nemoguć implicitni preduvjet „%sâ€.\n" + +#: implicit.c:711 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "PokuÅ¡avam s propisom preduvjeta „%sâ€.\n" + +#: implicit.c:712 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "PokuÅ¡avam s implicitnim preduvjetom „%sâ€.\n" + +#: implicit.c:751 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "NaÅ¡ao preduvjet „%s†kao VPATH „%sâ€\n" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Tražim propis s posrednom datotekom „%sâ€.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Ne mogu napraviti privremenu datoteku\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (jezgra izbaÄena)" + +#: job.c:488 +#, fuzzy +msgid " (ignored)" +msgstr "[%s] GreÅ¡ka %d (zanemarena)" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (ugraÄ‘eno):" + +#: job.c:503 +#, fuzzy, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "upozorenje: poniÅ¡tavam recept za metu „%sâ€" + +#: job.c:516 job.c:524 +#, fuzzy, c-format +msgid "%s[%s] Error %d%s" +msgstr "*** [%s] GreÅ¡ka %d" + +#: job.c:519 +#, fuzzy, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "*** [%s] GreÅ¡ka 0x%x" + +#: job.c:529 +#, fuzzy, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s%s: %s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** ÄŒekam nedovrÅ¡ene poslove...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Živo dijete %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (udaljen)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Skupljam neuspjeÅ¡no dijete %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Skupljam uspjeÅ¡no dijete %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "ÄŒistim privremenu skupnu datoteku %s\n" + +#: job.c:855 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "ÄŒistim privremenu skupnu datoteku %s\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Uklanjam dijete %p PID %s%s iz lanca.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "IspuÅ¡ten simbol za dijete %p (%s).\n" + +# Å to bi ovdje trebalo ići? +#: job.c:1036 +msgid "write jobserver" +msgstr "poslužitelj poslova pisanja" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() nije uspio pokrenuti proces (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Izbrojeno %d argumenata u neuspjelom pokretanju\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "SmjeÅ¡tam dijete %p (%s) PID %s%s u lanac.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Preuzet simbol za dijete %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "cjevovod poslova Äitanja" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: Arhiva „%s†ne postoji" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%sNema propisa za izradu mete „%sâ€, koji traži „%sâ€%s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "" +"ne mogu silom primijeniti ograniÄenje opterećenja na ovom operacijskom " +"sustavu" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "ne mogu silom primijeniti ograniÄenje opterećenja: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"nema viÅ¡e upravljaÄa datotekama: ne mogu udvostruÄiti standardni ulaz\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"nema viÅ¡e upravljaÄa datotekama: ne mogu udvostruÄiti standardni izlaz\n" + +#: job.c:2278 +#, fuzzy +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" +"nema viÅ¡e upravljaÄa datotekama: ne mogu udvostruÄiti standardni ulaz\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Ne mogu obnoviti standardni ulaz\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Ne mogu obnoviti standardni izlaz\n" + +#: job.c:2309 +#, fuzzy +msgid "Could not restore stderr\n" +msgstr "Ne mogu obnoviti standardni ulaz\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make je skupio dijete pid %s, joÅ¡ uvijek Äeka pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Naredba nije pronaÄ‘ena" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Program ljuske nije pronaÄ‘en" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: prostor okoline je možda iscrpljen" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL se promijenio (prije „%sâ€, sada „%sâ€)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Stvaram privremenu skupnu datoteku %s\n" + +#: job.c:3206 +#, fuzzy +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Sadržaj skupne datoteke:%s\n" +"\t%s\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Sadržaj skupne datoteke:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (redak %d) Neispravan kontekst ljuske (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +#, fuzzy +msgid "The 'load' operation is not supported on this platform." +msgstr "Paralelni poslovi (-j) nisu podržani na ovoj platformi." + +#: main.c:313 +msgid "Options:\n" +msgstr "Opcije:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Zanemareno zbog kompatibilnosti.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Bezuvjetno izradi sve mete.\n" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIREKTORIJ, --directory=DIREKTORIJ\n" +" PrijeÄ‘i u DIREKTORIJ prije poÄetka rada.\n" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d IspiÅ¡i puno podataka za debugiranje.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=ZASTAVICE] IspiÅ¡i razne vrste informacija za " +"debugiranje.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Varijable okoline imaju veću važnost od\n" +" datoteka izrade.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=NIZ Postupaj s NIZOM kao naredbom datoteke " +"izrade.\n" + +#: main.c:330 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f DATOTEKA, --file=DATOTEKA, --makefile=DATOTEKA\n" +" ProÄitaj DATOTEKU kao datoteku izrade.\n" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help IspiÅ¡i ovu poruku i izaÄ‘i.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Zanemari greÅ¡ke iz recepata.\n" + +#: main.c:337 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIREKTORIJ, --include-dir=DIREKTORIJ\n" +" Traži u DIREKTORIJU ukljuÄene datoteke " +"izrade.\n" + +#: main.c:340 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Dozvoli N istovremenih poslova; bez argumenta\n" +" ih dozvoli beskonaÄno.\n" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Nastavi s radom ako se neke mete ne mogu " +"izraditi.\n" + +#: main.c:344 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Ne pokreći viÅ¡estruke poslove, osim ako je\n" +" opterećenje ispod N.\n" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Koristi posljednji mtime izmeÄ‘u simboliÄkih " +"veza i mete.\n" + +#: main.c:349 +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" +" Nemoj zapravo pokrenuti nijedan recept,\n" +" samo ih ispiÅ¡i.\n" + +#: main.c:352 +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" +" Smatraj da je DATOTEKA vrlo stara i nemoj ju\n" +" ponovo napraviti.\n" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base IspiÅ¡i „make†internu bazu podataka.\n" + +#: main.c:360 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Ne pokreći recepte; izlazno stanje oznaÄava\n" +" je li sve ažurirano.\n" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules Onemogući ugraÄ‘ene implicitne propise.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Onemogući ugraÄ‘ene vrijednosti varijabli.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Ne ispisuj recepte.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" IskljuÄuje -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Umjesto ponovne izrade dodirni izgraÄ‘ene " +"mete.\n" + +#: main.c:373 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr " -d IspiÅ¡i puno podataka za debugiranje.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version IspiÅ¡i „make†broj inaÄice i izaÄ‘i.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory IspiÅ¡i trenutni direktorij.\n" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory IskljuÄi -w, Äak i ako je implicitno " +"ukljuÄen.\n" + +#: main.c:381 +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,\n" +" --assume-new=DATOTEKA\n" +" Smatraj DATOTEKU beskonaÄno novom.\n" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Upozori pri referenciranju nedefinirane " +"varijable.\n" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "prazan niz nije ispravan naziv datoteke" + +#: main.c:737 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "nepoznata oznaka razine debugiranja „%sâ€" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Uhvaćen prekid/iznimka (kod = 0x%lx, adr = 0x%p)\n" + +#: main.c:835 +#, 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 nekontrolirane iznimke pozvan iz programa %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Pristupni prekrÅ¡aj: operacija pisanja na adresi 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Pristupni prekrÅ¡aj: operacija Äitanja na adresi 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() postavlja default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell() pretraga putanje postavlja default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s se zaustavlja na 30 sekundi..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "gotov sa sleep(30). Nastavljam.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, fuzzy, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Klijent poslužitelja poslova (fds %d,%d)\n" + +#: main.c:1534 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "interna greÅ¡ka: neispravan --jobserver-fds niz „%sâ€" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Klijent poslužitelja poslova (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"upozorenje: pod-make prisilno postavlja -jN: onemogućujem poslužitelj " +"poslova." + +# Treba li ovo prevesti? +#: main.c:1567 +msgid "dup jobserver" +msgstr "dup poslužitelj poslova" + +#: main.c:1570 +#, fuzzy +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"upozorenje: poslužitelj poslova nedostupan: koristim -j1. Dodaj `+' na " +"roditeljev propis izrade." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Datoteka izrade sa standardnog ulaza navedena dvaput." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (privremena datoteka)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (privremena datoteka)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Paralelni poslovi (-j) nisu podržani na ovoj platformi." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Vraćam naÄin rada s jednim poslom (-j1)." + +#: main.c:1994 +#, fuzzy, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Klijent poslužitelja poslova (fds %d,%d)\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "stvaram cjevovod poslova" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "inicijaliziraj cjevovod poslužitelja poslova" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "SimboliÄke veze nisu podržane: onemogućujem -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Ažuriram datoteke izrade....\n" + +#: main.c:2158 +#, fuzzy, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Datoteka izrade „%s†bi mogla ući u petlju; ne izgraÄ‘ujem ponovo.\n" + +#: main.c:2237 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Nisam uspio ponovo izgraditi datoteku izrade „%sâ€." + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "UkljuÄeni datoteka izrade „%s†nije pronaÄ‘ena." + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "Datoteka izrade „%s†nije pronaÄ‘ena" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Ne mogu se vratiti u izvorni direktorij." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Ponovo izvrÅ¡avam[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (privremena datoteka): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL sadrži viÅ¡e od jedne mete" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Nijedna meta nije navedena, niti je pronaÄ‘ena ijedna datoteka izrade" + +#: main.c:2511 +msgid "No targets" +msgstr "Nema meta" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Ažuriram ciljne mete....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"upozorenje: UoÄena je nepravilnost sata. Izgradnja bi mogla biti nedovrÅ¡ena." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uporaba: %s [opcije] [meta] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Program izgraÄ‘en za %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Program izgraÄ‘en za %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "Prijavite greÅ¡ke na \n" + +#: main.c:2807 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "opcija „%s%s†zahtijeva neprazan znakovni niz kao argument" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "opcija „-%c†zahtijeva pozitivan cjelobrojni argument" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sIzgraÄ‘en za %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sIzgraÄ‘en za %s (%s)\n" + +#: main.c:3282 +#, 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 "" +"%sLicenca GPLv3+: GNU GPL inaÄica 3 ili kasnija \n" +"%sOvo je slobodan softver: slobodno ga smijete mijenjati i dijeliti.\n" +"%sNEMA JAMSTAVA, do krajnje mjere dozvoljene zakonom.\n" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make baza podataka, ispisana na %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Kraj Make baze podataka na %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Nepoznata greÅ¡ka %d" + +# Da prevedem ovo? +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: korisnik %lu (stvarno %lu), grupa %lu (stvarno %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Inicijaliziran pristup" + +#: misc.c:622 +msgid "User access" +msgstr "KorisniÄki pristup" + +#: misc.c:670 +msgid "Make access" +msgstr "Make pristup" + +#: misc.c:704 +msgid "Child access" +msgstr "Pristup djeteta" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Ulazim u nepoznat direktorij\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Izlazim iz nepoznatog direktorija\n" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Ulazim u direktorij „%sâ€\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Izlazim iz direktorija „%sâ€\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Ulazim u nepoznat direktorij\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Izlazim iz nepoznatog direktorija\n" + +#: output.c:120 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Ulazim u direktorij „%sâ€\n" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Izlazim iz direktorija „%sâ€\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "greÅ¡ka pisanja: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Zaustavi.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "ÄŒitam datoteke izrade...\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "ÄŒitam datoteku izrade „%sâ€" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (nema zadane mete)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (putanja pretraživanja)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (nije važno)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (bez proÅ¡irenja ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "neispravna sintaksa uvjeta" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "recept poÄinje prije prve mete" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "nedostaje propis prije recepta" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (jeste li htjeli TAB umjesto 8 razmaka?)" + +# Grr, živjela engleska množina! I Å¡to sad da radim s onim %s-om? +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "nedostaju znakovi razdvajanja (%s)" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "nedostaje uzorak mete" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "viÅ¡estruki uzorci meta" + +#: read.c:1276 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "uzorak mete ne sadrži „%%â€" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "nedostaje „endifâ€" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "prazno ime varijable" + +#: read.c:1471 +#, fuzzy +msgid "extraneous text after 'define' directive" +msgstr "suviÅ¡an tekst nakon direktive „defineâ€" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "nedostaje „endefâ€, nedovrÅ¡en „defineâ€" + +#: read.c:1524 +#, fuzzy +msgid "extraneous text after 'endef' directive" +msgstr "suviÅ¡an tekst nakon direktive „endefâ€" + +#: read.c:1595 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "suviÅ¡an tekst nakon direktive „%sâ€" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "suviÅ¡an „%sâ€" + +#: read.c:1624 +#, fuzzy +msgid "only one 'else' per conditional" +msgstr "samo jedan „else†po uvjetu" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "IzobliÄena definicija o meti ovisne varijable" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "preduvjeti ne mogu biti definirani u receptima" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "pomijeÅ¡ani implicitni i statiÄki propisi uzoraka" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "pomijeÅ¡ani implicitni i normalni propisi" + +#: read.c:2091 +#, fuzzy, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "meta „%s†ne odgovara uzorku mete" + +#: read.c:2106 read.c:2152 +#, fuzzy, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "datoteka mete „%s†ima unose i kod : i kod ::" + +#: read.c:2112 +#, fuzzy, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "meta „%s†je navedena viÅ¡e nego jednom u istom propisu." + +#: read.c:2122 +#, fuzzy, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "upozorenje: poniÅ¡tavam recept za metu „%sâ€" + +#: read.c:2125 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "upozorenje: zanemarujem stari recept za metu „%sâ€" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "pomijeÅ¡ani implicitni i normalni propisi" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "upozorenje: uoÄen je NUL znak; ostatak retka se zanemaruje" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "NiÅ¡ta za napraviti za „%sâ€." + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "„%s†je ažuriran." + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "ÄŒistim datoteku „%sâ€.\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sNema propisa za izradu mete „%sâ€, koji traži „%sâ€%s" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sNema propisa za izradu mete „%sâ€%s" + +#: remake.c:426 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "Razmatram datoteku mete „%sâ€.\n" + +#: remake.c:433 +#, fuzzy, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Nedavno bezuspjeÅ¡no pokuÅ¡ao ažurirati datoteku „%sâ€.\n" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "Datoteka „%s†je već razmatrana.\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "JoÅ¡ uvijek ažuriram datoteku „%sâ€.\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "ZavrÅ¡io s ažuriranjem datoteke „%sâ€.\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "Datoteka „%s†ne postoji.\n" + +#: remake.c:495 +#, fuzzy, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Upozorenje: .LOW_RESOLUTION_TIME datoteka „%s†ima vremensku oznaku " +"visoke rezolucije" + +#: remake.c:508 remake.c:1040 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "PronaÄ‘en implicitni propis za „%sâ€.\n" + +#: remake.c:510 remake.c:1042 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Nisam naÅ¡ao nijedan implicitni propis za „%sâ€.\n" + +#: remake.c:516 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Koristim zadani recept za „%sâ€.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Kružna ovisnost %s <- %s ispuÅ¡tena." + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "ZavrÅ¡eni preduvjeti datoteke mete „%sâ€.\n" + +#: remake.c:681 +#, fuzzy, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Preduvjeti „%s†se izraÄ‘uju.\n" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Odustajem od datoteke mete „%sâ€.\n" + +#: remake.c:700 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Meta „%s†nije ponovo izraÄ‘ena zbog greÅ¡aka." + +# Nisam siguran da sam ovo ispravno shvatio. +#: remake.c:752 +#, fuzzy, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Preduvjet „%s†služi samo za redoslijed za metu „%sâ€.\n" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Preduvjet „%s†mete „%s†ne postoji.\n" + +#: remake.c:762 +#, fuzzy, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Preduvjet „%s†noviji je od mete „%sâ€.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Preduvjet „%s†stariji je od mete „%sâ€.\n" + +#: remake.c:783 +#, fuzzy, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Meta „%s†je dvotoÄje, a nema preduvjete.\n" + +#: remake.c:790 +#, fuzzy, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "Nema recepta za „%sâ€, a nijedan preduvjet nije promijenjen.\n" + +#: remake.c:795 +#, fuzzy, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "IzraÄ‘ujem „%s†zbog zastavice always-make.\n" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Ponovna izrada mete „%s†nije potrebna" + +#: remake.c:805 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr "; koristim VPATH ime „%sâ€" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "Moram ponovo izraditi metu „%sâ€.\n" + +#: remake.c:831 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Zanemarujem VPATH ime „%sâ€.\n" + +#: remake.c:840 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Recept za „%s†se izvrÅ¡ava.\n" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Nisam uspio ponovo izraditi datoteku mete „%sâ€.\n" + +#: remake.c:850 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "UspjeÅ¡no ponovo izraÄ‘ena datoteka mete „%sâ€.\n" + +#: remake.c:853 +#, fuzzy, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Datoteku mete „%s†treba ponovo izraditi zbog -q.\n" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Koristim zadane naredbe za „%sâ€.\n" + +#: remake.c:1397 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Upozorenje: Vrijeme ureÄ‘ivanja datoteke „%s†je u budućnosti" + +#: remake.c:1411 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "" +"Upozorenje: Vrijeme ureÄ‘ivanja datoteke „%s†je %s sekundi u budućnosti" + +#: remake.c:1610 +#, fuzzy, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "Element „%s†iz .LIBPATTERNS nije uzorak" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs neće izvesti: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Implicitni propisi" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Nema implicitnih propisa." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u implicitnih propisa, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " zavrÅ¡ni." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: neispravan num_pattern_rules! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "nepoznat signal" + +#: signame.c:92 +msgid "Hangup" +msgstr "ZavrÅ¡etak" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Prekid" + +#: signame.c:98 +msgid "Quit" +msgstr "Izlaz" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Nedozvoljena instrukcija" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Zamka za praćenje/prekidnu toÄku" + +#: signame.c:109 +msgid "Aborted" +msgstr "Prekinut" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT zamka" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT zamka" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Iznimka pomiÄnog zareza" + +#: signame.c:121 +msgid "Killed" +msgstr "Prekinut" + +#: signame.c:124 +msgid "Bus error" +msgstr "SabirniÄka greÅ¡ka" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Segmentacijska greÅ¡ka" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Neispravan sustavski poziv" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Prekinut cjevovod" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Budilica" + +#: signame.c:139 +msgid "Terminated" +msgstr "ZavrÅ¡en" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "KorisniÄki definiran signal 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "KorisniÄki definiran signal 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Dijete je zavrÅ¡ilo" + +#: signame.c:156 +msgid "Power failure" +msgstr "Prekid napajanja" + +#: signame.c:159 +msgid "Stopped" +msgstr "Zaustavljen" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Zaustavljen (tty ulaz)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Zaustavljen (tty izlaz)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Zaustavljen (signalom)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "PrekoraÄeno ograniÄenje procesorskog vremena" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "PrekoraÄeno ograniÄenje veliÄine datoteke" + +# Kako prevesti "virtual timer"? +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtualna Å¡toperica istekla" + +# Kako prevesti "profiling timer"? +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Å toperica profiliranja istekla" + +#: signame.c:186 +msgid "Window changed" +msgstr "Promijenjen prozor" + +#: signame.c:189 +msgid "Continued" +msgstr "Nastavljen" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Hitno U/I stanje" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "U/I moguć" + +# Jesu li ova dva signala vic ili Å¡to? U svakom sluÄaju, ovo su samo +# descriptioni. Za svaki sluÄaj, nisam ih dirao. +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Resurs izgubljen" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Signal za opasnost" + +#: signame.c:217 +msgid "Information request" +msgstr "Zahtjev za informacijom" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Koprocesor za rad s pomiÄnim zarezom nije dostupan" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: strcache.c:266 +#, fuzzy, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" +"%s strcache koriÅ¡teno: ukupno = %d (%d) / max = %d / min = %d / prosjek = " +"%d\n" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, fuzzy, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" +"%s strcache koriÅ¡teno: ukupno = %d (%d) / max = %d / min = %d / prosjek = " +"%d\n" + +#: strcache.c:283 +#, fuzzy, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" +"%s strcache slobodno: ukupno = %d (%d) / max = %d / min = %d / prosjek = %d\n" + +#: strcache.c:287 +#, fuzzy, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s # nizova u strcache: %d / pretrage = %lu / pronalasci = %lu\n" + +#: strcache.c:289 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistike tablice rasprÅ¡ivanja datoteka:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automatsko" + +#: variable.c:1602 +msgid "default" +msgstr "zadano" + +#: variable.c:1605 +msgid "environment" +msgstr "okolina" + +#: variable.c:1608 +msgid "makefile" +msgstr "datoteka izrade" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "okolina pod -e" + +#: variable.c:1614 +msgid "command line" +msgstr "naredbeni redak" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "direktiva „overrideâ€" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (iz „%sâ€, redak %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# statistike tablice rasprÅ¡ivanja skupova varijabli:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Varijable\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Uzorcima svojstvene vrijednosti varijabli" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Nema uzorcima svojstvenih vrijednosti varijabli." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u uzorcima svojstvenih vrijednosti varijabli" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "upozorenje: nedefinirana varijabla „%.*sâ€" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() nije uspio s %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Upozorenje: Prazno preusmjeravanje\n" + +#: vmsjobs.c:183 +#, fuzzy, c-format +msgid "internal error: '%s' command_state" +msgstr "interna greÅ¡ka: „%s†command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-upozorenje, možda ćete morati ponovo omogućiti upravljanje s CTRL-Y iz DCL-" +"a.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "UGRAÄEN [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "UGRAÄEN CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "UGRAÄEN CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Nepoznata ugraÄ‘ena naredba „%sâ€\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "GreÅ¡ka, prazna naredba\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Preusmjeren ulaz iz %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Preusmjerene greÅ¡ke u %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Dodaj izlaz na %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Preusmjeren izlaz u %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Dodaj %.*s i poÄisti\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Umjesto toga, izvrÅ¡avam %s\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "GreÅ¡ka pri pokretanju, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH putanje za pretraživanje\n" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# Nema „vpath†putanja za pretraživanje." + +#: vpath.c:602 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u „vpath†putanja za pretraživanje.\n" + +#: vpath.c:605 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Nema općenite putanje za pretraživanje (varijabla „VPATHâ€)." + +#: vpath.c:611 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Općenita putanja za pretraživanje (varijabla „VPATHâ€):\n" +"# " + +#~ msgid "# Invalid value in `update_status' member!" +#~ msgstr "# Neispravna vrijednost u elementu „update_statusâ€!" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] GreÅ¡ka 0x%x (zanemarena)" + +#~ 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" + +#~ msgid "virtual memory exhausted" +#~ msgstr "virtualna memorija iscrpljena" + +# Å to bi ovdje trebalo ići? +#~ msgid "write error" +#~ msgstr "gresÌŒ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 "BUILTIN RM %s\n" +#~ msgstr "UGRAÄEN RM %s\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 mod 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/po/id.gmo b/po/id.gmo new file mode 100644 index 0000000..44d6423 Binary files /dev/null and b/po/id.gmo differ diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..ef0dd99 --- /dev/null +++ b/po/id.po @@ -0,0 +1,2395 @@ +# 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: 2014-10-05 12:25-0400\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" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "usaha untuk menggunakan layanan yang tidak didukung: '%s'" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "touch anggota archive tidak tersedia di VMS" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Archive '%s' tidak ada" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: '%s' bukan archive yang valid" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Anggota '%s' tidak terdapat dalam '%s'" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: Kode kembali tidak baik dari ar_member_touch pada '%s'" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module() gagal untuk mengekstrak info module, status = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() gagal dengan status = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "tidak dapat membuka perpustakaan '%s' untuk melihat anggota '%s'" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Anggota '%s'%s: %ld bytes pada %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (nama mungkin akan di potong)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Tanggal %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Recipe has too many lines (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Berhenti.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Anggota archive '%s' mungkin palsu: tidak dihapus" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Anggota archive '%s' mungkin palsu; tidak dihapus" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Menghapus berkas '%s'" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Menghapus berkas '%s'" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# perintah untuk dijalankan" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (bawaan):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (dari '%s', baris %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Direktori\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: tidak dapat melihat statistik.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (kunci %s, mtime %d): tidak dapat dibuka.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (perangkat %d, inode [%d,%d,%d]): tidak dapat dibuka.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (perangkat %ld, inode %ld): tidak dapat dibuka.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (kunci %s, mtime %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (perangkat %d, inode [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (perangkat %ld, inode %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Tidak" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " berkas, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "tidak" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " tidak mungkin" + +#: dir.c:1068 +msgid " so far." +msgstr " sejauh ini." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " tidak mungkin dalam direktori %lu.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Variabel rekursif '%s' menunjuk pada dirinya sendiri" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "referensi variabel tidak diselesaikan" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Perintah di spesifikasikan untuk berkas '%s' di %s:%lu," + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Perintah untuk berkas '%s' ditemukan dalam pencarian aturan implisit," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "" +"tetapi '%s' sekarang dipertimbangkan sebagai berkas yang sama dengan '%s'." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "Perintah untuk '%s' akan diabaikan untuk menghargai '%s'." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "tidak dapat mengubah nama dari kolon-tunggal '%s' ke kolon-ganda '%s'" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "tidak dapat mengubah nama kolon-ganda '%s' menjadi kolon-tunggal '%s'" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Menghapus berkas sementara '%s'" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Menghapus berkas sementara...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Waktu saat ini" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Timestamp diluar jangkauan; digantikan dengan %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Bukan sebuah target:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Berkas sebelumnya (dibutuhkan oleh .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Phony target (dibutuhkan oleh .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Baris perintah target." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Merupakan baku, MAKEFILES atau -include/sinclude makefile." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# Tidak ada aturan implisit." + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Pencarian aturan implisit sudah selesai." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Pencarian aturan implisit belum selesai." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Pola/implisit atau statis stem: '%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Berkas merupakan dibutuhkan untuk sementara." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Juga membuat:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Waktu ubah sudah diperiksa." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Berkas tidak ada." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Berkas sudah sangat tua." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Terakhir dimodifikasi %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Berkas sudah diperbarui." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Berkas belum diperbarui." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Perintah sedang berjalan (INI MERUPAKAN SEBUAH BUG)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Perintah ketergantungan sedang berjalan (INI MERUPAKAN SEBUAH BUG)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Sukses memperbarui." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Perlu untuk diupdate (-q diset)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Gagal untuk mengupdate." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Nilai yang salah dalam anggota 'command_state' !" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Berksa" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# berkas statistik hash-table:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Field '%s' not cached: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "argumen pertama untuk fungsi 'word' bukan numerik" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "argumen pertama untuk fungsi 'word' harus lebih besar dari 0" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "argumen pertama untuk fungsi 'wordlist' bukan numerik" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "argumen kedua dari fungsi 'wordlist' bukan numerik" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) gagal (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(Err) gagal (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() gagal (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() gagal\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Membersihkan berkas batch sementara %s\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "open: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "menulis: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "Invalid file operation: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "Jumlah dari argumen (%d) untuk fungsi '%s' tidak mencukupi" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "Tidak terimplementasi dalam platform ini: fungsi '%s'" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "fungsi '%s' tidak diselesaikan: hilang '%c'" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "Empty function name\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Invalid function name: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Function name too long: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "Jumlah dari argumen (%d) untuk fungsi %s tidak mencukupi\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "Jumlah dari argumen (%d) untuk fungsi %s tidak mencukupi\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: opsi '%s' merupakan ambigu\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: opsi '--%s' tidak memperbolehkan argumen\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: opsi '%c%s' tidak memperbolehkan argumen\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: opsi '%s' membutuhkan sebuah argumen\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: opsi tidak dikenali '--%s'\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: opsi tidak dikenali '%c%s'\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opsi tidak legal -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opsi tidak valid -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opsi membutuhkan sebuah argumen -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: opsi '-W %s' merupakan opsi ambigu\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: opsi '-W %s' tidak memperbolehkan sebuah argumen\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expanding '%s'\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Evaluating '%s'\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"tidak dapat mengalokasikan %lu bytes untuk tabel hash; kehabisan memory" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Beban=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Tabrakan=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Mencari aturan implisit untuk '%s'.\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Mencari aturan implisit untuk anggota-archive pada '%s'.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Menghindari aturan implisit rekursi.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Stem too long: '%.*s'.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Mencoba aturan pola dengan stem '%.*s'.\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Menolak persyaratan aturan yang tidak mungkin '%s'.\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Menolak persyaratan implisit yang tidak mungkin '%s'.\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Mencoba persyaratan dari aturan '%s'.\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Mencoba persyaratan implisit '%s'.\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Menemukan persyaratan '%s' sebagai VPATH '%s'\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Mencari aturan dengan berkas sementara '%s'.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Tidak dapat membuat berkas sementara\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (core di-dump)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (diabaikan)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: recipe for target '%s' failed" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Error %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Error 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Menunggu pekerjaan yang belum selesai...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Proses anak yang masih berjalan %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (remote)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Reaping anak hilang %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Reaping winning child %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Membersihkan berkas batch sementara %s\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Membersihkan berkas batch sementara %s failed (%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Menghilangkan proses anak %p PID %s%s dari rantai.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "release jobserver semaphore: (Error %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Melepaskan token dari proses anak %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "menulis jobserver" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() gagal untuk menjalankan proses (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Terhitung %d argumen gagal untuk dijalankan\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Meletakkan proses anak %p (%s) PID %s%s pada rantai proses.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "semaphore or child process wait: (Error %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Memperoleh token untuk proses anak %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "membaca pipa pekerjaan" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: archive '%s' tidak ada" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "" +"%s: tidak terdapat aturan untuk membuat target '%s', dibutuhkan oleh %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "tidak dapat memaksa mencapai batas beban pada sistem operasi ini" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "tidak dapat memaksa mencapai batas beban: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "tidak ada lagi file handles: tidak dapat menggandakan stdin\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "tidak ada lagi file handles: tidak dapat menggandakan stdout\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "tidak ada lagi file handles: tidak dapat menggandakan stderr\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Tidak dapat mengembalikan stdin\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Tidak dapat mengembalikan stdout\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Tidak dapat mengembalikan stderr\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make reaped child pid %s, tetap menunggu untuk pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Perintah tidak ada" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Shell program tidak ditemukan" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: mungkin kehabisan ruang environment" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL berubah (sebelumnya '%s', sekarang '%s')\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Membuat berkas batch sementara %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Batch file contents:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Batch file contents:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (baris %d) shell context tidak baik (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Failed to open global symbol table: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Loaded object %s is not declared to be GPL compatible" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Failed to load symbol %s from %s: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Empty symbol name for load: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Loading symbol %s from %s\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "Parallel jobs '-j' tidak didukung dalam platform ini." + +#: main.c:313 +msgid "Options:\n" +msgstr "Opsi:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Diabaikan untuk kompatibilitas.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Membuat semua target secara tidak " +"kondisional.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Menampilkan banyak informasi debug.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGS] Menampilkan berbagai tipe informasi debug.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Variabel lingkungan memaksa makefiles.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Tampilkan pesan ini dan keluar.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Abaikan kesalahan dari perintah yang " +"dijalankan.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Tetap jalan ketika target tidak dapat dibuat.\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +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" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Tampilkan basis data internal make.\n" + +#: main.c:360 +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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Aturan implisit bawaan tidak digunakan.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Non-aktifkan konfigurasi variabel bawaan.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Jangan menampilkan perintah.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Matikan opsi -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Sentuh target dari pada membuat kembali.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr "" +" --trace Menampilkan banyak informasi debug.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version Tampilkan versi dari make dan keluar.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Tampilkan directory saat ini.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "`string' kosong tidak valid sebagai nama file" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "spesifikasi tingkat debug tidak diketahui '%s'" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "unknown output-sync type '%s'" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Interupsi/Exception diterima (kode = 0x%lx, alamat = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Akses dilanggar: operasi tulis pada alamat 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Akses dilanggar: operasi baca pada alamat 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() diset pada default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell() jalur pencarian di set pada default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s dihentikan selama 30 detik..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "selesai tidur(30). Melanjutkan.\n" + +#: main.c:1527 +#, 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)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Jobserver client (semaphore %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "internal error: tidak valid --jobserver-fds string '%s'" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Jobserver client (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"Peringatan: -jN dipaksakan dalam submake: non-aktifkan mode server pekerja." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "dup server pekerja" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"Peringatan: server pekerja tidak ada: menggunakan -j1. Tambahkan '+' pada " +"aturan make paling atas." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile dari standard input dispesifikasikan dua kali." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (berkas sementara)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (berkas sementara)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Parallel jobs (-j) tidak didukung dalam platform ini." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Mereset kembali ke mode satu job (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Jobserver slots limited to %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "creating jobserver semaphore: (Error %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "membuat pipa pekerjaan" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "inisiasi pipa server pekerja" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Symbolic links tidak didukung: menonaktifkan opsi -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Memperbarui makefiles....\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Makefile '%s' mungkin berupa loop; tidak membuat lagi.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Gagal membuat lagi makefile '%s'." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Makefile yang dimasukan '%s' tidak ditemukan." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefile '%s' tidak ditemukan" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Tidak dapat kembali ke direktori asal." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Menjalankan kembali[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (berkas sementara): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL berisi lebih dari satu target" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Target tidak dispesifikasikan dan tidak ditemukan makefile" + +#: main.c:2511 +msgid "No targets" +msgstr "Tidak ada targets" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Memperbarui tujuan target....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"Peringatan: Clock skew terdeteksi. Pembuatan anda mungkin tidak sempurna" + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Penggunaan: %s [opsi] [target] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Program ini dibuat untuk %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Program ini dibuat untuk %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "Laporkan bugs kepada \n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "opsi '%s%s' membutuhkan sebuah argument string yang tidak kosong" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "opsi '-%c' membutuhkan sebuah argument `string' yang tidak kosong" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sAplikasi ini dibuat untuk %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sAplikasi ini dibuat untuk %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Membuat basis data, ditampilkan %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Selesai membuat basis data %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Kesalahan tidak diketahui %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: pengguna %lu (ril %lu), grup %lu (ril %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Akses terinisialisasi" + +#: misc.c:622 +msgid "User access" +msgstr "Akses pengguna" + +#: misc.c:670 +msgid "Make access" +msgstr "Buat akses" + +#: misc.c:704 +msgid "Child access" +msgstr "Akses anak" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Memasuki sebuah direktori yang tidak diketahui\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Meninggalkan sebuah direktori yang tidak diketahui\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Memasuki direktori '%s'\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Meninggalkan direktori '%s'\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Memasuki sebuah direktori yang tidak diketahui\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Meninggalkan sebuah direktori yang tidak diketahui\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Memasuki direktori '%s'\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Meninggalkan direktori '%s'\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "error menulis: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Berhenti.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Membaca makefiles...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Membaca makefile '%s'" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (tidak terdapat tujuan baku)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (jalur pencarian)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (tidak peduli)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (tidak terdapat ekspansi tilde ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "Skipping UTF-8 BOM in makefile '%s'\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Skipping UTF-8 BOM in makefile buffer\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "sintak salah dalam kondisional" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: failed to load" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "perintah dijalankan sebelum target pertama" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "hilang aturan sebelum menjalankan perintah" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (apakah yang anda maksud TAB dari pada 8 buah spasi?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "pemisah %s hilang" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "pola target hilang" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "pola target banyak" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "pola target tidak memiliki '%%'" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "hilang 'endif'" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "nama variabel kosong" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "Kelebihan text sesudah 'endef' directive" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "hilang 'endef', tidak diselesaikan 'define'" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "kelebihan text sesudah 'endef' directive" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "kelebihan text sesudah '%s' directive" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "kelebihan '%s'" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "hanya satu 'else' dalam setiap kondisi" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Definisi variable target-specific memiliki format yang salah" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "persyaratan tidak dapat didefinisikan dalam script perintah" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "aturan pola implisit dan static tercampur" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "aturan implisit dan aturan normal tercampur" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "target '%s' tidak cocok dengan pola target" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "target berkas '%s' keduanya memiliki masukan : dan ::" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "target '%s' memberikan lebih dari sekali dalam aturan sama." + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "peringatan: memaksa perintah untuk target '%s'" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "peringatan: menghiraukan perintah lama untuk target '%s'" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "aturan implisit dan aturan normal tercampur" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "peringatan: karakter NUL terlihat; baris selanjutnya dihiraukan" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Tidak ada yang harus dilakukan untuk '%s'." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "'%s' sudah baru." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Pruning file '%s'.\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "" +"%sTidak terdapat aturan untuk membuat target '%s', dibutuhkan oleh '%s'%s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sTidak terdapat aturan untuk membuat target '%s'%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Mempertimbangkan berkas target '%s'.\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Baru saja dicoba dan gagal untuk memperbarui berkas '%s'.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Berkas '%s' baru saja dipertimbangkan.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Sedang memperbarui berkas '%s'.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Selesai memperbarui berkas '%s'.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Berkas '%s' tidak ada.\n" + +#: remake.c:495 +#, 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" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Ditemukan sebuah aturan implisit untuk '%s'.\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Tidak terdapat aturan implisit untuk membuat '%s'.\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Menggunakan perintah baku untuk '%s'.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Ketergantungan %s <- %s melingkar dijatuhkan." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Selesai melakukan semua persyaratan untuk berkas target '%s'.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Persyaratan untuk membuat '%s' sedang dibuat.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Menyerah untuk membuat target berkas '%s'.\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Target '%s' tidak dibuat lagi karena ada errors." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Persyaratan untuk '%s' adalah order-only untuk target '%s'.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Persyaratan untuk '%s' untuk target '%s' tidak ada.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Persyaratan untuk '%s' lebih baru dari pada target '%s'.\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Persyaratan untuk '%s' lebih tua dari pada target '%s'.\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Target '%s' merupakan kolon-ganda dan tidak memiliki syarat.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "Tidak ada perintah untuk '%s' dan persyaratan tidak berubah.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Membuat '%s' karena adanya tanda always-make.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Tidak perlu membuat lagi target '%s'" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; menggunakan nama VPATH '%s'" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Harus membuat lagi target '%s'.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Mengabaikan nama VPATH '%s'.\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Perintah dari '%s' sedang dijalankan.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Gagal membuat lagi target berkas '%s'.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Sukses membuat kembali target berkas '%s'.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Target berkas '%s' dibutuhkan untuk membuat kembali dengan opsi -q.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Menggunakan perintah baku untuk '%s'.\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Peringatan: Berkas '%s' memiliki waktu modifikasi dimasa depan" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Peringatan: Berkas '%s' memiliki waktu modifikasi %s s kedepan" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS elemen '%s' bukan merupakan sebuah pattern" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Custom tidak akan men-export: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Aturan implisit." + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Tidak ada aturan implisit." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u aturan implisit, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminal." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: num_pattern_rules salah! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "sinyal tidak diketahui" + +#: signame.c:92 +msgid "Hangup" +msgstr "Hangup" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Interupsi" + +#: signame.c:98 +msgid "Quit" +msgstr "Berhenti" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Instruksi Tidak Legal" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Penangkap trace/breakpoint" + +#: signame.c:109 +msgid "Aborted" +msgstr "Dibatalkan" + +#: signame.c:112 +msgid "IOT trap" +msgstr "Penangkap IOT" + +#: signame.c:115 +msgid "EMT trap" +msgstr "Penangkap EMT" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Eksepsi titik pecahan" + +#: signame.c:121 +msgid "Killed" +msgstr "Terbunuh" + +#: signame.c:124 +msgid "Bus error" +msgstr "Bus error" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Kesalahan segmentasi" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Panggilan sistem buruk" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Pipa rusak" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Alarm" + +#: signame.c:139 +msgid "Terminated" +msgstr "Dimatikan" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Sinyal definisi pengguna 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Sinyal definisi pengguna 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Proses anak berakhir" + +#: signame.c:156 +msgid "Power failure" +msgstr "Listrik bermasalah" + +#: signame.c:159 +msgid "Stopped" +msgstr "Dihentikkan" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Dihentikan (masukkan tty)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Dihentikan (keluaran tty)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Dihentikan (sinyal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Batas waktu CPU telah terlampaui" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Batas maksimal ukuran berkas terlampaui" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Pewaktu maya habis" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Pewaktu profiling habis" + +#: signame.c:186 +msgid "Window changed" +msgstr "Jendela berubah" + +#: signame.c:189 +msgid "Continued" +msgstr "Dilanjutkan" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Kondisi I/O penting" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "I/O mungkin" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Resource hilang" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Sinyal bahaya" + +#: signame.c:217 +msgid "Information request" +msgstr "Permintaan informasi" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "co-processor titik pecahan tidak tersedia" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s # dari buffer strcache: \n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "besar %s strcache: total = %lu / count = %lu / rata-rata = %lu\n" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" +"%s strcache free: total = %lu / mak = %lu / min = %lu / rata-rata = %hu\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# berkas statistik hash-table:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "otomatis" + +#: variable.c:1602 +msgid "default" +msgstr "baku" + +#: variable.c:1605 +msgid "environment" +msgstr "lingkungan" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "lingkungan dibawah opsi -e" + +#: variable.c:1614 +msgid "command line" +msgstr "baris perintah" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "'override' direktif" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (dari '%s', baris %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# statistik variable set hash-table:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabel\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Nilai Variabel Pola-Spesifik" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Tidak terdapat nilai variabel pola-spesifik" + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u nilai variabel pola-spesifik" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "peringatan: variabel '%.*s' tidak terdefinisi" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() gagal dengan kode %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Peringatan: redirection kosong\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "kesalahan internal: '%s' command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-warning, kamu mungkin telah mengaktifkan pengontrolan CTRL-Y dari DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BAWAAN [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BAWAAN CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "BAWAAN CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Perintah bawaan '%s' tidak diketahui\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Error, perintah kosong\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Meneruskan masukan dari %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Meneruskan error ke %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Meneruskan output ke %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Meneruskan output ke %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Append %.*s and cleanup\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Menjalankan perintah %s\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Gagal spawning, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Jalur Pencarian\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Tidak ada 'vpath' dalam jalur pencarian." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u 'vpath' jalur pencarian.\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Tidak ada ('VPATH' variabel) umum dalam jalur pencarian." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Jalur pencarian umum untuk variabel 'VPATH':\n" +"# " + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "internal error: opsi --sync-mutex lebih dari satu" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "internal error: opsi --jobserver-fds lebih dari satu" + +#~ msgid "virtual memory exhausted" +#~ msgstr "Kehabisan memori maya" + +#~ msgid "write error" +#~ msgstr "error menulis" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "BAWAAN RM %s\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/po/insert-header.sin b/po/insert-header.sin new file mode 100644 index 0000000..b26de01 --- /dev/null +++ b/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/po/it.gmo b/po/it.gmo new file mode 100644 index 0000000..dd76258 Binary files /dev/null and b/po/it.gmo differ diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..6502255 --- /dev/null +++ b/po/it.po @@ -0,0 +1,2330 @@ +# 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-2013. +# +msgid "" +msgstr "" +"Project-Id-Version: make 4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-10-11 14:58+0200\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" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "tentativo di usare una funzionalità non supportata: \"%s\"" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "touch del membro di archivio non disponibile su VMS" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: l'archivio \"%s\" non esiste" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: \"%s\" non è un archivio valido" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: il membro \"%s\" non esiste in \"%s\"" + +#: 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\"" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"lbr$set_module() non è riuscita a estrarre informazioni sul modulo, stato = " +"%d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() non riuscita con lo stato = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "impossibile aprire la libreria \"%s\" per cercare il membro \"%s\"" + +#: 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" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (il nome potrebbe essere troncato)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Data %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modo = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Il set di istruzioni ha troppe righe (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Interruzione.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "" +"*** [%s] Il membro di archivio \"%s\" potrebbe essere inesistente; non " +"eliminato" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "" +"*** Il membro di archivio \"%s\" potrebbe essere inesistente; non eliminato" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Eliminazione del file \"%s\"" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Eliminazione del file \"%s\"" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# set di istruzioni da eseguire" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (comando interno):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (da \"%s\", riga %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directory\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: impossibile eseguire stat.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (key %s, mtime %d) non può essere aperto.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (device %d, inode [%d,%d,%d]) non può essere aperto.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (device %ld, inode %ld) non può essere aperto.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (key %s, mtime %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (device %d, inode [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (device %ld, inode %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "No" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " file, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "no" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " impossibilità" + +#: dir.c:1068 +msgid " so far." +msgstr " finora." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilità nelle directory %lu.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "La variabile ricorsiva \"%s\" si autoreferenzia (alla fine)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "riferimento alla variabile non terminato" + +#: file.c:271 +#, 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," + +#: file.c:276 +#, 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," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "ma ora \"%s\" viene considerato lo stesso file di \"%s\"." + +#: file.c:283 +#, 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" +"\"." + +#: file.c:303 +#, 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\"" + +#: file.c:309 +#, 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\"" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Eliminazione del file intermedio \"%s\"" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Rimozione dei file intermedi...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Ora corrente" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: intervallo errato per la marcatura temporale; sostituzione di %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Non è un obiettivo:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# File \"precious\" (prerequisito di .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Obiettivo \"phony\" (prerequisito di .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Obiettivo a riga di comando." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Un makefile predefinito, da MAKEFILES, o da -include/sinclude." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# Regola incorporata" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Regola di ricerca implicita completata." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Regola di ricerca implicita non completata." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Stem implicito/statico del modello: \"%s\"\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Il file è un prerequisito intermedio." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Inoltre, genera:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Ora di modifica mai controllata." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Il file non esiste." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Il file è molto vecchio." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Ultima modifica %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Il file è stato aggiornato." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Il file non è stato aggiornato." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Set di istruzioni attualmente in esecuzione (QUESTO È UN BUG)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Dipendenze del set di istruzioni in esecuzione (QUESTO È UN BUG)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Aggiornato con successo." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Richiede di essere aggiornato (-q è impostato)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Aggiornamento non riuscito." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Valore illecito nel membro \"command_state\"!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# File" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistiche tabella hash dei file:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Campo \"%s\" non memorizzato: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "primo argomento non numerico per la funzione \"word\"" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "il primo argomento per la funzione \"word\" deve essere maggiore di 0" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "primo argomento non numerico per la funzione \"wordlist\"" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "secondo argomento non numerico per la funzione \"wordlist\"" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) non riuscita (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_open_pipe: DuplicateHandle(Err) non riuscita (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() non riuscita (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() non riuscita\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Pulitura del file batch temporaneo %s\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "apertura: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "scrittura: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "Operazione sui file non valida: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "numero di argomenti non sufficienti (%d) per la funzione \"%s\"" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "non implementata su questa piattaforma: funzione \"%s\"" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "chiamata non terminata alla funzione \"%s\": \"%c\" mancante" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "Nome della funzione vuoto\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Nome della funzione non valido: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Nome della funzione troppo lungo: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "numero di argomenti non sufficienti (%d) per la funzione \"%s\"\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "numero di argomenti non sufficienti (%d) per la funzione \"%s\"\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: l'opzione \"%s\" è ambigua\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: l'opzione \"--%s\" non ammette argomenti\n" + +#: 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" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: l'opzione \"%s\" richiede un argomento\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: opzione \"--%s\" sconosciuta\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: opzione \"%c%s\" sconosciuta\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opzione illecita -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opzione illecita -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: l'opzione richiede un argomento -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: l'opzione \"-W %s\" è ambigua\n" + +#: 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" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Espansione di \"%s\"\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Valutazione di \"%s\"\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "impossibile allocare %lu byte per la tabella hash: memoria esaurita" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Carico=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Collisioni=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Ricerca di una regola implicita per \"%s\".\n" + +#: 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" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitata la ricorsione della regola implicita.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Stem troppo lungo: \"%.*s\".\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Tentativo di usare la regola del modello con stem \"%.*s\".\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Prerequisito impossibile \"%s\" della regola rifiutato.\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Prerequisito implicito impossibile \"%s\" rifiutato.\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Tentativo di usare il prerequisito della regola \"%s\".\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Tentativo di usare il prerequisito implicito \"%s\".\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Trovato il prerequisito \"%s\" come VPATH \"%s\"\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Ricerca di una regola con il file intermedio \"%s\".\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Impossibile creare un file temporaneo\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (creato dump del core)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (ignorato)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: set di istruzioni per l'obiettivo \"%s\" non riuscito" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Errore %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Errore 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Attesa per i processi non terminati...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Processo figlio vivo %p (%s) con PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (remoto)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Interruzione del processo figlio perdente %p con PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Interruzione del processo figlio vincente %p con PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Pulitura del file batch temporaneo %s\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Pulitura del file batch temporaneo %s non riuscita (%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" +"Rimozione del processo figlio %p con PID %s%s dalla catena di esecuzione.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "rilascio del semaforo del jobserver: (Errore %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Token rilasciato per il processo figlio %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "scrittura del jobserver" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() non riuscita all'avvio del processo (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Contati %d argomenti nell'avvio fallito\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" +"Inserimento del processo figlio %p (%s) con PID %s%s nella catena di " +"esecuzione.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "attendere semaforo o processo figlio (Errore %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Token ottenuto per il processo figlio %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "lettura della pipe dei processi" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: l'obbiettivo \"%s\" non esiste" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: aggiorna l'obbiettivo \"%s\" a causa di: %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "" +"impossibile far rispettare i limiti di carico su questo sistema operativo" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "impossibile far rispettare il limite di carico: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"nessun'altra gestione del file: impossibile duplicare lo standard input\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"nessun'altra gestione del file: impossibile duplicare lo standard output\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" +"nessun'altra gestione del file: impossibile duplicare lo standard error\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Impossibile ripristinare lo standard input\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Impossibile ripristinare lo standard output\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Impossibile ripristinare lo standard error\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"make ha interrotto il processo figlio con pid %s, è ancora in attesa del " +"processo con pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: comando non trovato" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: shell non trovata" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: lo spazio dell'ambiente potrebbe essere esaurito" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL cambiata (era \"%s\", adesso è \"%s\")\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Creazione del file batch temporaneo %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Contenuti del file batch:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Contenuti del file batch:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (riga %d) contesto della shell errato (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "-O[TIPO] (--output-sync[=TIPO]) non è configurato per questa versione." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Apertura della tabella dei simboli globale non riuscita: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "L'oggetto caricato %s non è dichiarato compatibile con la licenza GPL" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Caricamento del simbolo %s da %s non riuscito: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Nome del simbolo vuoto per il caricamento: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Caricamento del simbolo %s da %s\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "L'operazione \"load\" non è supportata su questa piattaforma." + +#: main.c:313 +msgid "Options:\n" +msgstr "Opzioni:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorato per compatibilità.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Genera tutti gli obiettivi " +"incondizionatamente.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Mostra molte informazioni di debug.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGS] Mostra diversi tipi di informazioni di debug.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Le variabili ambiente sovrascrivono i " +"makefile.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=TESTO Analizza STRINGA come estratta dal makefile.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Mostra questo messaggio ed esce.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Ignora gli errori dai set di istruzioni.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Continua l'esecuzione quando non è possibile " +"creare alcuni obiettivi.\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +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" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Stampa il database interno di make.\n" + +#: main.c:360 +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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Disabilita le regole implicite interne.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Disabilita le impostazioni delle variabili " +"interne.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Non visualizza i set di istruzioni.\n" + +#: main.c:368 +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' +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Esegue il touch degli obiettivi invece di " +"ricrearli.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace Stampa informazioni di tracciamento.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Stampa il numero di versione di make ed esce.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Stampa la directory corrente.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "una stringa vuota non è valida come nome di file" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "livello di debug specificato sconosciuto \"%s\"" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "tipo di output-sync (sincronizzazione dell'output) sconosciuto \"%s\"" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s: catturata una interruzione/eccezione (codice = 0x%lx, indirizzo = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Violazione accesso: operazione di scrittura all'indirizzo 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Violazione accesso: operazione di lettura all'indirizzo 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() impostazione default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"find_and_set_shell() impostazione del percorso di ricerca default_shell = " +"%s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s viene sospeso per 30 secondi..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) eseguito. Continuazione.\n" + +#: main.c:1527 +#, 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)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Client del jobserver (semaforo %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "errore interno: stringa illecita per --jobserver-fds \"%s\"" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Client del jobserver (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"attenzione: -jN forzata nel submake: disattivazione della modalità jobserver." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "jobserver duplicato" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"attenzione: jobserver non disponibile, viene usato -j1. Aggiungere \"+\" " +"alla regola make superiore." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Il Makefile dallo standard input è stato specificato due volte." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (file temporaneo)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (file temporaneo)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "I processi paralleli (-j) non sono supportati su questa piattaforma." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Reimpostazione alla modalità a singolo processo (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Slot del jobserver limitati a %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "Creazione del semaforo del jobserver: (Errore %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "creazione della pipe dei processi" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "inizializzazione nella pipe della modalità jobserver" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Collegamenti simbolici non supportati: opzione -L disabilitata." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Aggiornamento dei makefile....\n" + +#: main.c:2158 +#, 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" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Riesecuzione del makefile \"%s\" non riuscita." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Il makefile \"%s\" incluso non è stato trovato." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Il makefile \"%s\" non è stato trovato" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Impossibile ritornare alla directory originale." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Riesecuzione[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (file temporaneo): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL contiene più di un obiettivo" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Nessun obiettivo specificato e nessun makefile trovato" + +#: main.c:2511 +msgid "No targets" +msgstr "Nessun obiettivo" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Aggiornamento degli obiettivi....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"attenzione: rilevato un tempo alterato. La creazione potrebbe essere " +"incompleta." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uso: %s [opzioni] [obiettivo] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Questo programma è stato compilato per %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Questo programma è stato compilato per %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "Segnalare i bug a \n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "l'opzione \"%s%s\" richiede un argomento stringa non vuoto" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "l'opzione \"-%c\" richiede un argomento intero positivo" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sCompilato per %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sCompilato per %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Generazione del database delle informazioni, creato il %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Generazione del database completata il %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Errore %d sconosciuto" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: utente %lu (reale %lu), gruppo %lu (reale %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Accesso inizializzato" + +#: misc.c:622 +msgid "User access" +msgstr "Accesso utente" + +#: misc.c:670 +msgid "Make access" +msgstr "Accesso make" + +#: misc.c:704 +msgid "Child access" +msgstr "Accesso processo figlio" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: ingresso in una directory sconosciuta\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: uscita dalla directory sconosciuta\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: ingresso nella directory \"%s\"\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: uscita dalla directory \"%s\"\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: ingresso in una directory sconosciuta\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: uscita dalla directory sconosciuta\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: ingresso nella directory \"%s\"\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: uscita dalla directory \"%s\"\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "errore in scrittura: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Arresto.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Lettura dei makefile...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Lettura del makefile \"%s\"" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (nessun obiettivo predefinito)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (percorso di ricerca)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (ignora)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (nessuna espansione per \"~\")" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "UTF-8 BOM nel makefile \"%s\" saltato\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "UTF-8 BOM nel makefile buffer saltato\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "sintassi illecita nel condizionale" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: caricamento non riuscito" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "il set di istruzioni inizia prima del primo obiettivo" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "regola mancante prima del set di istruzioni" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (si intendeva TAB invece di 8 spazi?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "separatore %s mancante" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "modello mancante per l'obiettivo" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "modelli multipli per l'obiettivo" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "il modello dell'obiettivo non contiene alcun \"%%\"" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "\"endif\" mancante" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "nome vuoto della variabile" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "testo non pertinente dopo la direttiva \"define\"" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "\"endef\" mancante, \"define\" non terminato" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "testo non pertinente dopo la direttiva \"endef\"" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "testo non pertinente dopo la direttiva \"%s\"" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "\"%s\" non pertinente" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "un solo \"else\" per condizionale" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Definizione malformata della variabile specifica per l'obiettivo" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "i prerequisiti non possono essere definiti nei set di istruzioni" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "regole del modello implicite e statiche miste" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "regole implicite e normali miste" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "" +"il \"%s\" dell'obiettivo non corrisponde al modello dell'obiettivo stesso" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "Il file dell'obiettivo \"%s\" contiene sia : che ::" + +#: read.c:2112 +#, 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" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "" +"attenzione: sovrascrittura del set di istruzioni per l'obiettivo \"%s\"" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "" +"attenzione: ignorato il set di istruzioni obsoleto per l'obiettivo \"%s\"" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "regole implicite e normali miste" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" +"attenzione: è stato rilevato il carattere NUL; il resto della riga viene " +"ignorato" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Nessuna operazione da eseguire per \"%s\"." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "\"%s\" è aggiornato." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Pulizia del file \"%s\".\n" + +#: remake.c:390 remake.c:393 +#, 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" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%s Nessuna regola per generare l'obiettivo \"%s\"%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Considerato il file obiettivo \"%s\".\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Tentativo recente di aggiornamento del file \"%s\" non riuscito.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Il file \"%s\" è già stato esaminato.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "L'aggiornamento del file \"%s\" è ancora in corso.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Aggiornamento del file \"%s\" terminato.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Il file \"%s\" non esiste.\n" + +#: remake.c:495 +#, 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" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Trovata una regola implicita per \"%s\".\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Nessuna regola implicita trovata per \"%s\".\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Uso del set di istruzioni predefinito per \"%s\".\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Dipendenza circolare %s <- %s scartata." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Prerequisiti del file obiettivo \"%s\" terminati.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Generazione dei prerequisiti di \"%s\" in corso.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Abbandono sul file obiettivo \"%s\".\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "L'obiettivo \"%s\" non è stato rigenerato a causa di errori." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Il prerequisito \"%s\" è solo per l'obiettivo \"%s\".\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Il prerequisito \"%s\" dell'obiettivo \"%s\" non esiste.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Il prerequisito \"%s\" è più nuovo di quello dell'obiettivo \"%s\".\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "" +"Il prerequisito \"%s\" è più vecchio di quello dell'obiettivo \"%s\".\n" + +#: remake.c:783 +#, 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" + +#: remake.c:790 +#, 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" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Generazione di \"%s\" a causa del flag \"always-make\".\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Non è necessario rigenerare l'obiettivo \"%s\"" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; uso del nome VPATH \"%s\"" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "L'obiettivo \"%s\" deve essere rigenerato.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " nome VPATH \"%s\" ignorato.\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Esecuzione del set di istruzioni per \"%s\" in corso.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Rigenerazione del file obiettivo \"%s\" non riuscita.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "File obiettivo \"%s\" rigenerato correttamente.\n" + +#: remake.c:853 +#, 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" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Uso dei comandi predefiniti per \"%s\".\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Attenzione: il file \"%s\" ha un orario di modifica nel futuro" + +#: remake.c:1411 +#, 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" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "l'elemento .LIBPATTERNS \"%s\" non è un modello" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Le personalizzazioni non verranno esportate: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Regole implicite" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Regole non implicite." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u regole implicite, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminale." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: num_pattern_rules è errato! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "segnale sconosciuto" + +#: signame.c:92 +msgid "Hangup" +msgstr "Chiusura" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Interruzione" + +#: signame.c:98 +msgid "Quit" +msgstr "Uscita (con core dump)" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Istruzione illecita" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Rilevato trace/breakpoint" + +#: signame.c:109 +msgid "Aborted" +msgstr "Annullato" + +#: signame.c:112 +msgid "IOT trap" +msgstr "Rilevato IOT" + +#: signame.c:115 +msgid "EMT trap" +msgstr "Rilevato EMT" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Eccezione in virgola mobile" + +#: signame.c:121 +msgid "Killed" +msgstr "Ucciso" + +#: signame.c:124 +msgid "Bus error" +msgstr "Errore di bus" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Errore di segmentazione" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Chiamata di sistema errata" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Pipe interrotta" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Sveglia" + +#: signame.c:139 +msgid "Terminated" +msgstr "Terminato" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Segnale 1 definito dall'utente" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Segnale 2 definito dall'utente" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Processo figlio uscito" + +#: signame.c:156 +msgid "Power failure" +msgstr "Mancanza di alimentazione elettrica" + +#: signame.c:159 +msgid "Stopped" +msgstr "Fermato (da terminale)" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Fermato (input tty)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Fermato (output tty)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Fermato" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Limite di tempo CPU superato" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Superato il limite di dimensione file" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Timer virtuale terminato" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Timer di profiling terminato" + +#: signame.c:186 +msgid "Window changed" +msgstr "Finestra modificata" + +#: signame.c:189 +msgid "Continued" +msgstr "Continuato" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Condizioni di I/O urgente" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "I/O consentito" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Risorsa persa" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Segnale di pericolo" + +#: signame.c:217 +msgid "Information request" +msgstr "Richiesta informazioni" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Co-processore a virgola mobile non disponibile" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s buffer strcache assenti\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s buffer corrente: dimensione = %hu B / usato = %hu B / count = %hu / media " +"= %hu B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s altra usata: totale = %lu B / count = %lu / media = %lu B\n" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" +"%s altra libera: totale = %lu B / max = %lu B / min = %lu B / media = %hu B\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s prestazioni strcache: lookups = %lu / hit rate = %lu%%\n" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# statistiche della tabella hash:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automatico" + +#: variable.c:1602 +msgid "default" +msgstr "predefinito" + +#: variable.c:1605 +msgid "environment" +msgstr "ambiente" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "ambiente con l'opzione -e" + +#: variable.c:1614 +msgid "command line" +msgstr "riga di comando" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "direttiva \"override\"" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (da \"%s\", riga %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# statistiche tabella di hash del set di variabili:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabili\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valori di variabile non specifici per il modello." + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Nessun valore per la variabile \"pattern-specific\"." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valori di variabile specifici per il modello." + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "attenzione: variabile \"%.*s\" non definita" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() non riuscita con %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Attenzione: redirezione vuota\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "errore interno: command_state \"%s\"" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-attenzione, potrebbe essere necessario riabilitare la gestione di CTRL+Y da " +"DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "[%s] INTERNO [%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "CD INTERNO %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "CD INTERNO %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Comando interno \"%s\" sconosciuto\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Errore, comando vuoto\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Input rediretto da %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Errore rediretto a %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Accoda output a %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Output rediretto a %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Accoda %.*s e pulisce\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Verrà invece eseguito %s\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Errore nella generazione, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Percorsi di ricerca VPATH\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Percorsi di ricerca \"vpath\" assenti." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u 'vpath' percorsi di ricerca.\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Percorso di ricerca non generale (variabile \"VPATH\")." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Percorso di ricerca generale (variabile \"VPATH\"):\n" +"# " + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "errore interno: opzioni multiple per --sync-mutex" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "errore interno: opzioni multiple per --jobserver-fds" + +#~ msgid "virtual memory exhausted" +#~ msgstr "memoria virtuale esaurita" + +#~ msgid "write error" +#~ msgstr "errore in scrittura" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "RM INTERNO %s\n" + +#~ msgid "# Invalid value in 'update_status' member!" +#~ msgstr "# Valore illecito nel membro \"update_status\"!" + +#~ msgid "unknown trace mode '%s'" +#~ msgstr "modo di tracciamento \"%s\" sconosciuto" + +#~ msgid "*** [%s] Error 0x%x (ignored)" +#~ msgstr "*** [%s] Errore 0x%x (ignorato)" + +#~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +#~ msgstr "" +#~ "Chiamata del set di istruzioni da %s:%lu per aggiornare l'obiettivo \"%s" +#~ "\".\n" + +#~ msgid "Invoking builtin recipe to update target `%s'.\n" +#~ msgstr "" +#~ "Chiamata del set di istruzioni interno per aggiornare l'obiettivo \"%s" +#~ "\".\n" + +#~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +#~ msgstr "%s # di buffer strcache: %d (* %d B/buffer = %d B)\n" + +#~ msgid "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# statistiche tabella hash di strcache:\n" +#~ "# " diff --git a/po/ja.gmo b/po/ja.gmo new file mode 100644 index 0000000..f79bcbd Binary files /dev/null and b/po/ja.gmo differ diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..355e30d --- /dev/null +++ b/po/ja.po @@ -0,0 +1,2330 @@ +# Japanese message catalog for make 4.0 +# 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 +# +msgid "" +msgstr "" +"Project-Id-Version: make 4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2014-05-03 23:00+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-Poedit-Basepath: /factory/ja-po/make/make-4.0\n" +"X-Generator: Poedit 1.5.4\n" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„機能を使ãŠã†ã¨ã—ã¦ã„ã¾ã™: '%s'" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "VMS ã§ã¯æ›¸åº«ã®ãƒ¡ãƒ³ãƒã‚’ touch ã™ã‚‹æ©Ÿèƒ½ãŒã‚ã‚Šã¾ã›ã‚“" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: 書庫 '%s' ãŒã‚ã‚Šã¾ã›ã‚“" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "'%s' ã¯æœ‰åŠ¹ãªæ›¸åº«ã§ã¯ã‚ã‚Šã¾ã›ã‚“" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: メンム'%s' 㯠'%s' 内ã«å­˜åœ¨ã—ã¾ã›ã‚“" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: '%s' ã¸ã® ar_member_touch ã‹ã‚‰ç•°å¸¸ãªå€¤ãŒè¿”ã‚Šã¾ã—ãŸ" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module() ãŒãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«æƒ…å ±ã®æŠ½å‡ºã«å¤±æ•—ã—ã¾ã—ãŸ. 状態 = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() ãŒå¤±æ•—ã—ã¾ã—ãŸ. 状態 = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "ライブラリ '%s' ã‚’é–‹ã‘ãªã„ãŸã‚, メンム'%s' ã®æ¤œç´¢ãŒã§ãã¾ã›ã‚“" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "メンム'%s'%s: %ld ãƒã‚¤ãƒˆ at %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (åå‰ãŒåˆ‡ã‚Šè©°ã‚られãŸã‹ã‚‚)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " 日付 %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "レシピã®è¡Œæ•°ãŒå¤šã™ãŽã¾ã™ (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** 中断.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] 書庫ã®ãƒ¡ãƒ³ãƒ '%s' ã¯å¤šåˆ†å½ç‰©ã§ã™ ― 削除ã—ã¾ã›ã‚“ã§ã—ãŸ" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** 書庫ã®ãƒ¡ãƒ³ãƒ '%s' ã¯å¤šåˆ†å½ç‰©ã§ã™ ― 削除ã—ã¾ã›ã‚“ã§ã—ãŸ" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] ファイル '%s' を削除ã—ã¾ã™" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** ファイル '%s' を削除ã—ã¾ã™" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# 実行ã™ã‚‹ãƒ¬ã‚·ãƒ”" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (ビルトイン):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (ファイル '%s', %lu 行目):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# ディレクトリ\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: 状態を調ã¹ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (key %s, mtime %d): é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (device %d, inode [%d,%d,%d]): é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (device %ld, inode %ld): é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (key %s, mtime %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (device %d, inode [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (device %ld, inode %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "0" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " 個ã®ãƒ•ã‚¡ã‚¤ãƒ«, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "0" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " 個ã®é©ç”¨ä¸èƒ½ãƒ•ã‚¡ã‚¤ãƒ«å" + +#: dir.c:1068 +msgid " so far." +msgstr " (ã“ã“ã¾ã§ã«)." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " 個ã®é©ç”¨ä¸èƒ½ãƒ•ã‚¡ã‚¤ãƒ«å (%lu 個ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…).\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "å†å¸°çš„変数 '%s' ãŒ(最終的ã«)ãれ自身をå‚ç…§ã—ã¦ã„ã¾ã™" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "終端ã®ãªã„変数å‚ç…§" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "ファイル '%s' ã®ãŸã‚ã®ã®ãƒ¬ã‚·ãƒ”㌠%s:%lu ã§æŒ‡å®šã•ã‚Œã¾ã—ãŸ," + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "ファイル '%s' ã®ãŸã‚ã®ãƒ¬ã‚·ãƒ”ãŒæš—黙ルールã®æŽ¢ç´¢ã§è¦‹ã¤ã‹ã‚Šã¾ã—ãŸ," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "ã—ã‹ã—今㯠'%s' 㨠'%s' ã¯åŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã¨è¦‹ãªã•ã‚Œã¾ã™." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "'%s' ã®ãŸã‚ã®ãƒ¬ã‚·ãƒ”ã¯, '%s' ã®ãŸã‚ã®ã‚‚ã®ã‚’優先ã™ã‚‹ãŸã‚無視ã•ã‚Œã¾ã™." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "シングルコロン '%s' ã‹ã‚‰ãƒ€ãƒ–ルコロン '%s' ã«åå‰ã‚’変ãˆã‚‰ã‚Œã¾ã›ã‚“" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "ダブルコロン '%s' ã‹ã‚‰ã‚·ãƒ³ã‚°ãƒ«ã‚³ãƒ­ãƒ³ '%s' ã«åå‰ã‚’変ãˆã‚‰ã‚Œã¾ã›ã‚“" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** 中間ファイル '%s' を削除ã—ã¾ã™" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "中間ファイルを削除ã—ã¦ã„ã¾ã™...\n" + +#: file.c:811 +msgid "Current time" +msgstr "ç¾åœ¨æ™‚刻" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: タイムスタンプãŒç¯„囲外ã§ã™ -- 代り㫠%s ã¨ã—ã¾ã™" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# ターゲットã§ã¯ã‚ã‚Šã¾ã›ã‚“:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# 特別扱ã„ã®ãƒ•ã‚¡ã‚¤ãƒ« (.PRECIOUS ã®å¿…è¦æ¡ä»¶)" + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# 疑似ターゲット (.PHONY ã®å¿…è¦æ¡ä»¶)" + +#: file.c:964 +msgid "# Command line target." +msgstr "# コマンドラインターゲット." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# デフォルトã¾ãŸã¯ MAKEFILES, -include/sinclude Makefile." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# ビルトインルール" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# 暗黙ルールã®æŽ¢ç´¢ãŒè¡Œã‚ã‚Œã¾ã—ãŸ." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# 暗黙ルールã®æŽ¢ç´¢ã¯è¡Œã‚ã‚Œã¾ã›ã‚“ã§ã—ãŸ." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# æš—é»™/é™çš„パターン語幹: '%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# ファイルã¯ä¸­é–“å¿…è¦æ¡ä»¶ã§ã™." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# ã•ã‚‰ã« make:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# 修正時刻ãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# ファイルãŒå­˜åœ¨ã—ã¾ã›ã‚“." + +#: file.c:989 +msgid "# File is very old." +msgstr "# ファイルãŒéžå¸¸ã«å¤ã„ã§ã™." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# 最終修正 %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# ファイルã¯æ›´æ–°ã•ã‚Œã¦ã„ã¾ã™." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# ファイルã¯æ›´æ–°ã•ã‚Œã¦ã„ã¾ã›ã‚“." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# レシピをç¾åœ¨å®Ÿè¡Œä¸­ã§ã™ (*ã“ã‚Œã¯ãƒã‚°ã§ã™*)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# ä¾å­˜é–¢ä¿‚レシピを実行中ã§ã™ (*ã“ã‚Œã¯ãƒã‚°ã§ã™*)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# æ›´æ–°ã«æˆåŠŸã—ã¾ã—ãŸ." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# æ›´æ–°ãŒå¿…è¦ã§ã™ (-q ãŒã‚»ãƒƒãƒˆã•ã‚Œã¦ã„ã¾ã™)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# 'command_state' メンãƒã«ç„¡åŠ¹ãªå€¤ã§ã™!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# ファイル" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# ファイルãƒãƒƒã‚·ãƒ¥ãƒ†ãƒ¼ãƒ–ルã®çŠ¶æ…‹:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: フィールド '%s' ã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚Œã¦ã„ã¾ã›ã‚“: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "éžæ•°å€¤ã®ç¬¬1引数㌠'word' 関数ã«ä¸Žãˆã‚‰ã‚Œã¾ã—ãŸ" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "'word' 関数ã¸ã®ç¬¬1引数㯠0 より大ãããªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "éžæ•°å€¤ã®ç¬¬1引数㌠'wordlist' 関数ã«ä¸Žãˆã‚‰ã‚Œã¾ã—ãŸ" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "éžæ•°å€¤ã®ç¬¬2引数㌠'wordlist' 関数ã«ä¸Žãˆã‚‰ã‚Œã¾ã—ãŸ" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) ãŒå¤±æ•— (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(Err) ãŒå¤±æ•— (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() ãŒå¤±æ•— (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() ãŒå¤±æ•—\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "一時的ãªãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ« %s を消去ã—ã¾ã™\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "open: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "write: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "無効ãªãƒ•ã‚¡ã‚¤ãƒ«æ“作: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "引数ã®æ•°(%d)ãŒé–¢æ•° '%s' ã«ã¨ã£ã¦ä¸å分ã§ã™" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "ã“ã®ãƒ—ラットフォームã§ã¯å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“: 関数 '%s'" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "終端ãŒãªã„関数呼ã³å‡ºã— '%s': '%c' ãŒã‚ã‚Šã¾ã›ã‚“" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "空ã®é–¢æ•°å\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "無効ãªé–¢æ•°å: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "関数åãŒé•·ã™ãŽã¾ã™: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "引数個数指定(最å°å€¤;%d)ãŒç„¡åŠ¹ã§ã™: 関数 '%s'\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "引数個数指定(最大値;%d)ãŒç„¡åŠ¹ã§ã™: 関数 '%s'\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: オプション '%s' ã¯çŸ­ã™ãŽã¦æ­£ã—ã判別ã§ãã¾ã›ã‚“\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: オプション '--%s' ã¯å¼•æ•°ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: オプション '%c%s' ã¯å¼•æ•°ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: オプション '%s' ã«ã¯å¼•æ•°ãŒ1ã¤å¿…è¦ã§ã™\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: オプション '--%s' ã‚’èªè­˜ã§ãã¾ã›ã‚“\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: オプション '%c%s' ã‚’èªè­˜ã§ãã¾ã›ã‚“\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ä¸æ­£ãªã‚ªãƒ—ション ― %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: 無効ãªã‚ªãƒ—ション ― %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: オプションã«ã¯å¼•æ•°ãŒå¿…è¦ã§ã™ ― %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: オプション '-W %s' ã¯çŸ­ã™ãŽã¦æ­£ã—ã判別ã§ãã¾ã›ã‚“\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: オプション '-W %s' ã¯å¼•æ•°ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: 展開中 '%s'\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: 評価中 '%s'\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"ãƒãƒƒã‚·ãƒ¥ãƒ†ãƒ¼ãƒ–ル用 %lu ãƒã‚¤ãƒˆã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—ã—ã¾ã—ãŸ: メモリを使ã„æžœãŸã—ã¾ã—" +"ãŸ" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Load=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Collisions=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "'%s' ã®ãŸã‚ã®æš—黙ルールを探ã—ã¾ã™.\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "'%s' ã®ãŸã‚ã®æ›¸åº«ãƒ¡ãƒ³ãƒæš—黙ルールを探ã—ã¾ã™.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "暗黙ルールã®å†å¸°ã‚’回é¿ã—ã¾ã™.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "語幹ãŒé•·ã™ãŽã¾ã™: '%.*s'.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "語幹 '%.*s' ã¨ã®ãƒ‘ターンルールを試ã—ã¾ã™.\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "é©ç”¨ä¸èƒ½ãªãƒ«ãƒ¼ãƒ«ã®å¿…è¦æ¡ä»¶ '%s' ã‚’å´ä¸‹ã—ã¾ã™.\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "é©ç”¨ä¸èƒ½ãªæš—é»™ã®å¿…è¦æ¡ä»¶ '%s' ã‚’å´ä¸‹ã—ã¾ã™.\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "ルールã®å¿…è¦æ¡ä»¶ '%s' を試ã—ã¾ã™.\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "æš—é»™ã®å¿…è¦æ¡ä»¶ '%s' を試ã—ã¾ã™.\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "VPATH '%2$s' ã¨ã—ã¦å¿…è¦æ¡ä»¶ '%1$s' を見ã¤ã‘ã¾ã—ãŸ\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "中間ファイル '%s' ã®ãƒ«ãƒ¼ãƒ«ã‚’探ã—ã¾ã™.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "一時ファイルを作æˆã§ãã¾ã›ã‚“\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (コアダンプã—ã¾ã—ãŸ)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (無視ã•ã‚Œã¾ã—ãŸ)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "<ビルトイン>" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: ターゲット '%s' ã®ãƒ¬ã‚·ãƒ”ã§å¤±æ•—ã—ã¾ã—ãŸ" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] エラー %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] エラー 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** 未完了ã®ã‚¸ãƒ§ãƒ–ã‚’å¾…ã£ã¦ã„ã¾ã™...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "生存å­ãƒ—ロセス %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (リモート)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "失敗ã—ãŸå­ãƒ—ロセス %p PID %s %s を回åŽã—ã¾ã™\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "æˆåŠŸã—ãŸå­ãƒ—ロセス %p PID %s %s を回åŽã—ã¾ã™\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "一時的ãªãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ« %s を消去ã—ã¾ã™\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "一時的ãªãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ« %s ã®æ¶ˆåŽ»ã«å¤±æ•—ã—ã¾ã—ãŸ(%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "ãƒã‚§ã‚¤ãƒ³ã‹ã‚‰å­ãƒ—ロセス %p PID %s%s を削除ã—ã¾ã™.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "ジョブサーãƒã®ã‚»ãƒžãƒ•ã‚©ã‚’解放ã—ã¾ã™: (エラー %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "å­ãƒ—ロセス %p (%s) ã®å°ã‚’解放ã—ã¾ã—ãŸ.\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "ジョブサーãƒã¸ã® write" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() ãŒå¤±æ•—ã—プロセスãŒèµ·å‹•ã§ãã¾ã›ã‚“ã§ã—㟠(e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"èµ·å‹•ã®å¤±æ•—㧠%d 個ã®å¼•æ•°ãŒã‚«ã‚¦ãƒ³ãƒˆã•ã‚Œã¾ã—ãŸ\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "ãƒã‚§ã‚¤ãƒ³ã«å­ãƒ—ロセス %p (%s) PID %s%s ã‚’å–ã‚Šè¾¼ã¿ã¾ã—ãŸ.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "セマフォ ã¾ãŸã¯ å­ãƒ—ロセスを待ã£ã¦ã„ã¾ã™: (エラー %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "å­ãƒ—ロセス %p (%s) ã«å°ã‚’ã¤ã‘ã¾ã—ãŸ.\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "ジョブã®ãƒ‘イプ㮠read" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: ターゲット '%s' ãŒå­˜åœ¨ã—ã¾ã›ã‚“" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: ターゲット '%s' ã‚’ %s ã®ãŸã‚ã«æ›´æ–°ã—ã¾ã™" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "ã“ã®ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã‚·ã‚¹ãƒ†ãƒ è² è·åˆ¶é™ã‚’加ãˆã‚‰ã‚Œã¾ã›ã‚“" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "システム負è·åˆ¶é™ã‚’課ã™ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "ファイルãƒãƒ³ãƒ‰ãƒ«ã‚’使ã„å°½ãã—ã¾ã—ãŸ: 標準入力を複製ã§ãã¾ã›ã‚“\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "ファイルãƒãƒ³ãƒ‰ãƒ«ã‚’使ã„å°½ãã—ã¾ã—ãŸ: 標準出力を複製ã§ãã¾ã›ã‚“\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "ファイルãƒãƒ³ãƒ‰ãƒ«ã‚’使ã„å°½ãã—ã¾ã—ãŸ: 標準エラー出力を複製ã§ãã¾ã›ã‚“\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "標準入力を復元ã§ãã¾ã›ã‚“ã§ã—ãŸ\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "標準出力を復元ã§ãã¾ã›ã‚“ã§ã—ãŸ\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "標準エラー出力を復元ã§ãã¾ã›ã‚“ã§ã—ãŸ\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make 㯠pid %s ã®å­ãƒ—ロセスを回åŽã—, pid %s ã‚’å¾…ã¡ç¶šã‘ã¾ã™\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: コマンドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: シェルプログラムãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe:環境設定ã®ãŸã‚ã®ãƒ¡ãƒ¢ãƒªã‚’使ã„å°½ãã™ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL ãŒå¤‰æ›´ã•ã‚Œã¾ã—㟠(å‰ã¯ '%s', 今㯠'%s')\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "一時的ãªãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ« %s を作æˆã—ã¾ã™\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容 :%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (%d 行目) ä¸æ­£ãªã‚·ã‚§ãƒ«ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "ã“ã®ãƒ“ルドã§ã¯ -O[TYPE] (--output-sync[=TYPE]) ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "グローãƒãƒ«ã‚·ãƒ³ãƒœãƒ«ãƒ†ãƒ¼ãƒ–ルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "読ã¿è¾¼ã‚“ã ã‚ªãƒ–ジェクト %s 㯠GPL互æ›ã®å®£è¨€ãŒãªã•ã‚Œã¦ã„ã¾ã›ã‚“" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "シンボル %s ã‚’ %s ã‹ã‚‰èª­ã¿è¾¼ã‚€ã®ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "空ã®ã‚·ãƒ³ãƒœãƒ«åを読ã¿è¾¼ã‚‚ã†ã¨ã—ã¦ã„ã¾ã™: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "シンボル %s ã‚’ %s ã‹ã‚‰èª­ã¿è¾¼ã‚“ã§ã„ã¾ã™\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "'load' 命令ã¯ã“ã®ãƒ—ラットフォームã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“." + +#: main.c:313 +msgid "Options:\n" +msgstr "オプション:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m 互æ›æ€§ã®ãŸã‚ã®ã‚‚ã®ã§, 無視ã•ã‚Œã‚‹.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make ç„¡æ¡ä»¶ã«å…¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’ make ã™ã‚‹.\n" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" make 開始å‰ã«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª DIRECTORY ã¸ç§»å‹•ã™" +"ã‚‹.\n" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d デãƒãƒƒã‚°æƒ…報を大é‡ã«è¡¨ç¤ºã™ã‚‹.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr " --debug[=FLAGS] 様々ãªã‚¿ã‚¤ãƒ—ã®ãƒ‡ãƒãƒƒã‚°æƒ…報を表示ã™ã‚‹.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" 環境変数㌠makefile 中ã®è¨˜è¿°ã«å„ªå…ˆã™ã‚‹\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr " --eval=STRING STRING ã‚’ makefile ã®æ–‡ã¨ã—ã¦è©•ä¾¡ã™ã‚‹.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦çµ‚了ã™ã‚‹.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors レシピã‹ã‚‰è¿”ã£ãŸã‚¨ãƒ©ãƒ¼ã‚’無視ã™ã‚‹.\n" + +#: main.c:337 +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" + +#: main.c:340 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] 一度㫠N 個ã¾ã§ã®ã‚¸ãƒ§ãƒ–を許å¯; 無引数ã ã¨ã‚¸ãƒ§ãƒ–" +"数制é™ãªã—.\n" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going ã‚るターゲット㌠make ã§ããªãã¦ã‚‚実行を続ã‘" +"ã‚‹.\n" + +#: main.c:344 +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" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times シンボリックリンクã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®ä¸­ã§ä¸€ç•ªæ–°ã—ã„ " +"mtime を使ã†.\n" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" +" -O[TYPE], --output-sync[=TYPE]\n" +" 並列ジョブã®å‡ºåŠ›ã‚’ TYPE ã§æƒãˆã‚‹.\n" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base make ã®å†…部データベースを表示ã™ã‚‹.\n" + +#: main.c:360 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question レシピを実行ã—ãªã„; 更新済ã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’終了" +"ステータスã§é€šçŸ¥.\n" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules ビルトインã®æš—黙ルールを無効ã«ã™ã‚‹.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables ビルトインã®å¤‰æ•°è¨­å®šã‚’無効ã«ã™ã‚‹.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet レシピを表示ã—ãªã„.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" -k オプションをオフã«ã™ã‚‹.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’å† make ã™ã‚‹ä»£ã‚ã‚Šã«ã‚¿ãƒƒãƒã™ã‚‹.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace トレース情報を表示ã™ã‚‹.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version make ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã‚’表示ã—ã¦çµ‚了ã™ã‚‹.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory カレントディレクトリを表示ã™ã‚‹.\n" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory -w をオフã«ã™ã‚‹. æš—é»™ã«æœ‰åŠ¹ãªå ´åˆã§ã‚‚オフã«ã™" +"ã‚‹.\n" + +#: main.c:381 +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" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables 未定義ã®å¤‰æ•°ãŒå‚ç…§ã•ã‚ŒãŸã¨ãã«è­¦å‘Šã‚’発ã™ã‚‹.\n" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "空ã®æ–‡å­—列ã¯ãƒ•ã‚¡ã‚¤ãƒ«åã¨ã—ã¦ã¯ç„¡åŠ¹ã§ã™" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "ä¸æ˜Žãªãƒ‡ãƒãƒƒã‚°ãƒ¬ãƒ™ãƒ«æŒ‡å®š '%s'" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "未知ã®å‡ºåŠ›åŒæœŸåž‹ '%s'" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: 割り込ã¿/例外をæ•æ‰ã—ã¾ã—㟠(code = 0x%lx, addr = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "アクセスä¿è­·é•å: アドレス 0x%p ã§ã®æ›¸ãè¾¼ã¿æ“作\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "アクセスä¿è­·é•å: アドレス 0x%p ã§ã®èª­ã¿è¾¼ã¿æ“作\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() 㯠default_shell = %s ã«è¨­å®šã—ã¾ã™\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell() パス探索㧠default_shell = %s ã«ã‚»ãƒƒãƒˆã—ã¾ã—ãŸ\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s 㯠30 秒間åœæ­¢ã—ã¾ã™..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) ãŒçµ‚ã‚ã‚Šã¾ã—ãŸ. 続ã‘ã¾ã™.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "内部エラー: ジョブサームセマフォを開ã‘ã¾ã›ã‚“ '%s': (エラー %ld: %s)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "jobserver クライアント (セマフォ %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "内部エラー: 無効㪠--jobserver-fds 文字列 '%s'" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "jobserver クライアント (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"警告: 副次 make 㧠-jN を強制指定ã—ã¾ã—ãŸ: jobserver モードを無効ã«ã—ã¾ã™." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"警告: jobserver ãŒåˆ©ç”¨ä¸å¯: 今回㯠-j1 を使ã„ã¾ã™. 親 make ルール㫠`+' を追" +"加ã—ã¾ã—ょã†." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "標準入力ã‹ã‚‰ã® makefile ãŒäºŒå›žæŒ‡å®šã•ã‚Œã¾ã—ãŸ." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (一時ファイル)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (一時ファイル)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "並列ジョブ (-j) ã¯ã“ã®ãƒ—ラットフォームã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "å˜ä¸€ã‚¸ãƒ§ãƒ– (-j1) モードã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "jobserver ã®ã‚¹ãƒ­ãƒƒãƒˆã¯ %d ã¾ã§ã§ã™\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "ジョブサームセマフォを作æˆã—ã¦ã„ã¾ã™: (エラー %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "ジョブパイプ作æˆä¸­" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "jobserver パイプã®åˆæœŸåŒ–" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "シンボリックリンクã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“: -L ã¯ç„¡åŠ¹ã§ã™." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "makefile ã®æ›´æ–°ä¸­....\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "makefile '%s' 自己å†å¸°ã®ãŠãã‚Œã‚ã‚Š ― å†make ã—ã¾ã›ã‚“.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "makefile '%s' ã®å†makeã«å¤±æ•—ã—ã¾ã—ãŸ." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "インクルードã•ã‚Œã‚‹ makefile '%s' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "makefile '%s' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "å…ƒã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«æˆ»ã‚Œã¾ã›ã‚“ã§ã—ãŸ." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "å†å®Ÿè¡Œã—ã¾ã™[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (一時ファイル): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL ãŒäºŒã¤ä»¥ä¸Šã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’å«ã‚“ã§ã„ã¾ã™" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "ターゲットãŒæŒ‡å®šã•ã‚Œã¦ãŠã‚‰ãš, makefile も見ã¤ã‹ã‚Šã¾ã›ã‚“" + +#: main.c:2511 +msgid "No targets" +msgstr "ターゲットãŒã‚ã‚Šã¾ã›ã‚“" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "最終ターゲットを更新中....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "警告: 時刻ã®ãšã‚Œã‚’検出. ä¸å®Œå…¨ãªãƒ“ルドçµæžœã«ãªã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "使ã„æ–¹: %s [オプション] [ターゲット] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"ã“ã®ãƒ—ログラム㯠%s 用ã«ãƒ“ルドã•ã‚Œã¾ã—ãŸ\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"ã“ã®ãƒ—ログラム㯠%s (%s) 用ã«ãƒ“ルドã•ã‚Œã¾ã—ãŸ\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã¯ ã¾ã§.\n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "'%s%s' オプションã¯ç©ºã§ãªã„文字列引数をè¦æ±‚ã—ã¾ã™" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "'-%c' オプションã¯æ­£ã®æ•´æ•°å¼•æ•°ã‚’è¦æ±‚ã—ã¾ã™" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sã“ã®ãƒ—ログラム㯠%s 用ã«ãƒ“ルドã•ã‚Œã¾ã—ãŸ\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sã“ã®ãƒ—ログラム㯠%s (%s) 用ã«ãƒ“ルドã•ã‚Œã¾ã—ãŸ\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make データベース出力 %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Make データベース終了 %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "未知ã®ã‚¨ãƒ©ãƒ¼ %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: ユーザ %lu (実効 %lu), グループ %lu (実効 %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "アクセス権é™ã‚’åˆæœŸåŒ–" + +#: misc.c:622 +msgid "User access" +msgstr "ユーザアクセス" + +#: misc.c:670 +msgid "Make access" +msgstr "make アクセス" + +#: misc.c:704 +msgid "Child access" +msgstr "å­ãƒ—ロセスアクセス" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: ディレクトリ(ディレクトリåä¸æ˜Ž)ã«å…¥ã‚Šã¾ã™\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: ディレクトリ(ディレクトリåä¸æ˜Ž)ã‹ã‚‰å‡ºã¾ã™\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: ディレクトリ '%s' ã«å…¥ã‚Šã¾ã™\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: ディレクトリ '%s' ã‹ã‚‰å‡ºã¾ã™\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: ディレクトリ(ディレクトリåä¸æ˜Ž)ã«å…¥ã‚Šã¾ã™\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: ディレクトリ(ディレクトリåä¸æ˜Ž)ã‹ã‚‰å‡ºã¾ã™\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: ディレクトリ '%s' ã«å…¥ã‚Šã¾ã™\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: ディレクトリ '%s' ã‹ã‚‰å‡ºã¾ã™\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". 中止.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "makefile を読ã¿è¾¼ã¿ã¾ã™...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "makefile '%s' ã®èª­ã¿è¾¼ã¿ä¸­" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (デフォルトã®æœ€çµ‚ターゲットãŒã‚ã‚Šã¾ã›ã‚“)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (探索パス)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (æ°—ã«ã—ãªãã¦ã‚ˆã„)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (~ ã®å±•é–‹ãªã—)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "makefile '%s' ã®ä¸­ã® UTF-8 BOM をスキップã—ã¾ã™\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "makefile ãƒãƒƒãƒ•ã‚¡ã®ä¸­ã® UTF-8 BOM をスキップã—ã¾ã™\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "æ¡ä»¶éƒ¨ã®æ–‡æ³•ãŒç„¡åŠ¹ã§ã™" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: 読ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "最åˆã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚ˆã‚Šå‰ã«ãƒ¬ã‚·ãƒ”ãŒã‚ã‚Šã¾ã™" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "レシピã®å‰ã®ãƒ«ãƒ¼ãƒ«ãŒä¸è¶³ã—ã¦ã„ã¾ã™" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (8 個ã®ç©ºç™½ã§ã—ãŸãŒ, TAB ã®ã¤ã‚‚ã‚Šã§ã—ãŸã‹?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "分離記å·ã‚’欠ã„ã¦ã„ã¾ã™%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "ターゲットパターンを欠ã„ã¦ã„ã¾ã™" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "複数ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ‘ターンã§ã™" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "ターゲットパターン㌠'%%' ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "'endif' ãŒæ¬ è½ã—ã¦ã„ã¾ã™" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "空ã®å¤‰æ•°å" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "'define' 疑似命令ã®å¾Œã‚ã«ç„¡é–¢ä¿‚ãªæ–‡å­—列ãŒã‚ã‚Šã¾ã™" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "'endef' を欠ã„ã¦ãŠã‚Š, 'define' ãŒçµ‚了ã—ã¦ã„ã¾ã›ã‚“" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "'endef' 疑似命令ã®å¾Œã‚ã«ç„¡é–¢ä¿‚ãªæ–‡å­—列ãŒã‚ã‚Šã¾ã™" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "'%s' 疑似命令ã®å¾Œã‚ã«ç„¡é–¢ä¿‚ãªæ–‡å­—列ãŒã‚ã‚Šã¾ã™" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "無関係㪠'%s'" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "一ã¤ã®æ¡ä»¶éƒ¨ã«ã¤ã一ã¤ã—ã‹ 'else' を使ãˆã¾ã›ã‚“" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "ターゲット特有ã®å¤‰æ•°å®šç¾©ãŒç•°å¸¸ã§ã™" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "å¿…è¦æ¡ä»¶ã‚’レシピ内ã§å®šç¾©ã§ãã¾ã›ã‚“" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "暗黙ルールã¨é™çš„パターンルールãŒæ··ã–ã‚Šã¾ã—ãŸ" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "暗黙ルールã¨é€šå¸¸ãƒ«ãƒ¼ãƒ«ãŒæ··ã–ã‚Šã¾ã—ãŸ" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "ターゲット '%s' ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ‘ターンã¨ä¸€è‡´ã—ã¾ã›ã‚“" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "ターゲットファイル '%s' ㌠: 㨠:: é …ç›®ã®ä¸¡æ–¹ã‚’æŒã£ã¦ã„ã¾ã™" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "ターゲット '%s' ãŒåŒä¸€ãƒ«ãƒ¼ãƒ«å†…ã§è¤‡æ•°å›žä¸Žãˆã‚‰ã‚Œã¾ã—ãŸ" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "警告: ターゲット '%s' ã®ãŸã‚ã®ãƒ¬ã‚·ãƒ”ã‚’ç½®ãæ›ãˆã¾ã™" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "警告: ターゲット '%s' ã®ãŸã‚ã®å¤ã„レシピã¯ç„¡è¦–ã•ã‚Œã¾ã™" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "暗黙ルールã¨é€šå¸¸ãƒ«ãƒ¼ãƒ«ãŒæ··ã–ã‚Šã¾ã—ãŸ" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "警告: NUL 文字ãŒã‚ã‚Šã¾ã™; è¡Œã®æ®‹ã‚Šã¯ç„¡è¦–ã•ã‚Œã¾ã™" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "'%s' ã«å¯¾ã—ã¦è¡Œã†ã¹ã事ã¯ã‚ã‚Šã¾ã›ã‚“." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "'%s' ã¯æ›´æ–°æ¸ˆã¿ã§ã™." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "ファイル '%s' ã®ä¾å­˜é–¢ä¿‚ã‚’æ•´ç†ã—ã¦ã„ã¾ã™.\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "" +"%1$s'%3$s' ã«å¿…è¦ãªã‚¿ãƒ¼ã‚²ãƒƒãƒˆ '%2$s' ã‚’ make ã™ã‚‹ãƒ«ãƒ¼ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“%4$s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sターゲット '%s' ã‚’ make ã™ã‚‹ãƒ«ãƒ¼ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "ファイル '%s' を検討ã—ã¦ã„ã¾ã™.\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "最近ファイル '%s' ã®æ›´æ–°ã‚’試ã—ã¦å¤±æ•—ã—ã¦ã„ã¾ã™.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "ファイル '%s' ã¯æ¤œè¨Žæ¸ˆã¿ã§ã™.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "ファイル '%s' ã®æ›´æ–°ã‚’ã—ã¦ã„ã¾ã™.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "ファイル '%s' ã®æ›´æ–°ãŒçµ‚了ã—ã¾ã—ãŸ.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "ファイル '%s' ãŒå­˜åœ¨ã—ã¾ã›ã‚“.\n" + +#: remake.c:495 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** 警告: .LOW_RESOLUTION_TIME ファイル '%s' ãŒé«˜è§£åƒåº¦ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã‚’æŒã£ã¦" +"ã„ã¾ã™" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "'%s' ã®ãŸã‚ã®æš—黙ルールを見ã¤ã‘ã¾ã—ãŸ.\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "'%s' ã®ãŸã‚ã®æš—黙ルールãŒã‚ã‚Šã¾ã›ã‚“.\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "'%s' 用ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¬ã‚·ãƒ”を使用ã—ã¾ã™.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "循環 %s <- %s ä¾å­˜é–¢ä¿‚ãŒç ´æ£„ã•ã‚Œã¾ã—ãŸ." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "ターゲットファイル '%s' ã®å¿…è¦æ¡ä»¶ã‚’満ãŸã—ã¾ã—ãŸ.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "'%s' ã®å¿…è¦æ¡ä»¶ã‚’ make ã—ã¾ã™.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "ターゲットファイル '%s' を諦ã‚ã¾ã™.\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "ターゲット '%s' ã¯ã‚¨ãƒ©ãƒ¼ã«ã‚ˆã‚Š å†make ã§ãã¾ã›ã‚“ã§ã—ãŸ." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "å¿…è¦æ¡ä»¶ '%s' ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆ '%s' ã® order-only(é †åºæ±ºå®šæ¡ä»¶)ã§ã™.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "ターゲット '%2$s' ã®å¿…è¦æ¡ä»¶ '%1$s' ãŒå­˜åœ¨ã—ã¾ã›ã‚“.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "å¿…è¦æ¡ä»¶ '%s' ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆ '%s' よりも新ã—ã„.\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "å¿…è¦æ¡ä»¶ '%s' ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆ '%s' よりもå¤ã„.\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "ターゲット '%s' ã¯ãƒ€ãƒ–ルコロンã§, ã‹ã¤å¿…è¦æ¡ä»¶ã‚’æŒãŸãªã„.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "'%s' ã®ãŸã‚ã®ãƒ¬ã‚·ãƒ”ãŒç„¡ã, å¿…è¦æ¡ä»¶ã¯å®Ÿéš›ã«ã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "always-make フラグãŒç«‹ã£ã¦ã„ã‚‹ã®ã§ '%s' ã‚’ make ã—ã¾ã™.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "ターゲット '%s' ã‚’å†make ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; VPATH å '%s' を使用ã—ã¾ã™" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "ターゲット '%s' ã‚’å†make ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " VPATH å '%s' を無視ã—ã¾ã™.\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "'%s' ã®ãƒ¬ã‚·ãƒ”を実行中ã§ã™.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "ターゲットファイル '%s' ã®å†make ã«å¤±æ•—ã—ã¾ã—ãŸ.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "ターゲットファイル '%s' ã®å† make ã«æˆåŠŸã—ã¾ã—ãŸ.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "ターゲットファイル '%s' 㯠-q オプションを付ã‘ã¦ã®å†make ãŒå¿…è¦ã§ã™.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "'%s' ã®ãŸã‚ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使ã„ã¾ã™.\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "警告: ファイル '%s' ã®ä¿®æ­£æ™‚刻ã¯æœªæ¥ã®ã‚‚ã®ã§ã™" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "警告: ファイル '%s' ã®ä¿®æ­£æ™‚刻 %s ã¯æœªæ¥ã®æ™‚刻ã§ã™" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS è¦ç´  '%s' ãŒãƒ‘ターンã§ã¯ã‚ã‚Šã¾ã›ã‚“" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs ãŒã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¦ãã‚Œã¾ã›ã‚“: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# 暗黙ルール" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# 暗黙ルールãªã—." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u 個ã®æš—黙ルール, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " 以上." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ãƒã‚°: num_pattern_rules ãŒé–“é•ã£ã¦ã„ã‚‹! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "未知ã®ã‚·ã‚°ãƒŠãƒ«" + +#: signame.c:92 +msgid "Hangup" +msgstr "ãƒãƒ³ã‚°ã‚¢ãƒƒãƒ—" + +#: signame.c:95 +msgid "Interrupt" +msgstr "割り込ã¿" + +#: signame.c:98 +msgid "Quit" +msgstr "終了" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "ä¸æ­£ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢å‘½ä»¤" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "トレース/ブレイクãƒã‚¤ãƒ³ãƒˆãƒˆãƒ©ãƒƒãƒ—" + +#: signame.c:109 +msgid "Aborted" +msgstr "Abort ã—ã¾ã—ãŸ" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT トラップ" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT トラップ" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "浮動å°æ•°ç‚¹ä¾‹å¤–" + +#: signame.c:121 +msgid "Killed" +msgstr "Kill ã•ã‚Œã¾ã—ãŸ" + +#: signame.c:124 +msgid "Bus error" +msgstr "ãƒã‚¹ã‚¨ãƒ©ãƒ¼" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "メモリé•å" + +#: signame.c:130 +msgid "Bad system call" +msgstr "ä¸æ­£ãªã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ¼ãƒ«" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "読ã¿æ‰‹ã®ãªã„パイプã¸ã®æ›¸ãè¾¼ã¿" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "アラームクロック" + +#: signame.c:139 +msgid "Terminated" +msgstr "強制終了" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "ユーザ定義シグナル 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "ユーザ定義シグナル 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "å­ãƒ—ロセス終了" + +#: signame.c:156 +msgid "Power failure" +msgstr "é›»æºéšœå®³" + +#: signame.c:159 +msgid "Stopped" +msgstr "一時åœæ­¢" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "一時åœæ­¢ (tty 入力)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "一時åœæ­¢ (tty 出力)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "一時åœæ­¢ (シグナル)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU 時間ãŒåˆ¶é™ã‚’越ãˆã¾ã—ãŸ" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "ファイルサイズ制é™ã‚’越ãˆã¾ã—ãŸ" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "仮想タイマ満了" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "プロファイルタイマ満了" + +#: signame.c:186 +msgid "Window changed" +msgstr "ウィンドウサイズ変更" + +#: signame.c:189 +msgid "Continued" +msgstr "å†é–‹ã•ã‚Œã¾ã—ãŸ" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "緊急 I/O æ¡ä»¶" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "入出力å¯èƒ½" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "リソースãŒå¤±ã‚ã‚Œã¾ã—ãŸ" + +#: signame.c:214 +msgid "Danger signal" +msgstr "å±é™ºã‚·ã‚°ãƒŠãƒ«" + +#: signame.c:217 +msgid "Information request" +msgstr "情報è¦æ±‚" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "浮動å°æ•°ç‚¹ã‚³ãƒ—ロセッサãŒåˆ©ç”¨ä¸èƒ½" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s strcache ãƒãƒƒãƒ•ã‚¡ã¯ã‚ã‚Šã¾ã›ã‚“\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s ç¾åœ¨ã®ãƒãƒƒãƒ•ã‚¡: サイズ = %hu B / 使用中 = %hu B / 個数 = %hu / å¹³å‡ = %hu " +"B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s ãã®ä»– 使用中: åˆè¨ˆ = %lu B / 個数 = %lu / å¹³å‡ = %lu B\n" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" +"%s ãã®ä»– 未使用: åˆè¨ˆ = %lu B / 最大 = %lu B / æœ€å° = %lu B / å¹³å‡ = %hu B\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s strcache ã®ç¨¼åƒ: 探索 = %lu / ヒット率 = %lu%%\n" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# ãƒãƒƒã‚·ãƒ¥ãƒ†ãƒ¼ãƒ–ルã®çŠ¶æ…‹:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "自動変数" + +#: variable.c:1602 +msgid "default" +msgstr "デフォルト" + +#: variable.c:1605 +msgid "environment" +msgstr "環境変数" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile 変数" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "-e オプションã§æŒ‡å®šã—ãŸç’°å¢ƒå¤‰æ•°" + +#: variable.c:1614 +msgid "command line" +msgstr "コマンドライン変数" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "'override' 疑似命令" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (ファイル '%s', %lu 行目)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# 変数セットã®ãƒãƒƒã‚·ãƒ¥ãƒ†ãƒ¼ãƒ–ルã®çŠ¶æ…‹:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# 変数\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# パターン指定 変数 値" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# パターン指定変数ã®å€¤ãªã—." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u 個ã®ãƒ‘ターン指定変数ã®å€¤" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "警告: 未定義ã®å¤‰æ•° '%.*s'" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() ㌠%d ã§å¤±æ•—ã—ã¾ã—ãŸ\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "警告: 空ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "内部エラー: '%s' command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-警告, DCL ã‹ã‚‰ã® CTRL-Y æ“作をå†ã³æœ‰åŠ¹ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚知れã¾ã›ã‚“.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "ビルトイン [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "ビルトイン CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "ビルトイン CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "ä¸æ˜Žãªãƒ“ルトインコマンド '%s'\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "エラー, 空ã®ã‚³ãƒžãƒ³ãƒ‰\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "%s ã‹ã‚‰å…¥åŠ›ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•ã‚Œã¾ã—ãŸ\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "%s ã¸ã‚¨ãƒ©ãƒ¼ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•ã‚Œã¾ã—ãŸ\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "出力を %s ã¸è¿½åŠ \n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "%s ã¸å‡ºåŠ›ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•ã‚Œã¾ã—ãŸ\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "追加 %.*s ã¨å¾Œç‰‡ä»˜ã‘\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "代ã‚ã‚Šã« %s を実行ã—ã¾ã™\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "spawn ã®ã‚¨ãƒ©ãƒ¼, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH 探索パス\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# 'vpath' 探索パスã¯ã‚ã‚Šã¾ã›ã‚“." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u ã¤ã® 'vpath' 探索パス.\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# 一般㮠('VPATH' 変数) 探索パスãªã—." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# 一般㮠('VPATH' 変数) 探索パス:\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/po/ko.gmo b/po/ko.gmo new file mode 100644 index 0000000..420b249 Binary files /dev/null and b/po/ko.gmo differ diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..709bcb1 --- /dev/null +++ b/po/ko.po @@ -0,0 +1,2261 @@ +# 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. +# +# ìš©ì–´ +# - recipe - 명령 (makeì˜ action으로 실행할 명령어를 ë§í•¨) +# - prerequisite - ì„ í–‰ ì¡°ê±´ +# +# 참고 +# - order-only란 ì˜ì¡´í•˜ëŠ” 타겟 중ì—ì„œ 명령어 순서만 지정하고 íŒŒì¼ ìˆ˜ì • +# ì‹œê°ì€ 무시하는 종류를 ë§í•œë‹¤. "Types of Prerequisites" 참고. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU make 4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-12-01 18:10+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" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "지ì›ë˜ì§€ 않는 ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤ê³  함: '%s'" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "ì•„ì¹´ì´ë¸Œ 멤버 touch는 VMSì—ì„œ 사용할 수 없습니다" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: '%s' ì•„ì¹´ì´ë¸Œê°€ 없습니다" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: '%s'ì€(는) 올바른 ì•„ì¹´ì´ë¸Œê°€ 아닙니다" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: '%s' 멤버가 '%s' ì•ˆì— ì—†ìŠµë‹ˆë‹¤" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: '%s'ì— ëŒ€í•˜ì—¬ ar_member_touchì—ì„œ 실패 리턴 코드" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module()ì´ ëª¨ë“ˆì •ë³´ë¥¼ 추출하는 ë° ì‹¤íŒ¨, ìƒíƒœ = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control()ì´ ì‹¤íŒ¨, ìƒíƒœ = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "'%2$s' 멤버를 참조하려고 '%1$s' ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ ì—´ 수 없습니다" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "멤버 '%s'%s: %ldë°”ì´íŠ¸, 위치 %ld (%ld).\n" + +# ì´ë¯¸ 잘려진 ì´ë¦„ì„ í‘œì‹œí•˜ë©´ì„œ ì´ë¦„ì´ ìž˜ë ¤ì¡Œì„ ìˆ˜ë„ ìžˆìœ¼ë‹ˆ 유ì˜í•˜ë¼ëŠ” 뜻 +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (ì´ë¦„ì´ ìž˜ë ¤ë‚˜ê°”ì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " 날짜 %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, 모드 = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "ëª…ë ¹ì–´ì— ì¤„ì´ ë„ˆë¬´ 많습니다(%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** 중지.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] ì•„ì¹´ì´ë¸Œ '%s' 멤버는 ê°€ì§œì¼ ìˆ˜ 있으므로 삭제하지 않습니다" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** ì•„ì¹´ì´ë¸Œ '%s' 멤버는 ê°€ì§œì¼ ìˆ˜ 있으므로 삭제하지 않습니다" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] '%s' 파ì¼ì„ 삭제합니다" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** '%s' 파ì¼ì„ 삭제합니다" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# 실행할 명령어" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (내장):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " ('%s'ì—ì„œ, %lu번째 줄):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# 디렉터리\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: statì„ í•  수 없었습니다.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (키 %s, ë³€ê²½ì‹œê° %d): ì—´ 수 없습니다.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (장치 %d, ì•„ì´ë…¸ë“œ [%d,%d,%d]): ì—´ 수 없습니다.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (장치 %ld, ì•„ì´ë…¸ë“œ %ld): ì—´ 수 없습니다.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (키 %s, ë³€ê²½ì‹œê° %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (장치 %d, ì•„ì´ë…¸ë“œ [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (장치 %ld, ì•„ì´ë…¸ë“œ %ld): " + +# 여기서 No는 "No files"ë¼ê³  ì“°ì¸ë‹¤. ê¶ê·¹ì ìœ¼ë¡œ msgidê°€ ê³ ì³ì ¸ì•¼ 함 +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "0ê°œ" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " 파ì¼, " + +# 여기서 no는 "no impossibilities"ë¼ê³  ì“°ì¸ë‹¤. ê¶ê·¹ì ìœ¼ë¡œ msgidê°€ ê³ ì³ì ¸ì•¼ 함 +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "0ê°œ" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " 불가능" + +#: dir.c:1068 +msgid " so far." +msgstr " 지금까지." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " 디렉토리 %luê°œì—ì„œ 불가능.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "재귀하는 '%s' 변수는 (ê²°êµ­) ìžê¸° ìžì‹ ì„ 참조하고 있습니다" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "변수 ì°¸ì¡°ì— ëë§ˆì¹¨ì´ ì—†ìŠµë‹ˆë‹¤" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "íŒŒì¼ '%s'ì˜ %s:%luì—ì„œ ëª…ë ¹ì„ ì§€ì •í–ˆìŠµë‹ˆë‹¤." + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "íŒŒì¼ '%s'ì— ëŒ€í•œ ëª…ë ¹ì„ ë¬µì‹œì  ê·œì¹™ íƒìƒ‰ìœ¼ë¡œ 찾았습니다." + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "하지만 '%s' 파ì¼ì€ ì´ì œ '%s'ê³¼(와) ê°™ì€ íŒŒì¼ë¡œ 간주합니다." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "'%s'ì— ëŒ€í•œ ëª…ë ¹ì€ '%s'ì— ëŒ€í•œ ëª…ë ¹ì´ ìš°ì„ í•˜ë¯€ë¡œ 무시합니다." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "ë‹¨ì¼ ì½œë¡  '%s'ì„(를) ì´ì¤‘ 콜론 '%s'(으)ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 없습니다" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "ì´ì¤‘ 콜론 '%s'ì„(를) ë‹¨ì¼ ì½œë¡  '%s'(으)ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 없습니다" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** 중간 íŒŒì¼ '%s'ì„(를) 삭제합니다" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "중간 파ì¼ì„ 제거합니다...\n" + +#: file.c:811 +msgid "Current time" +msgstr "현재 ì‹œê°" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: 타임스탬프가 범위를 벗어나므로, %sì„(를) 대체합니다" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# íƒ€ê²Ÿì´ ì•„ë‹˜:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# 프레시어스 íŒŒì¼ (.PRECIOUSì˜ ì„ í–‰ì¡°ê±´)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# í¬ë‹ˆ 타겟 (.PHONYì˜ ì„ í–‰ì¡°ê±´)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# 명령행 타겟." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" +"# 기본 ë©”ì´í¬íŒŒì¼, MAKEFILES ë©”ì´í¬íŒŒì¼, ë˜ëŠ” -include/sinclude ë©”ì´í¬íŒŒì¼." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# 내장 규칙" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# ë¬µì‹œì  ê·œì¹™ íƒìƒ‰ì´ 완료ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# ë¬µì‹œì  ê·œì¹™ íƒìƒ‰ì´ 완료ë˜ì§€ 않았습니다." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# 묵시ì /ê³ ì • 패턴 스템: '%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# 파ì¼ì´ ì¤‘ê°„ë‹¨ê³„ì˜ ì„ í–‰ì¡°ê±´ìž…ë‹ˆë‹¤." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# 다ìŒë„ 만듭니다:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# 변경 ì‹œê°ì´ ê²°ì½” 검사ë˜ì§€ 않았ìŒ." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# 파ì¼ì´ 없습니다." + +#: file.c:989 +msgid "# File is very old." +msgstr "# 파ì¼ì´ 매우 오래ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# 마지막 변경 %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# 파ì¼ì„ ì—…ë°ì´íŠ¸í–ˆìŠµë‹ˆë‹¤." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# 파ì¼ì„ ì—…ë°ì´íŠ¸í•˜ì§€ 않았습니다." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# 현재 ì‹¤í–‰ì¤‘ì¸ ëª…ë ¹(ì´ê²ƒì€ 버그입니다)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# 현재 ì‹¤í–‰ì¤‘ì¸ ì˜ì¡´ì„±(ì´ê²ƒì€ 버그입니다)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# 성공ì ìœ¼ë¡œ ì—…ë°ì´íŠ¸." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# ì—…ë°ì´íŠ¸ í•„ìš”(-q 설정ë¨)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# ì—…ë°ì´íŠ¸ 실패." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# 'command_status' ë©¤ë²„ì— ê°’ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# 파ì¼" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# íŒŒì¼ í•´ì‹œ í…Œì´ë¸” 통계:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: '%s' 필드가 ìºì‹œì— ì—†ìŒ: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "'word' í•¨ìˆ˜ì˜ ì²«ë²ˆì§¸ ì¸ìžê°€ 숫ìžê°€ 아닙니다" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "'word' í•¨ìˆ˜ì˜ ì²«ë²ˆì§¸ ì¸ìžëŠ” 0보다 커야 합니다" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "'wordlist' í•¨ìˆ˜ì˜ ì²«ë²ˆì§¸ ì¸ìžê°€ 숫ìžê°€ 아닙니다" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "'wordlist' í•¨ìˆ˜ì˜ ë‘번째 ì¸ìžê°€ 숫ìžê°€ 아닙니다" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) 실패(e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(Err) 실패(e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() 실패(e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() 실패\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "ìž„ì‹œ 배치 íŒŒì¼ %sì„(를) 지ì›ë‹ˆë‹¤\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "open: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "write: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "올바르지 ì•Šì€ íŒŒì¼ ë™ìž‘: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "함수 '%2$s'ì— ì¸ìž 갯수(%1$d)ê°€ 부족합니다 " + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "ì´ í”Œëž«í¼ì—서는 구현ë˜ì§€ 않았습니다: '%s' 함수" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "함수 '%s'ì— ëŒ€í•´ 종료ë˜ì§€ ì•Šì€ í˜¸ì¶œ: '%c' 문ìžê°€ ë¹ ì¡ŒìŒ" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "빈 함수 ì´ë¦„: %s\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "ìž˜ëª»ëœ í•¨ìˆ˜ ì´ë¦„: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "함수 ì´ë¦„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "함수 `%2$s'ì— ìµœì†Œ ì¸ìž 갯수(%1$d)ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "함수 `%2$s'ì— ìµœëŒ€ ì¸ìž 갯수(%1$d)ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: '%s' ì˜µì…˜ì€ ì• ë§¤í•œ 옵션입니다\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: '--%s' ì˜µì…˜ì€ ì¸ìˆ˜ë¥¼ 허용하지 않습니다\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: '%c%s' ì˜µì…˜ì€ ì¸ìˆ˜ë¥¼ 허용하지 않습니다\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: '%s' ì˜µì…˜ì€ ì¸ìˆ˜ê°€ 필요합니다\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: ì¸ì‹í•  수 없는 옵션 '--%s'\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: ì¸ì‹í•  수 없는 옵션 '%c%s'\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ìž˜ëª»ëœ ì˜µì…˜ -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: 부ì ì ˆí•œ 옵션 -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ì´ ì˜µì…˜ì€ ì¸ìˆ˜ê°€ 필요합니다 -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: '-W %s' ì˜µì…˜ì€ ì• ë§¤í•œ 옵션입니다\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: '-W %s' ì˜µì…˜ì€ ì¸ìˆ˜ë¥¼ 허용하지 않습니다\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: '%s' 확장\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: '%s' í•´ì„\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "í•´ì‹œ í…Œì´ë¸”ì— %lu ë°”ì´íŠ¸ë¥¼ 할당할 수 없습니다: 메모리 바닥남" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "로드=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "다시 í•´ì‹œ=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "충ëŒ=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "'%s'ì— ëŒ€í•œ ë¬µì‹œì  ê·œì¹™ì„ ì°¾ê³  있습니다.\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "'%s'ì— ëŒ€í•œ ì•„ì¹´ì´ë¸Œë©¤ë²„ ë¬µì‹œì  ê·œì¹™ì„ ì°¾ê³  있습니다.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "ë¬µì‹œì  ê·œì¹™ì˜ ìž¬ê·€ë¥¼ 피함.\n" + +# 스템(stem)ì´ëž€ 패턴 룰ì—ì„œ prefix/suffix를 제외한 나머지를 ë§í•œë‹¤. +# 예를 들어 `%.c'ë¼ëŠ” íŒ¨í„´ì— `hello.c'ê°€ 들어 ë§žì•˜ì„ ê²½ìš° stemì€ `hello'ì´ë‹¤. +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "ìŠ¤í…œì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤: '%.*s'.\n" + +# 스템(stem)ì´ëž€ 패턴 룰ì—ì„œ prefix/suffix를 제외한 나머지를 ë§í•œë‹¤. +# 예를 들어 `%.c'ë¼ëŠ” íŒ¨í„´ì— `hello.c'ê°€ 들어 ë§žì•˜ì„ ê²½ìš° stemì€ `hello'ì´ë‹¤. +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "'%.*s' 스템ì—ì„œ 패턴 규칙 ì‹œë„.\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "불가능한 규칙 선행조건 '%s'ì€(는) 거부ë©ë‹ˆë‹¤.\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "불가능한 ë¬µì‹œì  ì„ í–‰ì¡°ê±´ '%s'ì€(는) 거부ë©ë‹ˆë‹¤.\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "규칙 선행조건 '%s'ì„(를) ì‹œë„합니다.\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "ë¬µì‹œì  ì„ í–‰ì¡°ê±´ '%s'ì„(를) ì‹œë„합니다.\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "VPATH '%2$s'ì—ì„œ 선행조건 '%1$s'ì„(를) 찾았습니다\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "중간 íŒŒì¼ '%s'ì— ëŒ€í•œ ë¬µì‹œì  ê·œì¹™ì„ ì°¾ê³  있습니다.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "ìž„ì‹œ 파ì¼ì„ 만들 수 없습니다\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (메모리 ë¤í”„ë¨)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (무시ë¨)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "<내장>" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: '%s' íƒ€ê²Ÿì— ëŒ€í•œ ëª…ë ¹ì´ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] 오류 %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] 오류 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** ë나지 ì•Šì€ ìž‘ì—…ì„ ê¸°ë‹¤ë¦¬ê³  있습니다...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "살아있는 하위 프로세스 %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (ì›ê²©)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "실패한 하위 프로세스 %p PID %s %sì„(를) 거둬들입니다\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "성공한 하위 프로세스 %p PID %s %sì„(를) 거둬들입니다\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "ìž„ì‹œ 배치 íŒŒì¼ %sì„(를) 지ì›ë‹ˆë‹¤\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "ìž„ì‹œ 배치 íŒŒì¼ %s 지우기가 실패했습니다(%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "하위 프로세스 %p PID %s%sì„(를) ì²´ì¸ì—ì„œ 지ì›ë‹ˆë‹¤.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "ìž‘ì—… 서버 세마í¬ì–´ í•´ì œ: (오류 %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "하위 프로세스 %p(%s)ì— í† í°ì„ ë‚´ì–´ ì¤ë‹ˆë‹¤.\n" + +# ??? 디버깅 메세지 +#: job.c:1036 +msgid "write jobserver" +msgstr "작업서버 쓰기" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy()ê°€ 프로세스를 시작하는 ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤(e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"실행 실패ì—ì„œ ì¸ìˆ˜ %dê°œ\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "하위 프로세스 %p(%s) PID %s%sì„(를) ì²´ì¸ì— 넣습니다.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "세마í¬ì–´ ë˜ëŠ” 하위 프로세스 대기: (오류 %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "하위 프로세스 %p(%s)ì—ì„œ 토í°ì„ 받았습니다.\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "ìž‘ì—… 파ì´í”„ ì½ê¸°" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: '%s' íƒ€ê²Ÿì´ ì—†ìŠµë‹ˆë‹¤" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: '%s' 타겟 ì—…ë°ì´íŠ¸, ì´ìœ : %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "ì´ ìš´ì˜ ì²´ì œì—서는 부하 ì œí•œì„ ê°•ì œí•  수 없습니다" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "부하 ì œí•œì„ ê°•ì œí•  수 없습니다: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "íŒŒì¼ í•¸ë“¤ì´ ì—†ìŒ: 표준 ìž…ë ¥ì„ ë³µì‚¬í•  수 없습니다\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "íŒŒì¼ í•¸ë“¤ì´ ì—†ìŒ: 표준 ì¶œë ¥ì„ ë³µì‚¬í•  수 없습니다\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "íŒŒì¼ í•¸ë“¤ì´ ì—†ìŒ: 표준 오류를 복사할 수 없습니다\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "표준 ìž…ë ¥ì„ ë³µêµ¬í•  수 없습니다\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "표준 ì¶œë ¥ì„ ë³µêµ¬í•  수 없습니다\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "표준 오류를 복구할 수 없습니다\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"하위 프로세스 PID %sì„(를) 거둬들ì´ê³ , ì•„ì§ PID %sì„(를) 기다리고 있습니다\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: ëª…ë ¹ì„ ì°¾ì§€ 못했ìŒ" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: ì…¸ í”„ë¡œê·¸ëž¨ì„ ì°¾ì§€ 못했ìŒ" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: 환경 변수 ê³µê°„ì´ ë°”ë‹¥ë‚¬ì„ ìˆ˜ 있습니다" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELLì´ ë°”ë€Œì—ˆìŠµë‹ˆë‹¤(과거 '%s', 현재 '%s')\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "ìž„ì‹œ 배치 íŒŒì¼ %sì„(를) 만듭니다\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"배치 íŒŒì¼ ë‚´ìš©:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"배치 íŒŒì¼ ë‚´ìš©:%s\n" +"\t%s\n" + +# ??? 디버깅 메세지 +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (%d번째 줄) ìž˜ëª»ëœ ì‰˜ 컨í…스트 (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "-O[ë°©ì‹] (--output-sync[=ë°©ì‹]) ì˜µì…˜ì€ ì´ ë¹Œë“œì—ì„œ 사용하지 않습니다." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "ì „ì—­ 심볼 í…Œì´ë¸”ì„ ì—¬ëŠ”ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "ì½ì–´ë“¤ì¸ %s 오브ì íŠ¸ëŠ” GPL 호환ì´ë¼ê³  선언하지 않았습니다" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "%s ì‹¬ë³¼ì„ %sì—ì„œ ì½ì–´ë“¤ì´ëŠ”ë° ì‹¤íŒ¨: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "ì½ì–´ë“¤ì¼ 심볼 ì´ë¦„ì´ ë¹„ì—ˆìŒ: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "%s ì‹¬ë³¼ì„ %sì—ì„œ ì½ì–´ë“¤ìž„\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "'load' ìž‘ì—…ì€ ì´ í”Œëž«í¼ì—ì„œ 지ì›ë˜ì§€ 않습니다." + +#: main.c:313 +msgid "Options:\n" +msgstr "옵션:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m 무시ë©ë‹ˆë‹¤, í˜¸í™˜ì„ ìœ„í•´ 유지.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make ì¡°ê±´ì— ê´€ê³„ ì—†ì´ ëª¨ë“  íƒ€ê²Ÿì„ ë§Œë“­ë‹ˆë‹¤.\n" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C <디렉터리>, --directory=<디렉터리>\n" +" 뭔가 하기 ì „ì— <디렉터리>ë¡œ ì´ë™í•©ë‹ˆë‹¤.\n" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d 여러 가지 디버깅 정보를 출력합니다.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=플래그] 여러 가지 ì¢…ë¥˜ì˜ ë””ë²„ê¹… 정보를 출력합니다.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" 환경변수가 ë©”ì´í¬íŒŒì¼ ë‚´ìš©ì— ìš°ì„ í•©ë‹ˆë‹¤.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=<문ìžì—´> <문ìžì—´>ì„ ë©”ì´í¬íŒŒì¼ 내용으로 í•´ì„합니다.\n" + +#: main.c:330 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f <파ì¼>, --file=<파ì¼>, --makefile=<파ì¼>\n" +" <파ì¼>ì„ ë©”ì´í¬íŒŒì¼ë¡œ ì½ìŠµë‹ˆë‹¤.\n" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help ì´ ë©”ì‹œì§€ë¥¼ 출력하고 ë냅니다.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors 명령ì—ì„œ ë°œìƒí•˜ëŠ” 오류를 무시합니다.\n" + +#: main.c:337 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I <디렉터리>, --include-dir=<디렉터리>\n" +" í¬í•¨í•  ë©”ì´í¬íŒŒì¼ì„ <디렉터리>ì—ì„œ 찾습니다.\n" + +#: main.c:340 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] ë™ì‹œì— Nê°œì˜ ìž‘ì—… 허용, ì¸ìž 없으면 무한대로 í—ˆ" +"ìš©.\n" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going ì¼ë¶€ íƒ€ê²Ÿì„ ë§Œë“¤ 수 ì—†ë”ë¼ë„ ê³„ì† ì§„í–‰í•©ë‹ˆë‹¤.\n" + +#: main.c:344 +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" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times 심볼릭 ë§í¬ì™€ 실제 중 ë” ìµœê·¼ 수정 ì‹œê°ì„\n" +" 사용합니다.\n" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" +" -O[ë°©ì‹], --output-sync[=ë°©ì‹]\n" +" 병렬 ìž‘ì—…ì˜ ì¶œë ¥ì„ <ë°©ì‹>ì— ë”°ë¼ ë§žì¶¥ë‹ˆë‹¤.\n" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base makeì˜ ë‚´ë¶€ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 출력합니다.\n" + +#: main.c:360 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question ëª…ë ¹ì„ ì‹¤í–‰í•˜ì§€ ì•ŠìŒ. 종료 ìƒíƒœë¡œ ì—…ë°ì´íŠ¸\n" +" 여부를 ì•Œ 수 있습니다.\n" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules 내장 ë¬µì‹œì  ê·œì¹™ì„ ì‚¬ìš©í•˜ì§€ 않습니다.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables 내장 변수를 지정하지 못하게 합니다.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet 명령어를 출력하지 않습니다.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" -k ì˜µì…˜ì„ ë•ë‹ˆë‹¤.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch íƒ€ê²Ÿì„ ë‹¤ì‹œ 만들지 ì•Šê³  touch만 합니다.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace ì¶”ì  ì •ë³´ë¥¼ 표시합니다.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version makeì˜ ë²„ì „ 번호를 출력하고 ë냅니다.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory 현재 디렉터리를 출력합니다.\n" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr " --no-print-directory 묵시ì ìœ¼ë¡œ 켜져 있ë”ë¼ë„ -w를 ë•ë‹ˆë‹¤.\n" + +#: main.c:381 +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" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables ì •ì˜ë˜ì§€ ì•Šì€ ë³€ìˆ˜ë¥¼ 참조할 ë•Œ 경고를 냅니다.\n" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "빈 문ìžì—´ì€ íŒŒì¼ ì´ë¦„으로 부ì ì ˆí•©ë‹ˆë‹¤" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "디버깅 단계 지정 '%s'ì´(ê°€) 잘못ë˜ì—ˆìŠµë‹ˆë‹¤" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "ì•Œ 수 없는 output-sync ë°©ì‹ '%s'" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: ì¸í„°ëŸ½íŠ¸/예외가 발견ë˜ì—ˆìŠµë‹ˆë‹¤(코드 = 0x%lx, 주소 = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "ì ‘ê·¼ 권한 위반: 주소 0x%pì— ì“°ê¸°\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "ì ‘ê·¼ 권한 위반: 주소 0x%pì—ì„œ ì½ê¸°\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() 설정 default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell() 경로 íƒìƒ‰ 설정 default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%sì´(ê°€) 30ì´ˆë™ì•ˆ ì¼ì‹œ 중지ë©ë‹ˆë‹¤..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "완료 sleep(30). 계ì†.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "내부 오류: ìž‘ì—… 서버 세마í¬ì–´('%s')를 ì—´ 수 없습니다: (오류 %ld: %s)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "ìž‘ì—… 서버 í´ë¼ì´ì–¸íŠ¸(세마í¬ì–´ %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "내부 오류: ìž˜ëª»ëœ --jobserver-fds 문ìžì—´ '%s'" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "ìž‘ì—… 서버 í´ë¼ì´ì–¸íŠ¸(íŒŒì¼ ë””ìŠ¤í¬ë¦½í„° %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "경고: 파ìƒëœ ë©”ì´í¬ì—ì„œ -jNì´ ê°•ì œë˜ì—ˆìŠµë‹ˆë‹¤: 작업서버 모드를 ë•ë‹ˆë‹¤." + +# ??? 디버깅 메세지 +#: main.c:1567 +msgid "dup jobserver" +msgstr "dup 작업서버" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"경고: 작업서버를 사용할 수 없습니다: -j1ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. ìƒìœ„ ë©”ì´í¬ ê·œì¹™ì— " +"'+'를 추가합니다." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "표준입력ì—ì„œ 받아들ì´ëŠ” ë©”ì´í¬íŒŒì¼ì´ ë‘ ë²ˆ ì´ìƒ 지정ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen(ìž„ì‹œ 파ì¼)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite(ìž„ì‹œ 파ì¼)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "병렬 ìž‘ì—…(-j)ì€ ì´ í”Œëž«í¼ì—ì„œ 지ì›í•˜ì§€ 않습니다." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "ë‹¨ì¼ ìž‘ì—… (-j1) 모드로 ëŒì•„갑니다." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "작업서버 ìŠ¬ë¡¯ì€ %d개로 제한ë©ë‹ˆë‹¤\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "작업서버 세마í¬ì–´ 만들기: (오류 %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "ìž‘ì—… 파ì´í”„ ìƒì„±" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "작업서버 파ì´í”„ 초기화" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "심볼릭 ë§í¬ë¥¼ 지ì›í•˜ì§€ 않습니다: -L ì˜µì…˜ì„ ë•ë‹ˆë‹¤." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "ë©”ì´í¬íŒŒì¼ì„ ì—…ë°ì´íŠ¸í•˜ê³  있습니다....\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "ë©”ì´í¬íŒŒì¼ '%s'ì€(는) 반복할 수 있으므로, 다시 만들지 않습니다.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "'%s' ë©”ì´í¬íŒŒì¼ì„ 다시 ë§Œë“œëŠ”ë° ì‹¤íŒ¨." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "í¬í•¨ëœ ë©”ì´í¬íŒŒì¼ '%s'ì„(를) 찾지 못했습니다." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "ë©”ì´í¬íŒŒì¼ '%s'ì„(를) 찾지 못했습니다" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "ì›ëž˜ 디렉터리로 ëŒì•„ê°ˆ 수 없습니다." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "재실행[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (ìž„ì‹œ 파ì¼): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL ì•ˆì— íƒ€ê²Ÿì´ ì—¬ëŸ¬ ê°œ 들어 있습니다" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "íƒ€ê²Ÿì´ ì§€ì •ë˜ì§€ 않았고 ë©”ì´í¬íŒŒì¼ì´ 없습니다" + +#: main.c:2511 +msgid "No targets" +msgstr "타겟 ì—†ìŒ" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "최종 íƒ€ê²Ÿì„ ê°±ì‹ í•©ë‹ˆë‹¤....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"경고: 시계가 잘못ë˜ì—ˆìŒì´ 발견ë˜ì—ˆìŠµë‹ˆë‹¤. 빌드가 불완전할 수 있습니다." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "사용법: %s [옵션] [타겟] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"ì´ í”„ë¡œê·¸ëž¨ì€ %sì—ì„œ 사용하ë„ë¡ ë¹Œë“œë˜ì—ˆìŠµë‹ˆë‹¤\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"ì´ í”„ë¡œê·¸ëž¨ì€ %s(%s)ì—ì„œ 사용하ë„ë¡ ë¹Œë“œë˜ì—ˆìŠµë‹ˆë‹¤\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "문제ì ì„ ë¡œ 알려 주십시오.\n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "'%s%s' ì˜µì…˜ì€ ë¹„ì–´ 있지 ì•Šì€ ë¬¸ìžì—´ ì¸ìˆ˜ê°€ 필요합니다" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "'-%c' ì˜µì…˜ì€ 0보다 í° ì •ìˆ˜ ì¸ìˆ˜ê°€ 필요합니다" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%s%s 빌드\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%s%s(%s) 빌드\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# ë©”ì´í¬ ë°ì´í„°ë² ì´ìŠ¤, %sì— í‘œì‹œ" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# ë©”ì´í¬ ë°ì´í„°ë² ì´ìŠ¤ 마침, %sì—ì„œ\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "ì•Œ 수 없는 오류 %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: ì‚¬ìš©ìž %lu (실제 %lu), 그룹 %lu (실제 %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "ì ‘ê·¼ 권한 초기화" + +#: misc.c:622 +msgid "User access" +msgstr "ì‚¬ìš©ìž ì ‘ê·¼" + +#: misc.c:670 +msgid "Make access" +msgstr "ë©”ì´í¬ ì ‘ê·¼" + +#: misc.c:704 +msgid "Child access" +msgstr "하위 ì ‘ê·¼" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: ì•Œ 수 없는 디렉터리 들어ê°\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: ì•Œ 수 없는 디렉터리 나ê°\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: 디렉터리 '%s' 들어ê°\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: 디렉터리 '%s' 나ê°\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: ì•Œ 수 없는 디렉터리 들어ê°\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: ì•Œ 수 없는 디렉터리 나ê°\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: 디렉터리 '%s' 들어ê°\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: 디렉터리 '%s' 나ê°\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "쓰기 오류: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". 멈춤.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "ë©”ì´í¬íŒŒì¼ì„ ì½ê³  있습니다...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "'%s' ë©”ì´í¬íŒŒì¼ì„ ì½ê³  있습니다" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (최종 íƒ€ê²Ÿì´ ì—†ìŒ)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (íƒìƒ‰ 경로)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (ìƒê´€ 안함)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (~ 확장 ì—†ìŒ)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "ë©”ì´í¬íŒŒì¼ '%s'ì—ì„œ UTF-8 BOM 무시\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "ë©”ì´í¬íŒŒì¼ 버í¼ì—ì„œ UTF-8 BOM 무시\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "ì¡°ê±´ë¬¸ì— ë¶€ì ì ˆí•œ ë¬¸ë²•ì´ ì“°ìž„" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: ì½ì–´ë“¤ì´ëŠ”ë° ì‹¤íŒ¨" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "첫번째 타겟보다 ì•žì—ì„œ 명령어가 시작ë˜ì—ˆìŠµë‹ˆë‹¤" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "명령 ì•žì— ê·œì¹™ì´ ë¹ ì¡ŒìŒ" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (8ê°œì˜ ê³µë°± ë§ê³  íƒ­ì„ ì“°ë ¤ê³  í•œ 것 아니었습니까?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "분리기호 %sì´(ê°€) ë¹ ì¡ŒìŒ" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "타겟 íŒ¨í„´ì´ ë¹ ì¡ŒìŒ" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "다중 타겟 패턴" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "타겟 íŒ¨í„´ì— '%%'ê°€ 없습니다." + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "'endif'ê°€ ë¹ ì¡ŒìŒ" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "빈 변수 ì´ë¦„" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "'define' ì§€ì‹œìž ë’¤ì— í•„ìš” 없는 í…스트 있ìŒ" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "'endef'ê°€ ë¹ ì¡ŒìŒ. 'define'ì„ ë§ˆì¹˜ì§€ 않았습니다" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "'endef' ì§€ì‹œìž ë’¤ì— í•„ìš” 없는 í…스트가 있ìŒ" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "'%s' ì§€ì‹œìž ë’¤ì— í•„ìš” 없는 í…스트가 있ìŒ" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "í•„ìš” 없는 '%s'" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "í•œ ê°œì˜ ì¡°ê±´ì—는 í•œ ê°œì˜ 'else'만 있어야 합니다" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "타겟별 변수 ì •ì˜ í˜•ì‹ì´ 틀렸습니다" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "명령어ì—ì„œ ì„ í–‰ì¡°ê±´ì„ ì •ì˜í•  수 없습니다" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "ë¬µì‹œì  íŒ¨í„´ 룰과 ê³ ì •ëœ íŒ¨í„´ë£°ì´ ì„žì˜€ìŠµë‹ˆë‹¤" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "í˜¼í•©ëœ ë¬µì‹œì  ê·œì¹™ê³¼ ì¼ë°˜ì  규칙" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "타겟 '%s'ì€(는) 타겟 íŒ¨í„´ì— ë§žì§€ 않습니다" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "타겟 íŒŒì¼ '%s'ì€(는) :와 :: í•­ëª©ì„ ë™ì‹œì— ê°–ê³  있습니다" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "타겟 '%s'ì´(ê°€) ê°™ì€ ê·œì¹™ì—ì„œ 여러 번 주어졌습니다" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "경고: 타겟 '%s'ì— ëŒ€í•œ 명령보다 우선합니다" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "경고: 타겟 '%s'ì— ëŒ€í•œ 과거 ëª…ë ¹ì„ ë¬´ì‹œí•©ë‹ˆë‹¤" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "í˜¼í•©ëœ ë¬µì‹œì  ê·œì¹™ê³¼ ì¼ë°˜ì  규칙" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "경고: NUL 문ìžê°€ 발견ë˜ì—ˆìŠµë‹ˆë‹¤; ì¤„ì˜ ë‚˜ë¨¸ì§€ëŠ” 무시ë©ë‹ˆë‹¤" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "'%s'ì„(를) 위해 í•  ì¼ì´ 없습니다." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "'%s'ì€(는) ì´ë¯¸ ì—…ë°ì´íŠ¸ë˜ì—ˆìŠµë‹ˆë‹¤." + +# pruneì´ truncateì˜ ì˜ë¯¸ì¸ê°€ 지운다는 ì˜ë¯¸ì¸ê°€?? +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "'%s' 파ì¼ì„ 잘ë¼ëƒ…니다.\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%1$s'%3$s'ì—ì„œ 필요한 '%2$s' íƒ€ê²Ÿì„ ë§Œë“¤ ê·œì¹™ì´ ì—†ìŠµë‹ˆë‹¤%4$s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%s타겟 '%s'ì„(를) 만들 ê·œì¹™ì´ ì—†ìŠµë‹ˆë‹¤%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "'%s' 타겟 파ì¼ì„ 고려합니다.\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "ìµœê·¼ì— '%s' íŒŒì¼ ì—…ë°ì´íŠ¸ë¥¼ ì‹œë„í•´ 실패했습니다.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "'%s' 파ì¼ì€ ì´ë¯¸ 검토했습니다.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "ì•„ì§ '%s' 파ì¼ì„ ì—…ë°ì´íŠ¸í•˜ê³  있습니다.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "'%s' 파ì¼ì˜ ì—…ë°ì´íŠ¸ë¥¼ 마쳤습니다.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "'%s' 파ì¼ì´ 없습니다.\n" + +#: remake.c:495 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Warning: .LOW_RESOLUTION_TIME íŒŒì¼ '%s'ì— ê³ í•´ìƒë„ 타임 스탬프가 들어 있" +"습니다" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "'%s'ì— ëŒ€í•œ ë¬µì‹œì  ê·œì¹™ì„ ì°¾ì•˜ìŠµë‹ˆë‹¤.\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "'%s'ì— ëŒ€í•œ ë¬µì‹œì  ê·œì¹™ì´ ì—†ìŠµë‹ˆë‹¤.\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "'%s'ì— ëŒ€í•´ 기본 명령 사용.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "%s <- %s ìƒí˜¸ ì˜ì¡´ì„±ì€ 무시ë©ë‹ˆë‹¤." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "타겟 íŒŒì¼ '%s'ì˜ ì„ í–‰ì¡°ê±´ì„ ë§ˆì³¤ìŠµë‹ˆë‹¤.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "'%s'ì˜ ì„ í–‰ì¡°ê±´ì´ ë§Œë“¤ì–´ì§€ê³  있습니다.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "타겟 íŒŒì¼ '%s'ì„(를) í¬ê¸°í•©ë‹ˆë‹¤.\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "오류로 '%s' íƒ€ê²Ÿì„ ë‹¤ì‹œ 만들지 못했습니다." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "'%s' ì„ í–‰ ì¡°ê±´ì€ '%s' íƒ€ê²Ÿì— ëŒ€í•´ 순서만 ì„ í–‰ 조건입니다.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "타겟 '%2$s'ì˜ ì„ í–‰ì¡°ê±´ %1$sì´(ê°€) 없습니다.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "'%s' ì„ í–‰ ì¡°ê±´ì´ '%s' 타겟보다 ë‚˜ì¤‘ì— ë§Œë“¤ì–´ì¡ŒìŠµë‹ˆë‹¤.\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "'%s' ì„ í–‰ ì¡°ê±´ì´ '%s' 타겟보다 먼저 만들어졌습니다.\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "'%s' íƒ€ê²Ÿì€ ì½œë¡  ë‘ ê°œê°€ 붙었고 ì„ í–‰ì¡°ê±´ì´ ì—†ìŠµë‹ˆë‹¤.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "'%s'ì— ëŒ€í•œ 명령어가 없고 ì–´ë–¤ ì„ í–‰ì¡°ê±´ë„ ì‹¤ì œë¡œ 바뀌지 않았습니다.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "always-make 옵션 ë•Œë¬¸ì— '%s' íƒ€ê²Ÿì„ ë§Œë“­ë‹ˆë‹¤.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "'%s' íƒ€ê²Ÿì„ ë‹¤ì‹œ 만들 필요가 없습니다" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; VPATH ì´ë¦„ '%s'ì„(를) 사용합니다" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "'%s' íƒ€ê²Ÿì„ ë‹¤ì‹œ 만들어야 합니다.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " VPATH ì´ë¦„ '%s'ì„(를) 무시합니다.\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "'%s'ì˜ ëª…ë ¹ì´ ì‹¤í–‰ 중입니다.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "'%s' 타겟 파ì¼ì„ 다시 ë§Œë“œëŠ”ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "'%s' 타겟 파ì¼ì„ 성공ì ìœ¼ë¡œ 다시 만들었습니다.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "'%s' 타겟 파ì¼ì„ -q 옵션으로 다시 만들어야 합니다.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "'%s'ì— ëŒ€í•´ 기본 ëª…ë ¹ì„ ì‚¬ìš©.\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "경고: '%s' 파ì¼ì˜ 변경 ì‹œê°ì´ 미래입니다" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "경고: '%s' 파ì¼ì˜ 변경 ì‹œê°(%s)ì´ ë¯¸ëž˜ìž…ë‹ˆë‹¤" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNSì˜ ì›ì†Œ '%s'ì´(ê°€) íŒ¨í„´ì´ ì•„ë‹™ë‹ˆë‹¤" + +# ??? 디버깅 메세지 -- 뭔지 알기 어려움 +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customsì€ exportë˜ì§€ 않습니다: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# ë¬µì‹œì  ê·œì¹™" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# ë¬µì‹œì  ê·œì¹™ ì—†ìŒ." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# ë¬µì‹œì  ê·œì¹™ %uê°œ, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " 터미ë„." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "버그: num_pattern_rules 틀렸습니다! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "ì•Œ 수 없는 신호" + +#: signame.c:92 +msgid "Hangup" +msgstr "ëŠì–´ì§" + +#: signame.c:95 +msgid "Interrupt" +msgstr "ì¸í„°ëŸ½íŠ¸" + +#: signame.c:98 +msgid "Quit" +msgstr "ë내기" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "ìž˜ëª»ëœ ëª…ë ¹" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "추ì /ì¤‘ë‹¨ì  íŠ¸ëž©" + +#: signame.c:109 +msgid "Aborted" +msgstr "중단ë¨" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT 트랩" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT 트랩" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "ë¶€ë™ ì†Œìˆ˜ì  ì˜ˆì™¸" + +#: signame.c:121 +msgid "Killed" +msgstr "죽었ìŒ" + +#: signame.c:124 +msgid "Bus error" +msgstr "버스 오류" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "세그멘테ì´ì…˜ 오류" + +#: signame.c:130 +msgid "Bad system call" +msgstr "ìž˜ëª»ëœ ì‹œìŠ¤í…œ 호출" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "깨어진 파ì´í”„" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "ìžëª…종 시계" + +#: signame.c:139 +msgid "Terminated" +msgstr "종료ë¨" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "ì‚¬ìš©ìž ì •ì˜ ì‹ í˜¸ 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "ì‚¬ìš©ìž ì •ì˜ ì‹ í˜¸ 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "하위 프로세스 ë남" + +#: signame.c:156 +msgid "Power failure" +msgstr "ì „ë ¥ 중단" + +#: signame.c:159 +msgid "Stopped" +msgstr "중지ë¨" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "중지ë¨(tty ìž…ë ¥)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "중지ë¨(tty 출력)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "중지ë¨(시그ë„)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU 시간 제한 초과ë¨" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "íŒŒì¼ í¬ê¸° 제한 초과ë¨" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "ê°€ìƒ íƒ€ì´ë¨¸ 시간 초과ë¨" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "프로파ì¼ë§ 타ì´ë¨¸ 시간 초과ë¨" + +#: signame.c:186 +msgid "Window changed" +msgstr "ì°½ì´ ë°”ë€Œì—ˆìŒ" + +#: signame.c:189 +msgid "Continued" +msgstr "계ì†ë¨" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "긴급한 입출력 ìƒí™©" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "입출력 가능" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "ìžì› ì†ì‹¤" + +#: signame.c:214 +msgid "Danger signal" +msgstr "위험 신호" + +#: signame.c:217 +msgid "Information request" +msgstr "ì •ë³´ 요청" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "부ë™ì†Œìˆ˜ì  ì—°ì‚° 보조프로세서가 없습니다" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s strcache ë²„í¼ ì—†ìŒ\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s 현재 버í¼: í¬ê¸° = %hu B / 사용 = %hu B / 개수 = %hu / í‰ê·  = %hu B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s 기타 사용: ì „ì²´ = %lu B / 개수 = %lu / í‰ê·  = %lu B\n" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" +"%s 기타 빈 공간: ì „ì²´ = %lu B / 최대 = %lu B / 최소 = %lu B / í‰ê·  = %hu B\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s strcache 효율: 검색 = %lu / 히트 비율 = %lu%%\n" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# í•´ì‹œ í…Œì´ë¸” 통계:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "ìžë™" + +#: variable.c:1602 +msgid "default" +msgstr "기본값" + +#: variable.c:1605 +msgid "environment" +msgstr "환경" + +#: variable.c:1608 +msgid "makefile" +msgstr "ë©”ì´í¬íŒŒì¼" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "-e í•˜ì˜ í™˜ê²½" + +#: variable.c:1614 +msgid "command line" +msgstr "명령행" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "'override' 지시ìž" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " ('%s'ì—ì„œ, %lu번째 줄)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# 변수 ëª¨ìŒ í•´ì‹œ í…Œì´ë¸” 통계:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# 변수\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# íŒ¨í„´ì„ ìœ„í•œ 변수 ê°’" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# íŒ¨í„´ì„ ìœ„í•œ 변수 ê°’ì´ ì—†ìŠµë‹ˆë‹¤." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# 특정 íŒ¨í„´ì„ ìœ„í•œ 변수 ê°’ %uê°œ" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "경고: ì •ì˜ë˜ì§€ ì•Šì€ ë³€ìˆ˜ '%.*s'" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search()ê°€ %dë²ˆì„ ë¦¬í„´í•˜ë©° 실패했습니다\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "경고: 비어 있는 리다ì´ë ‰ì…˜\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "내부 오류: '%s' command_state" + +# DCL - Digital Command Language, VMSì—서만 존재하는 shell languageì˜ ì¼ì¢… +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-경고, DCLì—ì„œ CTRL-Y를 다시 사용가능하ë„ë¡ í•´ì•¼ í•  것입니다.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "내장 [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "내장 CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "내장 CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "ì•Œ 수 없는 내장 명령어 '%s'\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "오류, 빈 명령어\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "ìž…ë ¥ì„ %sì—ì„œ 리다ì´ë ‰íŠ¸í•©ë‹ˆë‹¤\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "오류를 %s(으)ë¡œ 리다ì´ë ‰íŠ¸í•©ë‹ˆë‹¤\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "ì¶œë ¥ì„ %sì— ë¶™ìž…ë‹ˆë‹¤\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "ì¶œë ¥ì„ %s(으)ë¡œ ëŒë¦½ë‹ˆë‹¤\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "%.*sì„(를) 붙ì´ê³  지ì›ë‹ˆë‹¤\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "대신 %sì„(를) 실행\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "실행 오류, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH íƒìƒ‰ 경로\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# 'vpath' íƒìƒ‰ 경로가 ì—†ìŒ." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# 'vpath' íƒìƒ‰ 경로 %uê°œ.\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# ì¼ë°˜ì ì¸ ('VPATH' 변수) íƒìƒ‰ 경로가 ì—†ìŒ." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# ì¼ë°˜ì ì¸ ('VPATH' 변수) íƒìƒ‰ 경로:\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" diff --git a/po/lt.gmo b/po/lt.gmo new file mode 100644 index 0000000..5277a0e Binary files /dev/null and b/po/lt.gmo differ diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000..e9fa7d2 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,2186 @@ +# 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: 2014-10-05 12:25-0400\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-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" +"%100<10 || n%100>=20) ? 1 : 2);\n" + +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "bandymas naudoti nepalaikomÄ… funkcionalumÄ…: „%s“" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Archyvas „%s“ neegzistuoja" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: „%s“ nÄ—ra taisyklingas archyvas" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Archyvas „%s“ neegzistuoja" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "nepavyko atverti bibliotekos „%s“ bandant surasti narį „%s“" + +#: arscan.c:944 +#, fuzzy, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Narys „%s“%s: %ld baitų pozicijoje %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (pavadinimas gali bÅ«ti sutrumpintas)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Data %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Trinamas failas „%s“" + +#: commands.c:649 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Trinamas failas „%s“" + +#: commands.c:685 +#, fuzzy +msgid "# recipe to execute" +msgstr "# vykdytinos komandos" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (integruota)" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (nuo „%s“, %lu eilutÄ—):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Aplankai\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: negalÄ—jo bÅ«ti stat'intas.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (key %s, mtime %d): nepavyko atverti.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "" + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "" + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "" + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Ne" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " failai, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "ne" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " negalimybÄ—s" + +#: dir.c:1068 +msgid " so far." +msgstr " kol kas." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " negalimybÄ—s %lu aplankuose.\n" + +#: expand.c:125 +#, fuzzy, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekursyvus kintamasis „%s“ nukreipia į save (anksÄiau ar vÄ—liau)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "neterminuota nuoroda į kintamÄ…jį" + +#: file.c:271 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Komandos nurodytos failui „%s“ %s:%lu," + +#: file.c:276 +#, fuzzy, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Komandos failui „%s“ rastos pagal neiÅ¡reikÅ¡tinÄ™ taisyklių paieÅ¡kÄ…" + +#: file.c:280 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "bet „%s“ dabar laikomas tuo paÄiu failu kaip „%s“." + +#: file.c:283 +#, fuzzy, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "Komandos „%s“ bus ignoruojamos „%s“ komandų naudai." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Trinamas tarpinis failas „%s“" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Å alinami tarpiniai failai...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Dabartinis laikas" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Laiko žymÄ— už rėžių; keiÄiama į %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Ne tikslas:" + +#: file.c:960 +#, fuzzy +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Brangus failas (reikalingas .PRECIOUS)" + +#: file.c:962 +#, fuzzy +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Keistas tikslas (reikalingas .PHONY)." + +#: file.c:964 +#, fuzzy +msgid "# Command line target." +msgstr "# KomandinÄ—s eilutÄ—s tikslas" + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Numatytoji reikÅ¡mÄ—, MAKEFILES, arba -include/sinclude „make“ failas" + +#: file.c:968 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# NÄ—ra neiÅ¡reikÅ¡tinių taisyklių." + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# NeiÅ¡reikÅ¡tinių taisyklių paieÅ¡ka atlikta." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# NeiÅ¡reikÅ¡tinių taisyklių paieÅ¡ka neatlikta." + +#: file.c:973 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# IÅ¡reikÅ¡tinis/statinis Å¡ablono kamienas: „%s“\n" + +#: file.c:975 +#, fuzzy +msgid "# File is an intermediate prerequisite." +msgstr "# Failas yra tarpinÄ— sÄ…lyga" + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Taip pat sukuria:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Modifikacijos laikas niekada netikrintas." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Failas neegzistuoja." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Failas labai senas." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Paskutinį kartÄ… pakeista %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Failas atnaujintas." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Failas nebuvo atnaujintas." + +#: file.c:1001 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Dabar vykdomos komandos (TAI KLAIDA)." + +#: file.c:1004 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Vykdomos priklausomybių komandos (TAI KLAIDA)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# SÄ—kmingai atnaujinta." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Turi bÅ«ti atnaujinta (-q nustatyta)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Nepavyko atnaujinti." + +#: file.c:1025 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Netaisyklinga reikÅ¡mÄ— „command_state“ naryje!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Failai" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# failų maiÅ¡os lentelÄ—s statistika:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "" + +#: function.c:2193 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: function.c:2203 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "raÅ¡ymo klaida: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "" + +#: function.c:2601 +#, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "" + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: parametras `%s' dviprasmis\n" + +#: getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: argumentas „--%s“ neleidžia parametro\n" + +#: getopt.c:688 +#, fuzzy, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: argumentas „%c%s“ neleidžia parametro\n" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: parametrui „%s“ reikia argumento\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: neatpažintas argumentas „--%s“\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: neatpažintas argumentas „%c%s“\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: neleistinas parametras -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: netaisyklingas argumentas -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: parametrui reikia argumento -- %c\n" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: parametras „-W %s“ dviprasmis\n" + +#: getopt.c:862 +#, fuzzy, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: parametras „-W %s“ neleidžia argumento\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Rasta neiÅ¡reikÅ¡tinÄ— taisyklÄ— tikslui „%s“.\n" + +#: implicit.c:54 +#, fuzzy, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Rasta neiÅ¡reikÅ¡tinÄ— taisyklÄ— tikslui „%s“.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Å alinami tarpiniai failai...\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "" + +#: job.c:483 +msgid " (core dumped)" +msgstr "" + +#: job.c:488 +msgid " (ignored)" +msgstr "" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (integruota)" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "" + +#: job.c:529 +#, fuzzy, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s%s: %s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "" + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr "" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "" + +#: job.c:849 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "%s: nepavyko atverti laikinojo failo: %s" + +#: job.c:855 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "%s: nepavyko atverti laikinojo failo: %s" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: job.c:1036 +#, fuzzy +msgid "write jobserver" +msgstr "raÅ¡ymo klaida: %s" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: Archyvas „%s“ neegzistuoja" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%sNÄ—ra taisyklÄ—s pasiekti tikslui „%s“, kurio reikia „%s“%s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "" + +#: job.c:2173 +#, fuzzy +msgid "cannot enforce load limit: " +msgstr "%s: nepayko pakeisti limito: %s" + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Komanda nerasta" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Kevalo programa nerasta" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL pakeistas (buvo „%s“, dabar „%s“)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "" + +#: main.c:313 +msgid "Options:\n" +msgstr "" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr "" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:330 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr "" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: main.c:340 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" + +#: main.c:344 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:349 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:352 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" + +#: main.c:360 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr "" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr "" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" + +#: main.c:381 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "negalimas tuÅ¡Äias failo pavadinimas" + +#: main.c:737 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "nežinomas debug lygio specifikacija „%s“" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" + +#: main.c:835 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "" + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" + +#: main.c:1567 +msgid "dup jobserver" +msgstr "" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "" + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "" + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "" + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Atnaujinami „make“ failai....\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "" + +#: main.c:2237 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Nereikia atnaujinti taikinio „%s“" + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "„Make“ failas „%s“ nerastas" + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "„Make“ failas „%s“ nerastas" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Nepavyko grįžti į pirminį aplankÄ…." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "" + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Nenurodyta tikslų ir nerasta „make“ failų" + +#: main.c:2511 +msgid "No targets" +msgstr "NÄ—ra tikslų" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Atnaujinami tikslai...\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Naudojimas: %s [argumentai] [tikslas] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Å i programa sukompiliuota %s sistemai\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Å i programa sukompiliuota %s (%s) sistemai\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "PraneÅ¡kite apie klaidas adresu \n" + +#: main.c:2807 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "parametrui „-%c“ reikia netuÅ¡Äio argumento" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "parametrui „-%c“ reikia teigiamo sveiko argumento" + +#: main.c:3269 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sÅ i programa sukompiliuota %s sistemai\n" + +#: main.c:3271 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sÅ i programa sukompiliuota %s (%s) sistemai\n" + +#: main.c:3282 +#, 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 "" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Nežinoma klaida %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: user %lu (real %lu), group %lu (real %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "" + +#: misc.c:622 +msgid "User access" +msgstr "" + +#: misc.c:670 +msgid "Make access" +msgstr "" + +#: misc.c:704 +msgid "Child access" +msgstr "" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Ä®einama į nežinomÄ… aplankÄ…\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: IÅ¡einama iÅ¡ nežinomo aplanko\n" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Ä®einama į aplankÄ… „%s“\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: IÅ¡einama iÅ¡ aplanko „%s“\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Ä®einama į nežinomÄ… aplankÄ…\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: IÅ¡einama iÅ¡ nežinomo aplanko\n" + +#: output.c:120 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Ä®einama į aplankÄ… „%s“\n" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: IÅ¡einama iÅ¡ aplanko „%s“\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "raÅ¡ymo klaida: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Pabaiga.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Skaitomi „make“ failai...\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Skaitomas „make“ failas „%s“" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (nÄ—ra numatytojo tikslo)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (paieÅ¡kos kelias)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (nesvarbu)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (nÄ—ra ~ iÅ¡plÄ—timo)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "netaisyklinga sÄ…lygos sintaksÄ—" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +#, fuzzy +msgid "recipe commences before first target" +msgstr "komandos prasideda prieÅ¡ pirmÄ…jį tikslÄ…" + +#: read.c:1041 +#, fuzzy +msgid "missing rule before recipe" +msgstr "trÅ«ksta taisyklÄ—s prieÅ¡ komandas" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (ar norÄ—jote padÄ—ti TAB simbolį vietoje 8 tarpų?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "trÅ«ksta skirtuko%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "trÅ«ksta tikslo Å¡ablono" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "keli tikslo Å¡ablonai" + +#: read.c:1276 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "tikslo Å¡ablone nÄ—ra „%%“" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "trÅ«ksta „endif“" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "tuÅ¡Äias kintamojo pavadinimas" + +#: read.c:1471 +#, fuzzy +msgid "extraneous text after 'define' directive" +msgstr "Perteklinis tekstas po „endef“ direktyvos" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "trÅ«ksta „endef“, nebaigtas „define“" + +#: read.c:1524 +#, fuzzy +msgid "extraneous text after 'endef' directive" +msgstr "Perteklinis tekstas po „endef“ direktyvos" + +#: read.c:1595 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "Perteklinis tekstas po „%s“ direktyvos" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "perteklinis „%s“" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "" + +#: read.c:2229 +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "NÄ—ra kÄ… daryti su „%s“." + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "„%s“ atnaujinti nereikia." + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Vis dar atnaujinamas failas „%s“.\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sNÄ—ra taisyklÄ—s pasiekti tikslui „%s“, kurio reikia „%s“%s" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sNÄ—ra taisyklÄ—s pasiekti tikslui „%s“%s" + +#: remake.c:426 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "Svarstomas tikslo failas „%s“.\n" + +#: remake.c:433 +#, fuzzy, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Neseniai bandyta ir nepavyko atnaujinti failo „%s“.\n" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "Failas „%s“ jau apsvarstytas.\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "Vis dar atnaujinamas failas „%s“.\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Baigtas atnaujinti failas „%s“.\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "Failas „%s“ neegzistuoja.\n" + +#: remake.c:495 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:508 remake.c:1040 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Rasta neiÅ¡reikÅ¡tinÄ— taisyklÄ— tikslui „%s“.\n" + +#: remake.c:510 remake.c:1042 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Nerasta neiÅ¡reikÅ¡tinių taisyklių tikslui „%s“.\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "" + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Svarstomas tikslo failas „%s“.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Svarstomas tikslo failas „%s“.\n" + +#: remake.c:700 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Tikslas „%s“ neatnaujintas dÄ—l klaidų." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Failas „%s“ neegzistuoja.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Nereikia atnaujinti taikinio „%s“" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "BÅ«tina atnaujinti taikinį „%s“.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr "" + +#: remake.c:840 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Vykdomos „%s“ komandos.\n" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Nereikia atnaujinti taikinio „%s“" + +#: remake.c:850 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "BÅ«tina atnaujinti taikinį „%s“.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "paskutinÄ— komanda: %s\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# NeiÅ¡reikÅ¡tinÄ—s taisyklÄ—s" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# NÄ—ra neiÅ¡reikÅ¡tinių taisyklių." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u neiÅ¡reikÅ¡tinių taisyklių, %u" + +#: rule.c:522 +msgid " terminal." +msgstr "" + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "" + +#: signame.c:84 +msgid "unknown signal" +msgstr "nežinomas signalas" + +#: signame.c:92 +msgid "Hangup" +msgstr "" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Pertraukimas" + +#: signame.c:98 +msgid "Quit" +msgstr "IÅ¡eita" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Neleistina instrukcija" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "" + +#: signame.c:109 +msgid "Aborted" +msgstr "" + +#: signame.c:112 +#, fuzzy +msgid "IOT trap" +msgstr "EMT gaudyklÄ—" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT gaudyklÄ—" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Slankaus kablelio klaida" + +#: signame.c:121 +msgid "Killed" +msgstr "Nutraukta" + +#: signame.c:124 +msgid "Bus error" +msgstr "MagistralÄ—s klaida" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Segmentacijos klaida" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Blogas sisteminis kvietimas" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Žadintuvas" + +#: signame.c:139 +#, fuzzy +msgid "Terminated" +msgstr "apribota" + +#: signame.c:142 +#, fuzzy +msgid "User defined signal 1" +msgstr "%s: nutrauktas signalo %d" + +#: signame.c:145 +#, fuzzy +msgid "User defined signal 2" +msgstr "%s: nutrauktas signalo %d" + +#: signame.c:150 signame.c:153 +#, fuzzy +msgid "Child exited" +msgstr "Failas jau egzistuoja" + +#: signame.c:156 +msgid "Power failure" +msgstr "Elektros maitinimo sutrikimas" + +#: signame.c:159 +msgid "Stopped" +msgstr "Sustabdyta" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Sustabdyta (tty įvedimas)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Sustabdyta (tty iÅ¡vedimas)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Sustabdyta (signalas)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "VirÅ¡ytas CPU laiko limitas" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "VirÅ¡ytas failo dydžio limitas" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "" + +#: signame.c:186 +msgid "Window changed" +msgstr "Langas pakeistas" + +#: signame.c:189 +msgid "Continued" +msgstr "PratÄ™sta" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "Galimas įvedimas/iÅ¡vedimas" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "IÅ¡teklius prarastas" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Pavojaus signalas" + +#: signame.c:217 +msgid "Information request" +msgstr "Informacijos užklausa" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Slankaus kablelio koprocesorius neprieinamas" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: strcache.c:266 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: strcache.c:289 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# failų maiÅ¡os lentelÄ—s statistika:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "" + +#: variable.c:1602 +msgid "default" +msgstr "" + +#: variable.c:1605 +msgid "environment" +msgstr "" + +#: variable.c:1608 +msgid "makefile" +msgstr "" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "" + +#: variable.c:1614 +#, fuzzy +msgid "command line" +msgstr "%s: komanda nerasta" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "tuÅ¡Äia „override“ direktyva" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (nuo „%s“, %lu eilutÄ—):\n" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "%s: neatpažintas argumentas „%c%s“\n" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "" + +#: vmsjobs.c:501 +#, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "" + +#: vmsjobs.c:505 +#, fuzzy, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "paskutinÄ— komanda: %s\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "" + +#: vmsjobs.c:681 +#, fuzzy, c-format +msgid "Redirected error to %s\n" +msgstr "skaitymo klaida: %d: %s" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr " (paieÅ¡kos kelias)" + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" + +#~ msgid "# Invalid value in `update_status' member!" +#~ msgstr "# Netaisyklinga reikÅ¡mÄ— „update_status“ naryje!" + +#~ 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" diff --git a/po/make.pot b/po/make.pot new file mode 100644 index 0000000..0faab64 --- /dev/null +++ b/po/make.pot @@ -0,0 +1,2112 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: GNU make 4.1\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\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" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "" + +#: arscan.c:255 +#, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr "" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr "" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr "" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "" + +#: commands.c:688 +msgid " (built-in):" +msgstr "" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr "" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "" + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "" + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "" + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr "" + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "" + +#: dir.c:1064 +msgid " impossibilities" +msgstr "" + +#: dir.c:1068 +msgid " so far." +msgstr "" + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr "" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "" + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "" + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "" + +#: file.c:811 +msgid "Current time" +msgstr "" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "" + +#: file.c:955 +msgid "# Not a target:" +msgstr "" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "" + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "" + +#: file.c:964 +msgid "# Command line target." +msgstr "" + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" + +#: file.c:968 +msgid "# Builtin rule" +msgstr "" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "" + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "" + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "" + +#: file.c:979 +msgid "# Also makes:" +msgstr "" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "" + +#: file.c:987 +msgid "# File does not exist." +msgstr "" + +#: file.c:989 +msgid "# File is very old." +msgstr "" + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "" + +#: file.c:997 +msgid "# File has been updated." +msgstr "" + +#: file.c:997 +msgid "# File has not been updated." +msgstr "" + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "" + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "" + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "" + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "" + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "" + +#: function.c:2601 +#, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "" + +#: job.c:483 +msgid " (core dumped)" +msgstr "" + +#: job.c:488 +msgid " (ignored)" +msgstr "" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "" + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr "" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: job.c:1036 +msgid "write jobserver" +msgstr "" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "" + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "" + +#: main.c:313 +msgid "Options:\n" +msgstr "" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr "" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:330 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr "" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: main.c:340 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" + +#: main.c:344 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:349 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:352 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" + +#: main.c:360 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr "" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr "" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" + +#: main.c:381 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" + +#: main.c:835 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "" + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" + +#: main.c:1567 +msgid "dup jobserver" +msgstr "" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "" + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "" + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "" + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "" + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "" + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "" + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "" + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "" + +#: main.c:2511 +msgid "No targets" +msgstr "" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" + +#: main.c:3282 +#, 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 "" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "" + +#: misc.c:543 +msgid "Initialized access" +msgstr "" + +#: misc.c:622 +msgid "User access" +msgstr "" + +#: misc.c:670 +msgid "Make access" +msgstr "" + +#: misc.c:704 +msgid "Child access" +msgstr "" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "" + +#: output.c:495 output.c:497 +msgid "write error: stdout" +msgstr "" + +#: output.c:677 +msgid ". Stop.\n" +msgstr "" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr "" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr "" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr "" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr "" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "" + +#: read.c:1131 +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr "" + +#: read.c:1133 +msgid "missing separator" +msgstr "" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "" + +#: read.c:2229 +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "" + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "" + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "" + +#: remake.c:495 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "" + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "" + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr "" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" + +#: rule.c:522 +msgid " terminal." +msgstr "" + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "" + +#: signame.c:84 +msgid "unknown signal" +msgstr "" + +#: signame.c:92 +msgid "Hangup" +msgstr "" + +#: signame.c:95 +msgid "Interrupt" +msgstr "" + +#: signame.c:98 +msgid "Quit" +msgstr "" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "" + +#: signame.c:109 +msgid "Aborted" +msgstr "" + +#: signame.c:112 +msgid "IOT trap" +msgstr "" + +#: signame.c:115 +msgid "EMT trap" +msgstr "" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "" + +#: signame.c:121 +msgid "Killed" +msgstr "" + +#: signame.c:124 +msgid "Bus error" +msgstr "" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "" + +#: signame.c:130 +msgid "Bad system call" +msgstr "" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "" + +#: signame.c:139 +msgid "Terminated" +msgstr "" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "" + +#: signame.c:156 +msgid "Power failure" +msgstr "" + +#: signame.c:159 +msgid "Stopped" +msgstr "" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "" + +#: signame.c:186 +msgid "Window changed" +msgstr "" + +#: signame.c:189 +msgid "Continued" +msgstr "" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "" + +#: signame.c:211 +msgid "Resource lost" +msgstr "" + +#: signame.c:214 +msgid "Danger signal" +msgstr "" + +#: signame.c:217 +msgid "Information request" +msgstr "" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: strcache.c:266 +#, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" + +#: variable.c:1599 +msgid "automatic" +msgstr "" + +#: variable.c:1602 +msgid "default" +msgstr "" + +#: variable.c:1605 +msgid "environment" +msgstr "" + +#: variable.c:1608 +msgid "makefile" +msgstr "" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "" + +#: variable.c:1614 +msgid "command line" +msgstr "" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr "" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "" + +#: vmsjobs.c:501 +#, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "" + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" diff --git a/po/nl.gmo b/po/nl.gmo new file mode 100644 index 0000000..74e6381 Binary files /dev/null and b/po/nl.gmo differ diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..56bcb1c --- /dev/null +++ b/po/nl.po @@ -0,0 +1,2334 @@ +# Dutch translations for GNU make. +# Copyright (C) 2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# +# « A quoi bon cette forfanterie? » +# +# Taco Witte , 2004. +# Benno Schulenberg , 2005, 2006, 2007, 2010, 2013. +msgid "" +msgstr "" +"Project-Id-Version: make-4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-10-09 21:18+0200\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-Generator: Lokalize 1.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "poging tot gebruik van niet-ondersteunde functie: '%s'" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "het 'touchen' van een archiefonderdeel is niet mogelijk op VMS" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: archief '%s' bestaat niet" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: '%s' is geen geldig archief" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: onderdeel '%s' bestaat niet in '%s'" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: ar_member_touch() van '%s' is mislukt" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"uitpakken van module-info door lbr$set_module() is mislukt, afsluitwaarde= %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() is mislukt, afsluitwaarde = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "kan bibliotheek '%s' niet openen om onderdeel '%s' op te zoeken" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Onderdeel '%s'%s: %ld bytes bij %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (naam kan afgekapt zijn)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modus = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Recept bevat te veel regels (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Afgebroken.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Archiefonderdeel '%s' kan onecht zijn; niet verwijderd" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Archiefonderdeel '%s' kan onecht zijn; niet verwijderd" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Verwijderen van bestand '%s'" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Verwijderen van bestand '%s'" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# uit te voeren recept" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (ingebouwd):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (uit '%s', regel %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Mappen\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# kan status van %s niet opvragen.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (sleutel %s, wijzigingstijd %d): kan niet worden geopend.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (apparaat %d, inode [%d,%d,%d]): kan niet worden geopend.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (apparaat %ld, inode %ld): kan niet worden geopend.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (sleutel %s, wijzigingstijd %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (apparaat %d, inode [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (apparaat %ld, inode %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Geen" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " bestanden, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "geen" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " onmogelijkheden" + +#: dir.c:1068 +msgid " so far." +msgstr " tot nu toe." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " onmogelijkheden in %lu mappen.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Recursieve variabele '%s' verwijst naar zichzelf (uiteindelijk)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "onafgemaakte verwijzing naar variabele" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Recept voor bestand '%s' is opgegeven in %s:%lu," + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Recept voor bestand '%s' werd gevonden via impliciet zoeken," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "maar '%s' wordt nu als hetzelfde bestand beschouwd als '%s'." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "Recept voor '%s' zal worden genegeerd ten gunste van die voor '%s'." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "kan enkeldubbelpunts '%s' niet hernoemen tot dubbeldubbelpunts '%s'" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "kan dubbeldubbelpunts '%s' niet hernoemen tot enkeldubbelpunts '%s'" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Verwijderen van tussentijds bestand '%s'" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Verwijderen van tussentijdse bestanden...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Huidige tijd" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tijdsstempel ligt buiten bereik; wordt vervangen door %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Is geen doel:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Waardevol bestand (vereiste van .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Nepdoel (vereiste van .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Doel afkomstig van opdrachtregel." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" +"# Een standaard Makefile, of eentje via MAKEFILES of '-include/sinclude'." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# Ingebouwde regel" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Impliciete regel-zoekopdracht is uitgevoerd." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Impliciete regel-zoekopdracht is niet uitgevoerd." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Impliciete/statische patroonstam: '%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Bestand is een tussentijds vereiste." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Maakt ook:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Wijzigingstijd is nooit gecontroleerd." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Bestand bestaat niet." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Bestand is erg oud." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Laatst gewijzigd %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Bestand is bijgewerkt." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Bestand is niet bijgewerkt." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Nog lopend recept (DIT IS EEN PROGRAMMAFOUT)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Nog lopende receptafhankelijkheden (DIT IS EEN PROGRAMMAFOUT)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Met succes bijgewerkt." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Moet worden bijgewerkt ('-q' is ingesteld)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Bijwerken is mislukt." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Ongeldige waarde in 'command_state'-onderdeel!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Bestanden" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# hashtabel-statistieken van bestanden:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Veld '%s' is niet gecached: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "niet-numeriek eerste argument van 'word'-functie" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "eerste argument van 'word'-functie moet groter zijn dan 0" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "niet-numeriek eerste argument van 'wordlist'-functie" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "niet-numeriek tweede argument van 'wordlist'-functie" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe(): DuplicateHandle(In) is mislukt (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe(): DuplicateHandle(Err) is mislukt (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() is mislukt (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() is mislukt\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Opschonen van tijdelijk batch-bestand %s\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "open(): %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "write(): %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "Ongeldige bestandsbewerking: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "onvoldoende aantal argumenten (%d) voor functie '%s'" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "niet-geïmplementeerd op dit platform: functie '%s'" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "onafgemaakte aanroep van functie '%s': '%c' ontbreekt" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "Lege functienaam\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Ongeldige functienaam: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Functienaam is te lang: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "Ongeldig minimumaantal argumenten (%d) voor functie '%s'\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "Ongeldig maximumaantal argumenten (%d) voor functie '%s'\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: optie '%s' is niet eenduidig\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: optie '--%s' staat geen argument toe\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: optie '%c%s' staat geen argument toe\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: optie '%s' vereist een argument\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: onbekende optie '--%s'\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: onbekende optie '%c%s'\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ongeldige optie -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ongeldige optie -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: optie vereist een argument -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: optie '-W %s' is niet eenduidig\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: optie '-W %s' staat geen argument toe\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expanderen van '%s'\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Evalueren van '%s'\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"kan %lu bytes voor hashtabel niet reserveren: onvoldoende geheugen " +"beschikbaar" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Belasting=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Herhash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Botsingen=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Zoeken naar impliciete regel voor '%s'.\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Zoeken naar archiefonderdeel-impliciete regel voor '%s'.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Impliciete regelrecursie wordt ontweken.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Stam is te lang: '%.*s'.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Patroonregel wordt geprobeerd met stam '%.*s'.\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Onmogelijke regelvereiste '%s' wordt verworpen.\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Onmogelijke impliciete vereiste '%s' wordt verworpen.\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Proberen van regelvereiste '%s'.\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Proberen van impliciete vereiste '%s'.\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Vereiste '%s' gevonden als VPATH '%s'.\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Zoeken naar een regel met tussentijds bestand '%s'.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Kan geen tijdelijk bestand aanmaken\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (geheugendump gemaakt)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (genegeerd)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: recept voor doel '%s' is mislukt" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Fout %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Fout 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Wachten op onvoltooide taken..." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Levend dochterproces %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (ginds)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Beëindigen van verliezend dochterproces %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Beëindigen van winnend dochterproces %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Opschonen van tijdelijk batch-bestand %s\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Opschonen van tijdelijk batch-bestand %s is mislukt (%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Verwijderen van dochterproces %p PID %s%s uit de ketting.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "vrijgeven van taakserver-semafoor: (Fout %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Token vrijgegeven voor dochterproces %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "schrijven naar taakserver" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() kan geen proces starten (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"%d argumenten geteld bij mislukte start\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Opname van dochterproces %p (%s) PID %s%s in de ketting.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "wachten op semafoor of dochterproces: (Fout %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Token verkregen voor dochterproces %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "lezen van taken-pijp" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: doel '%s' bestaat niet" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: bijwerken van doel '%s' vanwege: %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "kan belastingsgrenzen niet afdwingen op dit besturingssysteem" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "kan belastingsgrens niet afdwingen: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"geen bestandshandvatten meer beschikbaar: kan standaardinvoer niet " +"dupliceren\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"geen bestandshandvatten meer beschikbaar: kan standaarduitvoer niet " +"dupliceren\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" +"geen bestandshandvatten meer beschikbaar: kan standaardfoutuitvoer niet " +"dupliceren\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Kan standaardinvoer niet herstellen\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Kan standaarduitvoer niet herstellen\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Kan standaardfoutuitvoer niet herstellen\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"'make' heeft dochterproces met PID %s verwerkt, maar wacht nog op PID %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Opdracht niet gevonden" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Shell-programma niet gevonden" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: mogelijk geen omgevingsruimte meer beschikbaar" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL is gewijzigd (was '%s', is nu '%s')\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Maken van tijdelijk batch-bestand %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Inhoud van batch-bestand:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Inhoud van batch-bestand:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (regel %d) Onjuiste shell-context (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" +"Optie '-O[TYPE]' (--output-sync[=TYPE]) is niet meegecompileerd in dit " +"programma." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Openen van globale symbolentabel is mislukt: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Geladen object %s is niet gedeclareerd als GPL-compatibel" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Laden van symbool %s uit %s is mislukt: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Lege symboolnaam om te laden: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Laden van symbool %s uit %s\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "De 'load'-operatie wordt op dit platform niet ondersteund." + +#: main.c:313 +msgid "Options:\n" +msgstr "Opties:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m (genegeerd, maar herkend wegens " +"compatibiliteit)\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make onvoorwaardelijk alle doelen maken\n" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C MAP, --directory=MAP naar deze map gaan alvorens iets te doen\n" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d veel informatie weergeven voor het debuggen\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=VLAGGEN] verschillende soorten debuginformatie " +"weergeven\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides omgevingsvariabelen gaan boven Makefiles\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=TEKST deze TEKST als Makefile-statement evalueren\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help deze hulptekst tonen en stoppen\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors alle fouten in recepten negeren\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going doorgaan als een doel niet gemaakt kan " +"worden\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +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" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base interne gegevensbank van 'make' weergeven\n" + +#: main.c:360 +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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules ingebouwde impliciete regels uitzetten\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables ingebouwde instellingen van variabelen " +"uitzetten\n" +"\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet recepten niet weergeven\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr " -S, --no-keep-going, --stop optie '-k' uitzetten\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch doelen aanraken in plaats van opnieuw maken\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace tracing-informatie weergeven\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version programmaversie tonen en stoppen\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory de huidige map weergeven\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "lege tekenreeks is ongeldig als bestandsnaam" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "onbekende aanduiding '%s' voor debug-niveau" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "onbekend uitvoersynchronisatie-type: '%s'" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Onderbreking/uitzondering gekregen (code = 0x%lx, adres = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Toegangsrechtenovertreding: schrijfopdracht op adres 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Toegangsrechtenovertreding: leesopdracht op adres 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() stelt default_shell = %s in\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"find_and_set_shell() stelt na doorzoeken van pad default_shell = %s in\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s slaapt gedurende 30 seconden..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "klaar met 30 seconden slapen. Make gaat verder.\n" + +#: main.c:1527 +#, 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)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Taakservercliënt (semafoor %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "*interne fout*: ongeldige tekenreeks '%s' voor '--jobserver-fds'" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Taakservercliënt (bestandsdescriptor %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"Waarschuwing: '-jN' is afgedwongen in een deelproces: taakserver-modus " +"uitgezet." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "dubbele taakserver" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"Waarschuwing: taakserver is onbeschikbaar: '-j1' wordt gebruikt. Voeg '+' " +"toe aan de ouderregel." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile op standaardinvoer is dubbel opgegeven." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (tijdelijk bestand)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (tijdelijk bestand)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Parallelle taken (-j) worden op dit platform niet ondersteund." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Opnieuw instellen op enkele-taakmodus (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Taakserver-plaatsen zijn beperkt tot %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "aanmaken van taakserver-semafoor: (Fout %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "aanmaken van taken-pijp" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "initialiseren van taakserver-pijp" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "" +"Symbolische koppelingen worden niet ondersteund: '-L' wordt uitgeschakeld." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Bijwerken van Makefiles...\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Makefile '%s' bevat mogelijk een lus; wordt niet opnieuw gemaakt.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Opnieuw maken van Makefile '%s' is mislukt." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Ingesloten Makefile '%s' is niet gevonden." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefile '%s' is niet gevonden." + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Kan niet terugkeren naar oorspronkelijke map." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Opnieuw uitvoeren[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "verwijderen (van tijdelijk bestand): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL bevat meer dan één doel" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Geen doelen opgegeven en geen Makefile gevonden" + +#: main.c:2511 +msgid "No targets" +msgstr "Geen doelen" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Bijwerken van doelen...\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"Waarschuwing: Klokafwijking geconstateerd. Het maken is mogelijk " +"onvolledig gebeurd." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Gebruik: %s [OPTIES] [DOEL]...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Dit programma is gecompileerd voor %s.\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Dit programma is gecompileerd voor %s (%s).\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Rapporteer programmafouten aan ,\n" +"meld gebreken in de vertaling aan .\n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "de optie '%s%sc' vereist een niet-lege tekenreeks als argument" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "de optie '-%c' vereist een positief geheel getal als argument" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sDit programma is gecompileerd voor %s.\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sDit programma is gecompileerd voor %s (%s).\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make-gegevensbank, weergegeven op %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Make-gegevensbank voltooid op %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Onbekende fout %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: gebruiker %lu (echt %lu), groep %lu (echt %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Toegang geïnitialiseerd" + +#: misc.c:622 +msgid "User access" +msgstr "Gebruikerstoegang" + +#: misc.c:670 +msgid "Make access" +msgstr "Make-toegang" + +#: misc.c:704 +msgid "Child access" +msgstr "Dochterprocestoegang" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Een onbekende map wordt binnengegaan\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Een onbekende map wordt verlaten\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Map '%s' wordt binnengegaan\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Map '%s' wordt verlaten\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Een onbekende map wordt binnengegaan\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Een onbekende map wordt verlaten\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Map '%s' wordt binnengegaan\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Map '%s' wordt verlaten\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "schrijffout: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Gestopt.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Lezen van Makefiles...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Lezen van Makefile '%s'" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (geen standaarddoel)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (zoekpad)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (maakt niet uit)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (geen expansie van ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "UTF-8 BOM in Makefile '%s' wordt overgeslagen\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "UTF-8 BOM in Makefile-buffer wordt overgeslagen\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "ongeldige syntaxis in voorwaardelijk deel" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: laden is mislukt" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "recept begint voor eerste doel" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "ontbrekende regel vóór recept" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (bedoelde u TAB in plaats van 8 spaties?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "ontbrekend scheidingsteken%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "ontbrekend doelpatroon" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "meerdere doelpatronen" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "doelpatroon bevat geen '%%'" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "ontbrekende 'endif'" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "lege naam van variabele" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "extra tekst na 'define'-opdracht" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "ontbrekende 'endef', onafgemaakte 'define'" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "extra tekst na 'endef'-opdracht" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "extra tekst na '%s'-opdracht" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "extra '%s'" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "slechts één 'else' per voorwaardelijk deel" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Onjuiste doelspecifieke variabele-definitie" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "vereisten kunnen niet in recepten gedefinieerd worden" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "gemengde impliciete en statische patroonregels" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "gemengde impliciete en normale regels" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "doel '%s' komt niet overeen met doelpatroon" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "doelbestand '%s' heeft zowel ':'- als '::'-items" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "doel '%s' is meerdere keren gegeven in dezelfde regel" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "Waarschuwing: er wordt voorbijgegaan aan recept voor doel '%s'" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "Waarschuwing: oud recept voor doel '%s' wordt genegeerd" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "gemengde impliciete en normale regels" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "Waarschuwing: NUL-teken gezien; de rest van de regel wordt genegeerd" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Er hoeft niets gedaan te worden voor '%s'." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "'%s' is up-to-date." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Snoeien van bestand '%s'.\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sEr is geen regel om doel '%s' te maken, nodig voor '%s'%s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sEr is geen regel om doel '%s' te maken%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Doelbestand '%s' wordt overwogen.\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Bijwerken van bestand '%s' is recent geprobeerd en mislukt.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Bestand '%s' was al overwogen.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Bestand '%s' wordt nog bijgewerkt.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Bijwerken van bestand '%s' is voltooid.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Bestand '%s' bestaat niet.\n" + +#: remake.c:495 +#, 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" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Impliciete regel voor '%s' gevonden.\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Geen impliciete regel voor '%s' gevonden.\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Standaardrecept wordt gebruikt voor '%s'.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Circulaire afhankelijkheid %s <- %s is verworpen." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Vereisten van doelbestand '%s' zijn voltooid.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "De vereisten van '%s' worden nu gemaakt.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Pogingen voor doelbestand '%s' worden gestaakt.\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Doel '%s' is niet opnieuw gemaakt vanwege fouten." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Vereiste '%s' is alleen-ordenen voor doel '%s'.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Vereiste '%s' van doel '%s' bestaat niet.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Vereiste '%s' is nieuwer dan doel '%s'.\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Vereiste '%s' is ouder dan doel '%s'.\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Doel '%s' is dubbeldubbelpunts en heeft geen vereisten.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "Er is geen recept voor '%s', en geen van de vereisten is veranderd.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Maken van '%s' vanwege 'always-make'-vlag.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Doel '%s' hoeft niet opnieuw gemaakt te worden" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; VPATH-naam '%s' wordt gebruikt" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Doel '%s' moet opnieuw gemaakt worden.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " VPATH-naam '%s' wordt genegeerd.\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Recept van '%s' wordt nu uitgevoerd.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Opnieuw maken van doelbestand '%s' is mislukt.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Doelbestand '%s' is met succes opnieuw gemaakt.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Doelbestand '%s' moet opnieuw worden gemaakt onder '-q'.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Standaardopdrachten worden gebruikt voor '%s'.\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Waarschuwing: bestand '%s' heeft een wijzigingstijd in de toekomst" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "" +"Waarschuwing: bestand '%s' heeft een wijzigingstijd %s seconden in de " +"toekomst" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS-element '%s' is geen patroon" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs kan niet exporteren: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Impliciete regels" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Geen impliciete regels." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u impliciete regels, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminal." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "PROGRAMMAFOUT: num_pattern_rules() is verkeerd! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "onbekend signaal" + +# Vroeger ging dit over het afsluiten van een modemverbinding, +# tegenwoordig over het afsluiten van een pseudoterminal. +#: signame.c:92 +msgid "Hangup" +msgstr "Opgehangen" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Onderbroken" + +# Verleden tijd, "Afgesloten", net als de andere actiesignaalnamen. +#: signame.c:98 +msgid "Quit" +msgstr "Afgesloten" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Ongeldige instructie" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Traceer/breekpunt-instructie" + +#: signame.c:109 +msgid "Aborted" +msgstr "Afgebroken" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT-instructie" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT-instructie" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Drijvendekomma-berekeningsfout" + +#: signame.c:121 +msgid "Killed" +msgstr "Geëlimineerd" + +#: signame.c:124 +msgid "Bus error" +msgstr "Busfout" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Segmentatiefout" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Onjuiste systeemaanroep" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Gebroken pijp" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Wekker" + +#: signame.c:139 +msgid "Terminated" +msgstr "Beëindigd" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Gebruikergedefinieerd signaal 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Gebruikergedefinieerd signaal 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Dochterproces is afgesloten" + +#: signame.c:156 +msgid "Power failure" +msgstr "Stroomstoring" + +#: signame.c:159 +msgid "Stopped" +msgstr "Gepauzeerd" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Gepauzeerd (terminalinvoer)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Gepauzeerd (terminaluitvoer)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Gepauzeerd (signaal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Limiet op processortijd is overschreden" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Limiet op bestandsgrootte is overschreden" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtuele timer is afgelopen" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Timer voor profilering is afgelopen" + +#: signame.c:186 +msgid "Window changed" +msgstr "Venster is veranderd" + +#: signame.c:189 +msgid "Continued" +msgstr "Doorgegaan" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Urgente in-/uitvoertoestand" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "In-/uitvoer is mogelijk" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Hulpbron verloren" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Gevaarsignaal" + +#: signame.c:217 +msgid "Information request" +msgstr "Verzoek om informatie" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Drijvendekomma-coprocessor is niet beschikbaar" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Geen 'strcache'-buffers\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s huidig buffer: grootte = %hu B / gebruikt = %hu B / aantal = %hu / " +"gemiddeld = %hu B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" +"%s andere gebruikte: totaal = %lu B / aantal = %lu / gemiddeld = %lu B\n" + +#: strcache.c:283 +#, 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" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s 'strcache'-prestatie: lookups = %lu / treffersverhouding = %lu%%\n" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# hashtabel-statistieken van bestanden:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automatisch" + +#: variable.c:1602 +msgid "default" +msgstr "standaard" + +#: variable.c:1605 +msgid "environment" +msgstr "omgeving" + +#: variable.c:1608 +msgid "makefile" +msgstr "Makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "omgeving onder -e" + +#: variable.c:1614 +msgid "command line" +msgstr "opdrachtregel" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "'override'-opdracht" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (uit '%s', regel %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# Statistieken van hashtabel van variabelenverzameling:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabelen\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Patroonspecifieke variabelewaarden" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Geen patroonspecifieke variabelewaarden" + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u patroonspecifieke variabelewaarden" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "Waarschuwing: ongedefinieerde variabele '%.*s'" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() is mislukt met afsluitwaarde %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Waarschuwing: lege omleiding\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "*interne fout*: '%s' command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-waarschuwing: mogelijk dient u CTRL-Y-afhandeling opnieuw aan te zetten " +"vanuit DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "INGEBOUWD [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "INGEBOUWDE CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "INGEBOUWDE CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Onbekende ingebouwde opdracht '%s'\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Fout: lege opdracht\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Invoer wordt omgeleid van %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Foutuitvoer wordt omgeleid naar %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Uitvoer wordt toegevoegd aan %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Uitvoer wordt omgeleid naar %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Toevoegen van %.*s en opschoning\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "In plaats daarvan wordt %s uitgevoerd\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Fout bij proces-start, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-zoekpaden\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Geen 'vpath'-zoekpaden." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u 'vpath'-zoekpaden.\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Geen algemeen zoekpad ('VPATH'-variabele)." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Algemeen zoekpad ('VPATH'-variabele):\n" +"# " + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "*interne fout*: meerdere opties '--sync-mutex'" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "*interne fout*: meerdere opties '--jobserver-fds'" + +#~ msgid "virtual memory exhausted" +#~ msgstr "onvoldoende geheugen beschikbaar" + +#~ msgid "write error" +#~ msgstr "schrijffout" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "INGEBOUWDE RM %s\n" + +#~ msgid "# Invalid value in 'update_status' member!" +#~ msgstr "# Ongeldige waarde in 'update_status'-onderdeel!" + +#~ 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 "" +#~ "\n" +#~ "# strcache hash-table stats:\n" +#~ "# " +#~ msgstr "" +#~ "\n" +#~ "# strcache-hashtabel-statistieken:\n" +#~ "# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() kan geen proces starten (e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sDit is vrije programmatuur; zie de brontekst voor de " +#~ "kopieervoorwaarden.\n" +#~ "%sEr is GEEN garantie; zelfs niet voor VERHANDELBAARHEID of\n" +#~ "%sGESCHIKTHEID VOOR EEN BEPAALD DOEL.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "extra 'endef'" + +#~ 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/po/pl.gmo b/po/pl.gmo new file mode 100644 index 0000000..f7eb848 Binary files /dev/null and b/po/pl.gmo differ diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..5476e85 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,2259 @@ +# Polish translation for GNU make. +# Copyright (C) 1996, 2002, 2005, 2006, 2010, 2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# PaweÅ‚ Krawczyk , 1996. +# Jakub Bogusz , 2002-2013. +# +msgid "" +msgstr "" +"Project-Id-Version: make 4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-10-13 10:48+0200\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" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "próba użycia nieistniejÄ…cej funkcji: '%s'" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "element biblioteki `touch' jest niedostÄ™pny pod VMS" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Archiwum '%s' nie istnieje" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: '%s' nie jest poprawnym archiwum" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Brak elementu '%s' w '%s'" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: BÅ‚Ä™dny kod powrotu z ar_member_touch w '%s'" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"Uzyskanie informacji o module przez lnr$set_module() nie udaÅ‚o siÄ™, status = " +"%d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() nie powiodÅ‚o siÄ™, status = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "bÅ‚Ä…d otwarcia biblioteki '%s' podczas szukania elementu '%s'" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Element '%s'%s: %ld bajtów pod %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (nazwa może zostać okrojona)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Data %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Polecenia majÄ… za dużo linii (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Przerwano.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Element archiwum '%s' może być faÅ‚szywy; nie usuniÄ™ty" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Element archiwum '%s' może być faÅ‚szywy; nie usuniÄ™ty" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] KasujÄ™ plik '%s'" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** KasujÄ™ plik '%s'" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# polecenia do wykonania" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (wbudowane):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (z '%s', linia %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Katalogi\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: stat() zwraca bÅ‚Ä…d.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (klucz %s, czas modyfikacji %d): otwarcie byÅ‚o niemożliwe.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (urzÄ…dzenie %d, i-wÄ™zeÅ‚ [%d,%d,%d]): otwarcie byÅ‚o niemożliwe.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (urzÄ…dzenie %ld, i-wÄ™zeÅ‚ %ld): otwarcie byÅ‚o niemożliwe.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (klucz %s, czas modyfikacji %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (urzÄ…dzenie %d, i-wÄ™zeÅ‚ [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (urzÄ…dzenie %ld, i-wÄ™zeÅ‚ %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Nie" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " pliki, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "nie" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " niemożliwoÅ›ci" + +#: dir.c:1068 +msgid " so far." +msgstr " jak dotÄ…d." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " niemożliwoÅ›ci w %lu katalogach.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Rekurencyjna zmienna '%s' wskazuje na samÄ… siebie" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "niezakoÅ„czone odwoÅ‚anie do zmiennej" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Polecenia dla pliku '%s' podano w %s:%lu," + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" +"Polecenia dla pliku '%s' zostaÅ‚y wyznaczone na podstawie reguÅ‚ standardowych," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "ale '%s' jest teraz uznawany za ten sam plik co '%s'." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "Polecenia dla '%s' zostanÄ… zignorowane na rzecz poleceÅ„ dla '%s'." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" +"nie można przemianować '%s' z pojedynczym dwukropkiem na '%s' z podwójnym" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" +"nie można przemianować '%s' z podwójnym dwukropkiem na '%s' z pojedynczym" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Kasowanie pliku poÅ›redniego '%s'" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Kasowanie plików poÅ›rednich...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Aktualny czas" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Oznaczenie czasu spoza zakresu; zastÄ…piono %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# To nie jest obiekt:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Cenny plik (zależność .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Obiekt niejawny (zależność .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Obiekt podany w linii poleceÅ„." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Makefile domyÅ›lny, wymieniony w MAKEFILES lub -include/sinclude." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# ReguÅ‚a wbudowana" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Szukanie reguÅ‚ domyÅ›lnych zostaÅ‚o wykonane." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Szukanie reguÅ‚ domyÅ›lnych nie zostaÅ‚o wykonane." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Gałąź wzorców domyÅ›lnych/statycznych: '%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Plik jest zależnoÅ›ciÄ… przejÅ›ciowÄ…." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Robi również:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Czas modyfikacji nie byÅ‚ sprawdzany." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Plik nie istnieje." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Plik jest bardzo stary." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Ostatnio modyfikowany %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Plik zostaÅ‚ uaktualniony." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Plik nie zostaÅ‚ uaktualniony." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Aktualnie uruchamiane polecenia (TO JEST BÅÄ„D)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Aktualnie uruchamiane polecenia zależnoÅ›ci (TO JEST BÅÄ„D)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Uaktualnienie powiodÅ‚o siÄ™." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Powinien być uaktualniony (-q jest wÅ‚Ä…czone)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Uaktualnianie nie powiodÅ‚o siÄ™." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# BÅ‚Ä™dna wartość w elemencie 'command_state'!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Pliki" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statystyki tablic haszujÄ…cych plików:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Pole '%s' nie zapamiÄ™tane w pamiÄ™ci podrÄ™cznej: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "pierwszy argument funkcji 'word' nie jest liczbowy" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "pierwszy argument funkcji 'word' musi być wiÄ™kszy od 0" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "pierwszy argument funkcji 'wordlist' nie jest liczbowy" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "drugi argument funkcji 'wordlist' nie jest liczbowy" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) nie powiodÅ‚o siÄ™ (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(Err) nie powiodÅ‚o siÄ™ (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() nie powiodÅ‚o siÄ™ (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() nie powiodÅ‚o siÄ™\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "CzyszczÄ™ tymczasowy plik wsadowy %s\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "otwarcie: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "zapis: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "BÅ‚Ä™dna operacja na pliku: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "niewystarczajÄ…ca liczba argumentów (%d) dla funkcji '%s'" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "funkcja '%s' nie jest zaimplementowana na tej platformie" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "nie dokoÅ„czone wywoÅ‚anie funkcji '%s': brak '%c'" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "Pusta nazwa funkcji\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "BÅ‚Ä™dna nazwa funkcji: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Zbyt dÅ‚uga nazwa funkcji: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "BÅ‚Ä™dna minimalna liczba argumentów (%d) dla funkcji %s\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "BÅ‚Ä™dna maksymalna liczba argumentów (%d) dla funkcji %s\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: opcja '%s' jest niejednoznaczna\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: opcja '--%s' nie przyjmuje argumentów\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: opcja '%c%s' nie może mieć argumentów\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: opcja '%s' musi mieć argument\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: nieznana opcja '--%s'\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: nieznana opcja '%c%s'\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: niedozwolona opcja -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: bÅ‚Ä™dna opcja -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opcja musi mieć argument -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: opcja '-W %s' jest niejednoznaczna\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: opcja '-W %s' nie może mieć argumentów\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Rozwijanie '%s'\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Wyliczanie '%s'\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"nie można przydzielić %lu bajtów na tablicÄ™ haszujÄ…cÄ…: pamięć wyczerpana" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "WypeÅ‚nienie=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Przehaszowania=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Kolizje=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Szukanie standardowej reguÅ‚y dla '%s'.\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Szukanie standardowej reguÅ‚y typu archive-member dla '%s'.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Pomijanie rekurencyjnego wywoÅ‚ania reguÅ‚y standardowej.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Gałąź zbyt dÅ‚uga: '%.*s'.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Próbowanie reguÅ‚y wzorcowej z gaÅ‚Ä™ziÄ… '%.*s'.\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Odrzucenie niemożliwej zależnoÅ›ci reguÅ‚y '%s'.\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Odrzucenie niemożliwej zależnoÅ›ci domyÅ›lnej '%s'.\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Próbowanie zależnoÅ›ci reguÅ‚y '%s'.\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Próbowanie zależnoÅ›ci domyÅ›lnej '%s'.\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Znaleziono zależność '%s' jako VPATH '%s'\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Szukanie reguÅ‚y zawierajÄ…cej plik przejÅ›ciowy '%s'.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Nie można utworzyć pliku tymczasowego\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (zrzut pamiÄ™ci)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (zignorowano)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: polecenia dla obiektu '%s' nie powiodÅ‚y siÄ™" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] BÅ‚Ä…d %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] BÅ‚Ä…d 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s]: %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Oczekiwanie na niezakoÅ„czone zadania...." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Å»yjÄ…cy potomek %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (zdalne)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Zbieranie przegrywajÄ…cego potomka %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Zbieranie wygrywajÄ…cego potomka %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Czyszczenie tymczasowego pliku wsadowego %s\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Czyszczenie tymczasowego pliku wsadowego %s nie powiodÅ‚o siÄ™ (%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Usuwanie potomka %p PID %s%s z kolejki.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "zwalnianie semafora serwera zadaÅ„: (BÅ‚Ä…d %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Zwolniony token dla potomka %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "piszÄ…cy serwer zadaÅ„" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() nie mógÅ‚ uruchomić procesu (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Naliczono %d parametrów nieudanego uruchomienia\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Wstawianie potomka %p (%s) PID %s%s do kolejki.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "oczekiwanie na semafor lub proces potomny: (BÅ‚Ä…d %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Otrzymano token dla potomka %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "strumieÅ„ czytajÄ…cy zadania" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: obiekt '%s' nie istnieje" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: uaktualnianie obiektu '%s' z powodu: %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "niemożliwe wymuszenie limitów obciążenia w tym systemie" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "niemożliwe wymuszenie limitu obciążenia: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "nie ma wiÄ™cej uchwytów plików: nie można powielić stdin\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "nie ma wiÄ™cej uchwytów plików: nie można powielić stdout\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "nie ma wiÄ™cej uchwytów plików: nie można powielić stderr\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Nie można odtworzyć stdin\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Nie można odtworzyć stdout\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Nie można odtworzyć stderr\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make usunÄ…Å‚ potomka pid %s, nadal czeka na pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Polecenie nie znalezione" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Nie znaleziono programu powÅ‚oki" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: mogÅ‚o zabraknąć miejsca na Å›rodowisko" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL siÄ™ zmieniÅ‚ (byÅ‚ '%s', jest '%s')\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Tworzenie tymczasowego pliku wsadowego %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Zawartość pliku wsadowego:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Zawartość pliku wsadowego:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (linia %d) ZÅ‚y kontekst powÅ‚oki (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" +"-O[TYP] (--output-sync[=TYP]) nie zostaÅ‚o skonfigurowane przy tym budowaniu." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Nie udaÅ‚o siÄ™ otworzyć tablicy symboli globalnych: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Wczytany obiekt %s nie jest zadeklarowany jako kompatybilny z GPL" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Nie udaÅ‚o siÄ™ wczytać symbolu %s z %s: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Pusta nazwa symbolu do wczytania: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Wczytywanie symbolu %s z %s\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "Operacja 'load' nie jest obsÅ‚ugiwana na tej platformie" + +#: main.c:313 +msgid "Options:\n" +msgstr "Opcje:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorowane dla kompatybilnoÅ›ci.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Bezwarunkowe utworzenie wszystkich obiektów.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d WyÅ›wietla dużo informacji diagnostycznych.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGI] WyÅ›wietla różne rodzaje informacji\n" +" diagnostycznych.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Zmienne Å›rodowiska przykrywajÄ… makefile.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=ÅAŃCUCH Wyznacza ÅAŃCUCH jako instrukcjÄ™ pliku " +"makefile.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr "" +" -h, --help WyÅ›wietla ten komunikat i koÅ„czy dziaÅ‚anie.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignoruje bÅ‚Ä™dy poleceÅ„.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Kontynuuj jeÅ›li nie da siÄ™ zrobić jakichÅ›\n" +" obiektów.\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +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" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base WyÅ›wietla wewnÄ™trznÄ… bazÄ™ danych make.\n" + +#: main.c:360 +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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules WyÅ‚Ä…cza wbudowane reguÅ‚y standardowe.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables WyÅ‚Ä…cza ustawianie wbudowanych zmiennych.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Nie wypisuje poleceÅ„.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" WyÅ‚Ä…cza -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " -t, --touch Uaktualnia obiekty zamiast je robić.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace Wypisywanie informacji ze Å›ledzenia.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version WyÅ›wietla wersjÄ™ make i koÅ„czy dziaÅ‚anie.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory WyÅ›wietla aktualny katalog.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "pusty Å‚aÅ„cuch nie może być nazwÄ… pliku" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "nieznany poziom diagnostyki '%s'" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "nieznany sposób synchronizacji wyjÅ›cia '%s'" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: zÅ‚apano przerwanie/wyjÄ…tek (kod = 0x%lx, adres = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Naruszenie praw dostÄ™pu: zapis pod adresem 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Naruszenie praw dostÄ™pu: odczyt spod adresu 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() ustawia default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell() ustawia Å›cieżkÄ™ wyszukiwania default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s jest zawieszony na 30 sekund..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "zakoÅ„czono sleep(30). Kontynuacja.\n" + +#: main.c:1527 +#, 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)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Klient serwera zadaÅ„ (semafor %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "bÅ‚Ä…d wewnÄ™trzny: bÅ‚Ä™dny Å‚aÅ„cuch --jobserver-fds '%s'" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Klient serwera zadaÅ„ (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "uwaga: -jN wymuszone w podzadaniu: wyÅ‚Ä…czanie trybu serwera zadaÅ„." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "duplikacja serwera zadaÅ„" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"uwaga: serwer zadaÅ„ niedostÄ™pny: użycie -j1. Należy dodać `+' do nadrzÄ™dnej " +"reguÅ‚y make." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile ze standardowego wejÅ›cia podano dwukrotnie." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (plik tymczasowy)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (plik tymczasowy)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "RównolegÅ‚e zadania (-j) nie sÄ… obsÅ‚ugiwane na tej platformie" + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "PrzeÅ‚Ä…czanie w tryb jednozadaniowy (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Pojemność serwera zadaÅ„ ograniczona do %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "tworzenie semafora serwera zadaÅ„: (BÅ‚Ä…d %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "tworzenie potoku zadaÅ„" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "inicjowanie potoku serwera zadaÅ„" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "DowiÄ…zania symboliczne nie sÄ… obsÅ‚ugiwane: wyÅ‚Ä…czono -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Uaktualnianie plików makefile....\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Plik makefile '%s' może siÄ™ zapÄ™tlić; bez ponownego przetwarzania.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Nie udaÅ‚o siÄ™ ponownie przetworzyć pliku makefile '%s'." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Nie znaleziono wÅ‚Ä…czanego pliku makefile '%s'." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Nie znaleziono pliku makefile '%s'" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Niemożliwy powrót do katalogu startowego." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Ponowne uruchamianie[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (plik tymczasowy): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL zawiera wiÄ™cej niż jeden cel" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Nie podano obiektów i nie znaleziono makefile" + +#: main.c:2511 +msgid "No targets" +msgstr "Brak obiektów" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Uaktualnianie obiektów docelowych....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "uwaga: Wykryto przestawienie zegara. Budowanie może być niekompletne." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "SkÅ‚adnia: %s [opcje] [obiekt] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Ten program zostaÅ‚ zbudowany dla %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Ten program zostaÅ‚ zbudowany dla %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "BÅ‚Ä™dy proszÄ™ zgÅ‚aszać na adres \n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "opcja '%s%s' wymaga niepustego Å‚aÅ„cucha jako argumentu" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "opcja '-%c' wymaga argumentu bÄ™dÄ…cego liczbÄ… caÅ‚kowitÄ… dodatniÄ…" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sTen program zostaÅ‚ zbudowany dla systemu %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sTen program zostaÅ‚ zbudowany dla systemu %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Baza danych Make, wyÅ›wietlana na %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# ZakoÅ„czono tworzenie bazy danych Make na %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Nieznany bÅ‚Ä…d %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: użytkownik %lu (rzeczywisty %lu), grupa %lu (rzeczywista %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Zainicjalizowany dostÄ™p" + +#: misc.c:622 +msgid "User access" +msgstr "DostÄ™p użytkownika" + +#: misc.c:670 +msgid "Make access" +msgstr "DostÄ™p make" + +#: misc.c:704 +msgid "Child access" +msgstr "DostÄ™p potomka" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: WejÅ›cie do nieznanego katalogu\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Opuszczenie nieznanego katalogu\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: WejÅ›cie do katalogu '%s'\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Opuszczenie katalogu '%s'\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: WejÅ›cie do nieznanego katalogu\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Opuszczenie nieznanego katalogu\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: WejÅ›cie do katalogu '%s'\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Opuszczenie katalogu '%s'\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "bÅ‚Ä…d zapisu: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Stop.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Czytanie makefile...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Czytanie pliku makefile '%s'" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (brak celu domyÅ›lnego)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (przeszukiwana Å›cieżka)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (nieważne)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (brak rozszerzenia ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "PominiÄ™to BOM UTF-8 w pliku makefile '%s'\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "PominiÄ™to BOM UTF-8 w buforze pliku makefile\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "bÅ‚Ä™dna skÅ‚adnia wyrażenia warunkowego" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: nie udaÅ‚o siÄ™ zaÅ‚adować" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "polecenia zaczynajÄ… siÄ™ przed pierwszym obiektem" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "brakuje reguÅ‚y przed poleceniami" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (czyżby miaÅ‚ być TAB zamiast 8 spacji?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "brakujÄ…cy separator%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "brakujÄ…cy wzorzec obiektu" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "wielokrotne wzorce obiektu" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "wzorzec obiektu nie zawiera '%%'" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "brakujÄ…cy 'endif'" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "pusta nazwa zmiennej" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "nadmiarowy tekst po dyrektywie 'define'" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "brakujÄ…cy 'endef', niezakoÅ„czone 'define'" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "nadmiarowy tekst po dyrektywie 'endef'" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "niezwiÄ…zany tekst po dyrektywie '%s'" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "nadmiarowy '%s'" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "tylko jedno 'else' w wyrażeniu warunkowym" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Źle sformuÅ‚owana definicja zmiennej dla celu" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "wymagania nie mogÄ… być definiowane w opisach poleceÅ„" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "pomieszane standardowe i statyczne reguÅ‚y wzorców" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "pomieszane standardowe i normalne reguÅ‚y" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "obiekt '%s' nie pasuje do wzorca obiektu" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "plik obiektu '%s' ma pozycje i : i ::" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "obiekt '%s' podany wielokrotnie w tej samej regule" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "uwaga: polecenia zakrywajÄ…ce dla obiektu '%s'" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "uwaga: ignorujÄ™ stare polecenia dla obiektu '%s'" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "pomieszane standardowe i normalne reguÅ‚y" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "uwaga: napotkaÅ‚em na znak NUL; reszta linii zignorowana" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Nie ma nic do zrobienia w '%s'." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "'%s' jest aktualne." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Czyszczenie pliku '%s'.\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sBrak reguÅ‚ do zrobienia obiektu '%s', wymaganego przez '%s'%s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sBrak reguÅ‚ do wykonania obiektu '%s'%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Przetwarzanie pliku obiektowego '%s'.\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Już bez powodzenia próbowaÅ‚em uaktualnić plik '%s'.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Plik '%s' byÅ‚ już przetwarzany.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Wciąż uaktualniam plik '%s'.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "SkoÅ„czyÅ‚em uaktualniać plik '%s'.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Plik '%s' nie istnieje.\n" + +#: remake.c:495 +#, 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" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Znaleziono standardowÄ… reguÅ‚Ä™ dla '%s'.\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Brak standardowych reguÅ‚ dla '%s'.\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Stosowanie standardowych poleceÅ„ dla '%s'.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Okrężna dyrektywa %s <- %s porzucona." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "ZakoÅ„czono zależnoÅ›ci pliku obiektu '%s'.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "ZależnoÅ›ci '%s' sÄ… wykonywane.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Zaniechany plik obiektowy '%s'.\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Obiekt '%s' nie zostaÅ‚ ponownie wykonany z powodu bÅ‚Ä™dów." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Zależność '%s' dotyczy tylko kolejnoÅ›ci dla obiektu '%s'.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Zależność '%s' obiektu '%s' nie istnieje.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Zależność '%s' jest nowsza od obiektu '%s'.\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Zależność '%s' jest starsza od obiektu '%s'.\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "" +"Obiekt '%s' jest z podwójnym dwukropkiem i nie ma żadnych zależnoÅ›ci.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "Brak poleceÅ„ dla '%s' i brak zmienionych zależnoÅ›ci.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Tworzenie '%s' z powodu flagi always-make.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Nie ma potrzeby ponownego robienia obiektu '%s'" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; użyto nazwy VPATH '%s'" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Konieczne ponowne wykonanie obiektu '%s'.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Zignorowano nazwÄ™ VPATH '%s'.\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Uruchomiono polecenia dla '%s'.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Ponowne tworzenie pliku obiektu '%s' nie powiodÅ‚o siÄ™.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Ponowne tworzenie pliku obiektu '%s' powiodÅ‚o siÄ™.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Plik obiektu '%s' powinien być ponownie tworzony z opcjÄ… -q.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Stosowanie standardowych poleceÅ„ dla '%s'.\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Uwaga: Plik '%s' ma czas modyfikacji z przyszÅ‚oÅ›ci" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Uwaga: Plik '%s' ma czas modyfikacji %s s w przyszÅ‚oÅ›ci" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "Element .LIBPATTERNS '%s' nie jest wzorcem" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Zasady nie eksportowane: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# ReguÅ‚y stadardowe" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Brak standardowych reguÅ‚." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u standardowych reguÅ‚, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminal." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BÅÄ„D: zÅ‚e num_pattern_rules! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "nieznany sygnaÅ‚" + +#: signame.c:92 +msgid "Hangup" +msgstr "RozÅ‚Ä…czenie" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Przerwanie" + +#: signame.c:98 +msgid "Quit" +msgstr "WyjÅ›cie" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "BÅ‚Ä™dna instrukcja" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "PuÅ‚apka Å›ledzenia" + +#: signame.c:109 +msgid "Aborted" +msgstr "Przerwany" + +#: signame.c:112 +msgid "IOT trap" +msgstr "PuÅ‚apka IOT" + +#: signame.c:115 +msgid "EMT trap" +msgstr "PuÅ‚apka EMT" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "WyjÄ…tek zmiennoprzecinkowy" + +#: signame.c:121 +msgid "Killed" +msgstr "Zabity" + +#: signame.c:124 +msgid "Bus error" +msgstr "BÅ‚Ä…d szyny" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Naruszenie ochrony pamiÄ™ci" + +#: signame.c:130 +msgid "Bad system call" +msgstr "BÅ‚Ä™dne wywoÅ‚anie systemowe" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Przerwany potok" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Budzik" + +#: signame.c:139 +msgid "Terminated" +msgstr "ZakoÅ„czony" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "SygnaÅ‚ użytkownika 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "SygnaÅ‚ użytkownika 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Potomek powróciÅ‚" + +#: signame.c:156 +msgid "Power failure" +msgstr "Przerwa w zasilaniu" + +#: signame.c:159 +msgid "Stopped" +msgstr "Zatrzymany" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Zatrzymany (wejÅ›cie z tty)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Zatrzymany (wyjÅ›cie na tty)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Zatrzymany (sygnaÅ‚)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Przekroczony czas CPU" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Przekroczony limit wielkoÅ›ci pliku" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Wyczerpany stoper wirtualny" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Wyczerpany stoper profilujÄ…cy" + +#: signame.c:186 +msgid "Window changed" +msgstr "Zmienione okno" + +#: signame.c:189 +msgid "Continued" +msgstr "Kontynuowany" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "NagÅ‚a sytuacja I/O" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "I/O możliwe" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Zaginione zasoby" + +#: signame.c:214 +msgid "Danger signal" +msgstr "SygnaÅ‚ niebezpieczeÅ„stwa" + +#: signame.c:217 +msgid "Information request" +msgstr "Żądanie informacji" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Koprocesor obliczeÅ„ zmiennoprzecinkowych niedostÄ™pny" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Brak buforów strcache\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s bieżący buf: rozmiar = %hu B / użyty = %hu B / liczba = %hu / Å›r = %hu B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s pozostaÅ‚e użyte: razem = %lu B / liczba = %lu / Å›r = %lu B\n" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" +"%s pozostaÅ‚e wolne: razem = %lu B / maks = %lu B / min = %lu B / Å›r = %hu B\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s wydajność strcache: wyszukiwaÅ„ = %lu / wsp. trafieÅ„ = %lu%%\n" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# statystyki tablic haszujÄ…cych:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automatyczna" + +#: variable.c:1602 +msgid "default" +msgstr "domyÅ›lna" + +#: variable.c:1605 +msgid "environment" +msgstr "Å›rodowiskowa" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "Å›rodowisko pod -e" + +#: variable.c:1614 +msgid "command line" +msgstr "z linii poleceÅ„" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "dyrektywa 'override'" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (z '%s', linia %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# statystyki tablic haszujÄ…cych ustawionych zmiennych:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Zmienne\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# WartoÅ›ci zmiennych dla wzorca" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Brak wartoÅ›ci zmiennych dla wzorca." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u wartoÅ›ci zmiennych dla wzorca" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "uwaga: niezdefiniowana zmienna '%.*s'" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() nie powiodÅ‚o siÄ™ - %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Uwaga: Puste przekierowanie\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "bÅ‚Ä…d wewnÄ™trzny: command_state '%s'" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-uwaga, bÄ™dzie trzeba ponownie umożliwić obsÅ‚ugÄ™ CTRL-Y z DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "WBUDOWANE [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "WBUDOWANE CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "WBUDOWANE CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Nieznane polecenie wbudowane '%s'\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "BÅ‚Ä…d, puste polecenie\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Przekierowane wejÅ›cie z %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Przekierowane wyjÅ›cie diagnostyczne do %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "DoÅ‚Ä…czanie wyjÅ›cia do %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Przekierowane wyjÅ›cie do %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "DoÅ‚Ä…czanie %.*s i czyszczenie\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Zamiast tego wykonywanie %s\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "BÅ‚Ä…d podczas uruchamiania, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Åšcieżki przeszukiwania VPATH\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Brak Å›cieżek przeszukiwania 'vpath'" + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u Å›cieżek przeszukiwania 'vpath'.\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Brak ogólnej (zmienna 'VPATH') Å›cieżki przeszukiwania." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Ogólna (zmienna 'VPATH') Å›cieżka przeszukiwania:\n" +"# " + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "bÅ‚Ä…d wewnÄ™trzny: wiele opcji --sync-mutex" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "bÅ‚Ä…d wewnÄ™trzny: wiele opcji --jobserver-fds" + +#~ msgid "virtual memory exhausted" +#~ msgstr "brak pamiÄ™ci wirtualnej" + +#~ msgid "write error" +#~ msgstr "bÅ‚Ä…d zapisu" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "WBUDOWANE RM %s\n" diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo new file mode 100644 index 0000000..8dc66ef Binary files /dev/null and b/po/pt_BR.gmo differ diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..9013dec --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,2341 @@ +# Mensagem do GNU make em Português (Brasil) +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This file is distributed under the same license as the make package. +# Fábio Henrique F. Silva , 2000. +# Fábio Henrique F. Silva , 2008, 2009, 2010, 2011, 2012, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU make 3.82\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-01-09 23:04-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=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.5.4\n" +"X-Poedit-SourceCharset: iso-8859-1\n" + +# Caso você encontre alguma mensagem que não está bem traduzida, por +# favor me informe dando sua sugestão. +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "característica não suportada: `%s'" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "o touch não está disponível no VMS" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Arquivo `%s' não existe" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: `%s' não é um arquivo válido" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: O membro `%s' não existe em `%s'" + +#: ar.c:164 +#, fuzzy, 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'" + +#: arscan.c:124 +#, 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" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() falhou com estado = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "erro na abertura da biblioteca `%s' para localizar o membro `%s'" + +#: arscan.c:944 +#, fuzzy, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Membro `%s'%s: %ld bytes de %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (o nome pode estar truncado)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Data %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modo = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Quebra.\n" + +#: commands.c:629 +#, fuzzy, 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." + +#: commands.c:633 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "** O arquivo membro `%s' pode ser falso. Não foi apagado." + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "** [%s] Apagando arquivo `%s'" + +#: commands.c:649 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "** Apagando arquivo `%s'" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# comandos a executar" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (embutido):" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (de `%s', linha %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Diretórios\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: não pôde ser estabelecido.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (chave %s, mtime %d): não pôde ser aberto.\n" + +#: dir.c:1009 +#, 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" + +#: dir.c:1014 +#, 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" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (chave %s, mtime %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (dispositivo %d, inode [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (dispositivo %ld, inode %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Não" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " arquivos, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "não" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " impossibilidades" + +#: dir.c:1068 +msgid " so far." +msgstr " até agora." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilidades em %lu diretórios.\n" + +#: expand.c:125 +#, fuzzy, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Variável recursiva `%s' faz referência a ela mesma (eventualmente)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "referência a variável não finalizada" + +#: file.c:271 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Os comandos especificados para o arquivo `%s' em %s:%lu," + +#: file.c:276 +#, fuzzy, 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," + +#: file.c:280 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "mas `%s' é considerado o mesmo arquivo que `%s'." + +#: file.c:283 +#, fuzzy, 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'." + +#: file.c:303 +#, fuzzy, 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'" + +#: file.c:309 +#, fuzzy, 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'" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "** Apagando arquivo intermediário `%s'" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Apagando arquivo intermediário...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Hora atual" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Data/Hora fora de faixa; substituindo %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Não é um alvo:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Arquivo importante (prerequisito de .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Alvo Falso (prerequisito de .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Linha de Comando do Alvo." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Um Padrão, arquivo MAKEFILES ou -include/sinclude makefile." + +#: file.c:968 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# Faltam as regras implícitas." + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Pesquisa por regra implícita concluida." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Pesquisa por regra implícita não concluida." + +#: file.c:973 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Derivação padrão implícita/estática: `%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# O arquivo é um pré-requisito intermediário." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Também faz:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# O Período da modificação nunca foi verificado." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# O Arquivo não existe." + +#: file.c:989 +msgid "# File is very old." +msgstr "# O Arquivo está desatualizado." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Última modificação %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# O Arquivo foi atualizado." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# O Arquivo não foi atualizado." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Comandos em execução (ISTO É UMA FALHA)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Comandos de dependências em execução (ISTO É UMA FALHA)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Atualizado com sucesso." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Precisa ser atualizado (-q está definido)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Problemas com a atualização." + +#: file.c:1025 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# Valor inválido no membro `command_state' !" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Arquivos" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# tabela hash de arquivos:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "primeiro argumento não numérico para a função `word'" + +#: function.c:785 +#, fuzzy +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" + +#: function.c:805 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "primeiro argumento não numérico para a função `wordlist'" + +#: function.c:807 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "segundo argumento não numérico para a função `wordlist'" + +#: function.c:1499 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe(): DuplicateHandle(In) falhou (e=%ld)\n" + +#: function.c:1523 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_open_pipe(): DuplicateHandle(Err) falhou (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() falhou (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() falhou\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Apagando o arquivo de lote temporário %s\n" + +#: function.c:2193 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: function.c:2203 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "Erro de gravação: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "O número de argumentos é insuficiente (%d) para a função `%s' " + +#: function.c:2336 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "A função `%s' não foi implementada nesta plataforma " + +#: function.c:2399 +#, fuzzy, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "Chamada não terminada para a função `%s': faltando `%c'" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "O número de argumentos é insuficiente (%d) para a função `%s' " + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "O número de argumentos é insuficiente (%d) para a função `%s' " + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: a opção `%s' é ambigua\n" + +#: getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: a opção `--%s' não permite um argumento\n" + +#: getopt.c:688 +#, fuzzy, 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" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: a opção `%s' requer um argumento\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: a opção é desconhecida `--%s'\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: a opção é desconhecida `%c%s'\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: a opção é ilegal -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: a opção é inválida -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: a opção requer um argumento -- %c\n" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: a opção `-W %s' é ambigua\n" + +#: getopt.c:862 +#, fuzzy, 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" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, 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" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Carga=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Colisões=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Procurando por uma regra implícita para `%s'.\n" + +#: implicit.c:54 +#, fuzzy, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Procurando por uma regra implícita de arquivo-membro para `%s'.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitando recursão em regra implícita.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, fuzzy, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Tentando padrão para regra com `%.*s'.\n" + +#: implicit.c:697 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Rejeitando pré-requisito para regra `%s'.\n" + +#: implicit.c:698 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Rejeitando pré-requisitos implícitos `%s'.\n" + +#: implicit.c:711 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Tentanto pré-requisito para a regra `%s'.\n" + +#: implicit.c:712 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Tentando pré-requisito implícito `%s'.\n" + +#: implicit.c:751 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Pré-requisito `%s' encontrado como VPATH `%s'\n" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Procurando uma regra com o arquivo intermediário `%s'.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Não foi possível criar um arquivos temporário\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (arquivo core criado)" + +#: job.c:488 +#, fuzzy +msgid " (ignored)" +msgstr "[%s] Erro %d (ignorado)" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (embutido):" + +#: job.c:503 +#, fuzzy, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "aviso: sobreescrevendo os comandos para o alvo `%s'" + +#: job.c:516 job.c:524 +#, fuzzy, c-format +msgid "%s[%s] Error %d%s" +msgstr "** [%s] Erro %d" + +#: job.c:519 +#, fuzzy, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "*** [%s] Erro 0x%x" + +#: job.c:529 +#, fuzzy, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s%s: %s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "** Esperando que outros processos terminem." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Filho ativo %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (remoto)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Descarregando processo filho %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Descarregando processo filho %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Apagando o arquivo de lote temporário: %s\n" + +#: job.c:855 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Apagando o arquivo de lote temporário: %s\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Removendo o processo filho %p PID %s%s da cadeia.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Liberado sinalizador para o processo filho %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "gravar jobserver" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() falhou ao executar o processo (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Contados %d args na falha de execução\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Colocando o processo filho %p (%s) PID %s%s na cadeia.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Obtido o sinalizador para o processo filho %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "tarefas canalizadas lidas" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch: Arquivo `%s' não existe" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%sSem regra para processar o alvo `%s', necessário por `%s'%s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "não pôde forçar os limites de carga neste sistema operacional" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "não pôde forçar a carga limite:" + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "sem manipuladores de arquivos: não é possível duplicar stdin\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "sem manipuladores de arquivos: não é possível duplicar stdout\n" + +#: job.c:2278 +#, fuzzy +msgid "no more file handles: could not duplicate stderr\n" +msgstr "sem manipuladores de arquivos: não é possível duplicar stdin\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Não é possível restaurar stdin\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Não é possível restaurar stdout\n" + +#: job.c:2309 +#, fuzzy +msgid "Could not restore stderr\n" +msgstr "Não é possível restaurar stdin\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "processo filho descarregado: pid %s, aguardando pelo pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Comando não encontrado" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Interpretador de comandos não encontrado" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: o espaço de ambiente pode estar cheio" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL alterado (era `%s' e agora é `%s')\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Criando arquivo de lote temporário %s\n" + +#: job.c:3206 +#, fuzzy +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Conteúdo do arquivo de lote:%s\n" +"\t%s\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Conteúdo do arquivo de lote:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (linha %d) contexto inválido (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +#, fuzzy +msgid "The 'load' operation is not supported on this platform." +msgstr "Tarefas paralelas (-j) não são suportadas nesta plataforma." + +#: main.c:313 +msgid "Options:\n" +msgstr "Opções:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorado para compatibilidade.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Processa todos os alvos incondicionalmente.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Imprime muita informação de depuração.\n" + +#: main.c:323 +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" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Assume os valores das variáveis de ambiente.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=STRING Avalia a STRING como uma declaração para um " +"makefile.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Imprime esta mensagem e sai.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignora os erros dos comandos.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +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" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Imprime o banco de dados interno do make.\n" + +#: main.c:360 +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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules Desabilita as regras implícitas.\n" + +#: main.c:364 +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" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Não ecoa os comandos.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Desativa a opção -k.\n" + +#: main.c:371 +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" + +#: main.c:373 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr " -d Imprime muita informação de depuração.\n" + +#: main.c:375 +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" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Imprime o diretório atual.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "Cadeia de caracteres vazia não é válida como nome de arquivo" + +#: main.c:737 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "nível de depuração desconhecido: `%s'" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, 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" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, 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" + +#: main.c:844 +#, 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" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() definiu o default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell(), caminho de pesquisa do default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s está suspenso por 30 segundos..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) concluido. Continuando.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, fuzzy, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Cliente Jobserver (fds %d,%d)\n" + +#: main.c:1534 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "erro interno: valor `%s' inválido para --jobserver-fds" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Cliente Jobserver (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "aviso: -jN forçado no submake: desabilitando o modo jobserver." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1570 +#, fuzzy +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "aviso: jobserver indisponível: usando -j1. Inclua `+' na regra pai." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile na entrada padrão especificado duas vezes." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (arquivo temporário)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (arquivo temporário)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Tarefas paralelas (-j) não são suportadas nesta plataforma." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Reiniciando no modo de tarefa única (-j1)." + +#: main.c:1994 +#, fuzzy, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Cliente Jobserver (fds %d,%d)\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "criando canalização de tarefas" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "inicializando a canalização do jobserver" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Vínculos simbólicos não são suportados: desabilite -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Atualizando os arquivos makefiles ...\n" + +#: main.c:2158 +#, fuzzy, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "O arquivo `%s' pode estar em loop; não reprocessá-lo.\n" + +#: main.c:2237 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Problemas ao reprocessar o arquivo `%s'." + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "Arquivo `%s' incluido não foi encontrado." + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "O arquivo `%s' não foi encontrado." + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Não foi possível voltar ao diretório original." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Re-executando[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "desvinculado (arquivos temporário): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ". DEFAULT_GOAL contém mais do que um alvo" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Nenhum alvo indicado e nenhum arquivo make encontrado" + +#: main.c:2511 +msgid "No targets" +msgstr "Sem alvo" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Atualizando os objetivos finais...\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "aviso: O relógio está errado. Sua compilação pode ficar incompleta." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uso: %s [opções] [alvo] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Este programa foi compilado para %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Este programa foi compilado para %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "Informe os problemas para .\n" + +#: main.c:2807 +#, fuzzy, 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" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "a opção `-%c' requer um argumento inteiro positivo" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sCompilado para %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sCompilado para %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Banco de dados do Make, impresso em %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Banco de dados do Make finalizado em %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Erro desconhecido %d" + +#: misc.c:522 +#, 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" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Acesso inicializado" + +#: misc.c:622 +msgid "User access" +msgstr "Acesso do usuário" + +#: misc.c:670 +msgid "Make access" +msgstr "Acesso do make" + +#: misc.c:704 +msgid "Child access" +msgstr "Acesso filho" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Entrando em um diretório desconhecido\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Saindo de um diretório desconhecido\n" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Entrando no diretório `%s'\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Saindo do diretório `%s'\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Entrando em um diretório desconhecido\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Saindo de um diretório desconhecido\n" + +#: output.c:120 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Entrando no diretório `%s'\n" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Saindo do diretório `%s'\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "Erro de gravação: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Pare.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Lendo arquivos makefile ...\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "Lendo arquivos makefile `%s'" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (não há objetivo padrão)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (caminho de pesquisa)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (sem importância)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (sem expansão ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "síntaxe inválida na condicional" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "comandos começam antes do primeiro alvo" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "falta uma regra antes dos comandos" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (você pensou em TAB ao invés de 8 espaços?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "faltando o separador%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "faltando o padrão dos alvos" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "múltiplos padrões para o alvo" + +#: read.c:1276 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "padrão para o alvo não contém `%%'" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "faltando `endif'" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "nome de variável vazio" + +#: read.c:1471 +#, fuzzy +msgid "extraneous text after 'define' directive" +msgstr "Texto estranho depois da diretiva `define'" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "faltando `endef', `define' não terminado" + +#: read.c:1524 +#, fuzzy +msgid "extraneous text after 'endef' directive" +msgstr "Texto estranho depois da diretiva `endef" + +#: read.c:1595 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "Texto estranho depois da diretiva `%s'" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "`%s' estranho" + +#: read.c:1624 +#, fuzzy +msgid "only one 'else' per conditional" +msgstr "use apenas um `else' por condicional" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Definição de variável para o alvo mau formada" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "os pré-requisitos não podem ser definidos no comando" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "As regras implícitas e de padrão estático misturadas" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "As regras implícitas e normais misturadas" + +#: read.c:2091 +#, fuzzy, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "O alvo `%s' não coincide com o padrão" + +#: read.c:2106 read.c:2152 +#, fuzzy, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "O arquivo alvo `%s' tem entradas : e ::" + +#: read.c:2112 +#, fuzzy, 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." + +#: read.c:2122 +#, fuzzy, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "aviso: sobreescrevendo os comandos para o alvo `%s'" + +#: read.c:2125 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "aviso: ignorando comandos antigos para o alvo `%s'" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "As regras implícitas e normais misturadas" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "aviso: caracter NUL detetado; o resto da linha foi ignorado" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "Nada a ser feito para `%s'." + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "`%s' está atualizado." + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Atualizando o arquivo `%s'.\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, 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" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sSem regra para processar o alvo `%s'%s" + +#: remake.c:426 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "Considerando o arquivo alvo `%s'.\n" + +#: remake.c:433 +#, fuzzy, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Tentativa de atualizar o arquivo `%s' falhou.\n" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "O arquivo `%s' já foi considerado.\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "Ainda está atualizando o arquivo `%s'.\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Atualização do arquivo `%s' concluida.\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "O arquivo `%s' não existe.\n" + +#: remake.c:495 +#, fuzzy, 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" + +#: remake.c:508 remake.c:1040 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Regra implícita encontrada para `%s'.\n" + +#: remake.c:510 remake.c:1042 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Nenhuma regra implícita encontrada para `%s'.\n" + +#: remake.c:516 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Usando os comandos padrões para `%s'.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Dependência circular %s <- %s abandonada." + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Pré-requisitos do alvo `%s' concluido.\n" + +#: remake.c:681 +#, fuzzy, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Pré-requisitos do `%s' estão sendo criados.\n" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Desistindo do arquivo `%s'.\n" + +#: remake.c:700 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "O alvo `%s' não foi reprocessado por causa de erros." + +#: remake.c:752 +#, fuzzy, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Pré-requisito `%s' está ordenado para o alvo `%s'.\n" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Pré-requisitos `%s' do alvo `%s' não existem.\n" + +#: remake.c:762 +#, fuzzy, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Pré-requisito `%s' é mais novo do que o alvo `%s'.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Pré-requisito `%s' é mais antigo do que o alvo `%s'.\n" + +#: remake.c:783 +#, fuzzy, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "O alvo `%s' é dois-pontos duplos e não tem pré-requisitos.\n" + +#: remake.c:790 +#, fuzzy, 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" + +#: remake.c:795 +#, fuzzy, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Processando `%s' devido a opção always-make.\n" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Não é necessário reprocessar o alvo `%s'" + +#: remake.c:805 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr "; usando o nome VPATH `%s'" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "O alvo `%s' deve ser reprocessado.\n" + +#: remake.c:831 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ignorando o nome VPATH `%s'.\n" + +#: remake.c:840 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Os comandos de `%s' estão rodando.\n" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Falha ao reprocessar o alvo `%s'.\n" + +#: remake.c:850 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Alvo `%s' reprocessado com sucesso.\n" + +#: remake.c:853 +#, fuzzy, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "O alvo `%s' precisa ser reprocessado sob -q.\n" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Usando os comandos padrões para `%s'.\n" + +#: remake.c:1397 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "** Aviso: O arquivo `%s' está com a hora adiantada" + +#: remake.c:1411 +#, fuzzy, 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" + +#: remake.c:1610 +#, fuzzy, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "O elemento .LIBPATTERNS `%s' não é um padrão" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customizações não exportadas: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Regras implícitas." + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Faltam as regras implícitas." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u regras implícitas, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminal." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ERRO: num_pattern_rules errada! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "sinal desconhecido" + +#: signame.c:92 +msgid "Hangup" +msgstr "Desconectar" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Interrupção" + +#: signame.c:98 +msgid "Quit" +msgstr "Sair" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Instrução ilegal" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Aviso Trace/breakpoint" + +#: signame.c:109 +msgid "Aborted" +msgstr "Abortado" + +#: signame.c:112 +msgid "IOT trap" +msgstr "Aviso IOT" + +#: signame.c:115 +msgid "EMT trap" +msgstr "Aviso EMT" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Exceção de ponto flutuante" + +#: signame.c:121 +msgid "Killed" +msgstr "Finalizado" + +#: signame.c:124 +msgid "Bus error" +msgstr "Erro de barramento" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Falha de segmentação" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Chamada de sistema inválida" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Canalização interrompida" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Despertador" + +#: signame.c:139 +msgid "Terminated" +msgstr "Terminado" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Sinal 1 definido pelo usuário" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Sinal 2 definido pelo usuário" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "O Filho saiu" + +#: signame.c:156 +msgid "Power failure" +msgstr "Falha na Energia Elétrica" + +#: signame.c:159 +msgid "Stopped" +msgstr "Parado" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Parado (entrada tty)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Parado (saida tty)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Parado (sinal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Tempo de CPU excedido" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Tamanho do arquivo excedido" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Temporizador virtual expirou" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Temporizador de perfil expirou" + +#: signame.c:186 +msgid "Window changed" +msgstr "Janela alterada" + +#: signame.c:189 +msgid "Continued" +msgstr "Continuação" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Condição de E/S urgente" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "Possível E/S" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Recurso perdido" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Sinal perigoso" + +#: signame.c:217 +msgid "Information request" +msgstr "Solicitação de informação" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Co-processador aritmético indisponível" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" + +#: strcache.c:266 +#, fuzzy, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "%s strcache usado: total = %d (%d) / max = %d / min = %d / med = %d\n" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, fuzzy, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s strcache usado: total = %d (%d) / max = %d / min = %d / med = %d\n" + +#: strcache.c:283 +#, fuzzy, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "%s strcache livres: total = %d (%d) / max = %d / min = %d / med = %d\n" + +#: strcache.c:287 +#, fuzzy, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s # de cadeias em strcache: %d / pesquisados = %lu / encontrados = %lu\n" + +#: strcache.c:289 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# tabela hash de arquivos:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automático" + +#: variable.c:1602 +msgid "default" +msgstr "padrão" + +#: variable.c:1605 +msgid "environment" +msgstr "ambiente" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "ambiente sob -e" + +#: variable.c:1614 +msgid "command line" +msgstr "linha de comando" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "diretiva `override'" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (de `%s', linha %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# tabela hash do conjunto de variávies:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variáveis\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valores da variável de padrões específicos" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Faltam valores para variável de padrões específicos" + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valores para variável de padrões específicos" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "aviso: variável indefinida `%.*s'" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() falhou com %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Aviso: Redireção vazia\n" + +#: vmsjobs.c:183 +#, fuzzy, c-format +msgid "internal error: '%s' command_state" +msgstr "erro interno: `%s' command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-warning, pode ser preciso reativar o CTRL-Y no DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "EMBUTIDO [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "CD EMBUTIDO %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "CD EMBUTIDO %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Comando embutido desconhecido `%s'.\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Erro, comando vazio\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Entrada de %s redirecionada\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Erro redirecionado para %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Saida redirecionada para %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Saida redirecionada para %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Acrescentado %.*s e limpo\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Executando %s ao invés de\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Erro de execução, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Caminho VPATH\n" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# Sem caminho `vpath'." + +#: vpath.c:602 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u caminhos `vpath'.\n" + +#: vpath.c:605 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Sem caminho genérico (variável `VPATH')." + +#: vpath.c:611 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Caminho genérico (variável `VPATH'):\n" +"# " + +#~ 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 "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 "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 "BUILTIN RM %s\n" +#~ msgstr "RM EMBUTIDO %s\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/po/quot.sed b/po/quot.sed new file mode 100644 index 0000000..0122c46 --- /dev/null +++ b/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/po/remove-potcdate.sin b/po/remove-potcdate.sin new file mode 100644 index 0000000..2436c49 --- /dev/null +++ b/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/po/ru.gmo b/po/ru.gmo new file mode 100644 index 0000000..1954613 Binary files /dev/null and b/po/ru.gmo differ diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..624c68e --- /dev/null +++ b/po/ru.po @@ -0,0 +1,2327 @@ +# 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. +msgid "" +msgstr "" +"Project-Id-Version: make 4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-10-10 20:44+0400\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-Generator: Lokalize 1.4\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "попытка иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð¾Ð³Ð¾ ÑредÑтва: «%s»" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "обновление времени Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ‡Ð»ÐµÐ½Ð° архива невозможно в ÑиÑтеме VMS" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "обновление времени изменениÑ: Ðрхив «%s» не ÑущеÑтвует" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "обновление времени изменениÑ: Ðеверный архив: «%s»" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "обновление времени изменениÑ: Элемент «%s» не ÑодержитÑÑ Ð² «%s»" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "" +"обновление времени изменениÑ: Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ ar_member_touch вернула\n" +"ошибочное значение Ð´Ð»Ñ Â«%s»" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module() не Ñмогла извлечь информацию о модуле, ÑÑ‚Ð°Ñ‚ÑƒÑ = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$init_control() вернула код ошибки %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸ «%s» Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка Ñлемента «%s»" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Элемент «%s»%s: %ld байт по адреÑу %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (Ð¸Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть уÑечено)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Дата %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Ð’ ÑпоÑобе Ñлишком много Ñтрок (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** ОÑтанов.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Элемент архива «%s», кажетÑÑ, недейÑтвителен; не удалён" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Элемент архива «%s», кажетÑÑ, недейÑтвителен; не удалён" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] УдалÑетÑÑ Ñ„Ð°Ð¹Ð» «%s»" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** УдалÑетÑÑ Ñ„Ð°Ð¹Ð» «%s»" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# ÑпоÑоб, который Ñледует применить" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (вÑтроенные):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (из «%s», Ñтрока %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Каталоги\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: невозможно получить ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð¾Ð¼ stat.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (ключ %s, Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ %d): невозможно открыть.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (уÑтройÑтво %d, inode [%d,%d,%d]): невозможно открыть.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (уÑтройÑтво %ld, inode %ld): невозможно открыть.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (ключ %s, Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (уÑтройÑтво %d, inode [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (уÑтройÑтво %ld, inode %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Ðет" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " файлов," + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "нет" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " недоÑтижимых целей" + +#: dir.c:1068 +msgid " so far." +msgstr " на текущий момент." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " недоÑтижимых целей в %lu каталогах.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "РекурÑÐ¸Ð²Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Â«%s» ÑÑылаетÑÑ Ñама на ÑÐµÐ±Ñ (в результате)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ ÑÑылка на переменную" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "СпоÑоб Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° «%s» был задан в %s:%lu," + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "СпоÑоб Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° «%s» был найден из неÑвного правила," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "но «%s» и «%s» теперь ÑчитаютÑÑ Ð¾Ð´Ð½Ð¸Ð¼ и тем же файлом." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" +"СпоÑоб Ð´Ð»Ñ Â«%s» игнорируетÑÑ, вмеÑто него будет иÑпользован ÑпоÑоб Ð´Ð»Ñ Â«%s»." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" +"невозможно переименовать «%s» Ñ Ð¾Ð´Ð½Ð¸Ð¼ двоеточием в «%s» Ñ Ð´Ð²ÑƒÐ¼Ñ Ð´Ð²Ð¾ÐµÑ‚Ð¾Ñ‡Ð¸Ñми" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" +"невозможно переименовать «%s» Ñ Ð´Ð²ÑƒÐ¼Ñ Ð´Ð²Ð¾ÐµÑ‚Ð¾Ñ‡Ð¸Ñми в «%s» Ñ Ð¾Ð´Ð½Ð¸Ð¼ двоеточием" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Удаление промежуточного файла «%s»" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Удаление промежуточных файлов...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Текущее времÑ" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Временной штамп выходит за пределы диапазона; подÑтавлÑем %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Ðе ÑвлÑетÑÑ Ñ†ÐµÐ»ÑŒÑŽ:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Ценный файл (завиÑимоÑÑ‚ÑŒ .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# ПÑевдоцель (завиÑимоÑÑ‚ÑŒ от .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Цель, Ð²Ñ‹Ð·Ñ‹Ð²Ð°ÐµÐ¼Ð°Ñ Ð¸Ð· командной Ñтроки." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# По умолчанию, MAKEFILES, или -include/sinclude makefile." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# Ð’Ñтроенное правило" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# ПроизводилÑÑ Ð¿Ð¾Ð¸Ñк неÑвных правил." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# ПоиÑк неÑвных правил не производилÑÑ." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# ОÑнова неÑвного или ÑтатичеÑкого образца: «%s»\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Файл — Ð¿Ñ€Ð¾Ð¼ÐµÐ¶ÑƒÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑ‚ÑŒ." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Собирает также:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Ð’Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð¸ разу не проверÑлоÑÑŒ." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Файл не ÑущеÑтвует." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Файл очень Ñтарый." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Файл был обновлён." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Файл не был обновлён." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Ð’ данный момент уже применÑетÑÑ Ð½ÐµÐºÐ¸Ð¹ ÑпоÑоб (ЭТО ОШИБКÐ)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" +"# Ð’ данный момент уже применÑетÑÑ Ð½ÐµÐºÐ¸Ð¹ ÑпоÑоб по завиÑимоÑÑ‚Ñм (ЭТО ОШИБКÐ)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# УÑпешно обновлено." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Должно быть обновлено (задан ключ -q)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Попытка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÐµÐ·ÑƒÑпешна." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Ðеверное значение члена «command_state»!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Файлы" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# ÑоÑтоÑние файлов хеш-таблицы:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Поле «%s» не кешировано: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "нечиÑловой первый аргумент функции «word»" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "первый аргумент функции «word» должен быть больше нулÑ" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "нечиÑловой первый аргумент функции «wordlist»" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "нечиÑловой второй аргумент функции «wordlist»" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) вернула код ошибки (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(Err) вернула код ошибки (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() вернула код ошибки (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() завершилаÑÑŒ неудачно\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Очищаю временный пакетный файл %s\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "открытие: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "запиÑÑŒ: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "недоÑтаточно аргументов (вÑего %d) функции «%s»" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "не реализовано на Ñтой платформе: Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Â«%s»" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "незавершённый вызов функции «%s»: пропущено «%c»" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "ПуÑтое Ð¸Ð¼Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Ðекорректное Ð¸Ð¼Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Слишком длинное Ð¸Ð¼Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "Ðекорректное минимальное чиÑло аргументов (вÑего %d) функции %s\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "Ðекорректное макÑимальное чиÑло аргументов (вÑего %d) функции %s\n" + +# Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ getopt иÑключены, Ñ‚.к. они отноÑÑÑ‚ÑÑ Ðº уже +# уÑтаревшей верÑии Ñтой библиотеки, и иÑчезнут в Ñледующей верÑии make +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: ключ «%s» не однозначен\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: ключ «--%s» должен иÑпользоватьÑÑ Ð±ÐµÐ· аргумента\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: ключ «%c%s» должен иÑпользоватьÑÑ Ð±ÐµÐ· аргумента\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: ключу «%s» требуетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: неизвеÑтный ключ «--%s»\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: неизвеÑтный ключ «%c%s»\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: недопуÑтимый ключ -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: неверный ключ -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ключ требует аргумент -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: ключ «-W %s» неоднозначен\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: ключ «-W %s» должен иÑпользоватьÑÑ Ð±ÐµÐ· аргумента\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: раÑширÑетÑÑ Â«%s»\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: вычиÑлÑетÑÑ Â«%s»\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "не удалоÑÑŒ выделить %lu байт Ð´Ð»Ñ Ñ…ÐµÑˆ-таблицы: закончилаÑÑŒ памÑÑ‚ÑŒ" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Загружено=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Переформулировано=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Противоречий=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "ПоиÑк неÑвного правила Ð´Ð»Ñ Â«%s».\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "ПоиÑк неÑвного правила Ð´Ð»Ñ Ñлемента архива «%s».\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Избежание рекурÑивного вызова неÑвного правила.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Слишком длинный образец: «%.*s».\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Попытка Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° Ñ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð¾Ð¼ «%.*s».\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Отвержение невозможной завиÑимоÑти правила «%s».\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Отвержение невозможной неÑвной завиÑимоÑти «%s».\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Попытка Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° завиÑимоÑти «%s».\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Попытка Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½ÐµÑвной завиÑимоÑти «%s».\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Обнаружена завиÑимоÑÑ‚ÑŒ «%s» в виде VPATH «%s»\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "ПоиÑк правила Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ¶ÑƒÑ‚Ð¾Ñ‡Ð½Ñ‹Ð¼ файлом «%s».\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Ðе удалоÑÑŒ Ñоздать временный файл\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (Ñделан дамп памÑти)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (игнорирование)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "<вÑтроенное>" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ€ÐµÑ†ÐµÐ¿Ñ‚Ð° Ð´Ð»Ñ Ñ†ÐµÐ»Ð¸ «%s»" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Ошибка %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Ошибка 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Ожидание Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ð¹â€¦" + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Ðезавершённый потомок %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (удалённый)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "ПодбираетÑÑ Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð¾ завершившийÑÑ Ð¿Ð¾Ñ‚Ð¾Ð¼Ð¾Ðº %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "ПодбираетÑÑ ÑƒÐ´Ð°Ñ‡Ð½Ð¾ завершившийÑÑ Ð¿Ð¾Ñ‚Ð¾Ð¼Ð¾Ðº %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Подчищаю временный пакетный файл %s\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "ОчиÑтка временного пакетного файла %s завершилаÑÑŒ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ (%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "УдалÑетÑÑ Ð¿Ð¾Ñ‚Ð¾Ð¼Ð¾Ðº %p PID %s%s из цепочки.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "оÑвобождение Ñемафора Ñервера заданий: (ошибка %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "ОÑвобождён токен Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ° %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "запиÑÑŒ Ñервера заданий" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() не Ñмогла запуÑтить процеÑÑ (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"При неудачном запуÑке ÑоÑчитано %d аргументов\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Помещение потомка %p (%s) PID %s%s в цепочку потомков.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "ожидание Ñемафора или процеÑÑа-потомка: (ошибка %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Получен токен Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ° %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "чтение потока заданий" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: цель «%s» не ÑущеÑтвует" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: обновление цели «%s» из-за: %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "Ñта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÑиÑтема не позволÑет уÑтанавливать пределы загрузки" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "невозможно уÑтановить пределы загрузки: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "закончилиÑÑŒ файловые деÑкрипторы: не удалоÑÑŒ Ñделать копию stdin\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "закончилиÑÑŒ файловые деÑкрипторы: не удалоÑÑŒ Ñделать копию stdout\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "закончилиÑÑŒ файловые деÑкрипторы: не удалоÑÑŒ Ñделать копию stderr\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Ðе удалоÑÑŒ воÑÑтановить stdin\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Ðе удалоÑÑŒ воÑÑтановить stdout\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Ðе удалоÑÑŒ воÑÑтановить stderr\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make нашла завершившегоÑÑ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ° pid %s, вÑÑ‘ ещё ожидает pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Команда не найдена" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Командный процеÑÑор не найден" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: вероÑтно, закончилоÑÑŒ меÑто под окружение" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $SHELL изменилаÑÑŒ (было «%s», теперь «%s»)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "СоздаётÑÑ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¹ пакетный файл %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Содержимое файла пакетных заданий:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Содержимое файла пакетных заданий:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (Ñтрока %d) Плохой контекÑÑ‚ командного процеÑÑора (!unixy && !" +"batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "-O[ТИП] (--output-sync[=ТИП]) не наÑтроен в данной Ñборке." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Ðе удалоÑÑŒ открыть глобальную таблицу Ñимволов: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Загруженный объект %s не объÑвлено как ÑовмеÑтимый Ñ GPL" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Ðе удалоÑÑŒ загрузить Ñимвол %s из %s: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "ПуÑтое Ð¸Ð¼Ñ Ñимвола Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "ЗагружаетÑÑ Ñимвол %s из %s\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Â«load» не поддерживаетÑÑ Ð½Ð° Ñтой платформе." + +#: main.c:313 +msgid "Options:\n" +msgstr "Ключи:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m ИгнорируетÑÑ Ð´Ð»Ñ ÑовмеÑтимоÑти.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Без уÑловий отрабатывать вÑе цели.\n" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C КÐТÐЛОГ, --directory=КÐТÐЛОГ\n" +" Перейти в КÐТÐЛОГ перед выполнением дейÑтвий.\n" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Выводить маÑÑу отладочных Ñообщений.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=ФЛÐГИ] Выводить различные типы отладочной " +"информации.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð¼ÐµÐ½ÑÑŽÑ‚ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ " +"makefile.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=СТРОКРВычиÑлить СТРОКУ как предложение makefile.\n" + +#: main.c:330 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f ФÐЙЛ, --file=ФÐЙЛ, --makefile=ФÐЙЛ\n" +" ИÑпользовать ФÐЙЛ в качеÑтве makefile.\n" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Показать Ñту Ñправку и выйти.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Игнорировать ошибки ÑпоÑобов.\n" + +#: main.c:337 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I КÐТÐЛОГ, --include-dir=КÐТÐЛОГ\n" +" ИÑкать включаемые make-файлы в КÐТÐЛОГЕ.\n" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Продолжать работу, даже еÑли некоторые цели\n" +" не могут быть доÑтигнуты.\n" + +#: main.c:344 +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" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times ИÑпользовать поÑледнее mtime при выборе между\n" +" ÑимволичеÑкими ÑÑылками и целью.\n" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" +" -O[ТИП], --output-sync[=ТИП]\n" +" Синхронизировать вывод параллельных\n" +" заданий Ñ Ñ‚Ð¸Ð¿Ð¾Ð¼ ТИП.\n" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Ðапечатать внутреннюю базу данных make.\n" + +#: main.c:360 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Ðе применÑÑ‚ÑŒ ÑпоÑоб;\n" +" код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚, вÑÑ‘ ли уже " +"Ñделано.\n" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Ðе иÑпользовать вÑтроенные неÑвные правила.\n" + +# Что такое "variable settings"? +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Выключить уÑтановку вÑтроенных\n" +" значений переменных.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Ðе показывать Ñами ÑпоÑобы.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Отменить ключ -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch УÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾Ñтупа целей в текущее,\n" +" а не переÑобирать их.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace Выводить траÑÑировочную информацию.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version Показать информацию о верÑии и выйти.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Ðапечатать текущий каталог.\n" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Отменить ключ -w, даже еÑли он был Ñвно " +"указан.\n" + +#: main.c:381 +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" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Выдавать предупреждение при ÑÑылке\n" +" на неопределённую переменную.\n" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "пуÑÑ‚Ð°Ñ Ñтрока недопуÑтима в качеÑтве имени файла" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "задан неизвеÑтный уровень отладки «%s»" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "неизвеÑтный тип output-sync «%s»" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: поймано прерывание или иÑключение (код = 0x%lx, Ð°Ð´Ñ€ÐµÑ = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Ðарушение доÑтупа: Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи по адреÑу 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Ðарушение доÑтупа: Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() уÑтанавливает default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell(): поиÑк в путÑÑ… уÑтанавливает default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s приоÑтанавливаетÑÑ Ð½Ð° 30 Ñекунд..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) завершён. Продолжаем.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" +"внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: не удалоÑÑŒ открыть Ñемафор Ñервера заданий «%s»: (ошибка " +"%ld: %s)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Клиент Ñервера заданий (Ñемафор %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ñтрока --jobserver-fds «%s»" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Клиент Ñервера заданий (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"предупреждение: в Ñуб-Makefile принудительно задан -jN; режим Ñервера " +"заданий запрещён" + +#: main.c:1567 +msgid "dup jobserver" +msgstr "Ñоздаю копию Ñервера заданий" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"предупреждение: Ñервер заданий недоÑтупен: иÑпользуетÑÑ -j1. Добавьте «+» к " +"правилу в родительÑком make." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile из Ñтандартного ввода указан дважды." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (временный файл)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (временный файл)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Параллельные Ð·Ð°Ð´Ð°Ð½Ð¸Ñ (-j) не поддерживаютÑÑ Ð½Ð° Ñтой платформе." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "ВозвращаетÑÑ Ñ€ÐµÐ¶Ð¸Ð¼ одиночного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "КоличеÑтво Ñлотов Ñервера заданий ограничено %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "Ñоздание Ñемафора Ñервера заданий: (ошибка %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "ÑоздаётÑÑ ÐºÐ°Ð½Ð°Ð» заданий" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ñтройка Ñервера заданий" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "СимволичеÑкие ÑÑылки не поддерживаютÑÑ: отменÑетÑÑ ÐºÐ»ÑŽÑ‡ -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Обновление make-файлов....\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Make-файл «%s», возможно, зациклен, он не будет переÑобиратьÑÑ.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Попытка переÑобрать make-файл «%s» завершилаÑÑŒ неудачно." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Включаемый make-файл «%s» не найден." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Make-файл «%s» не найден" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Ðевозможно перейти в первоначальный каталог." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Повторное выполнение[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (временный файл)" + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL Ñодержит более одной цели" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Ðе заданы цели и не найден make-файл" + +#: main.c:2511 +msgid "No targets" +msgstr "Ðет целей" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Обновление целей результата...\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "предупреждение: Ðеправильный ход чаÑов. Сборка может быть неполной." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "ИÑпользование: %s [КЛЮЧ]... [ЦЕЛЬ]...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Эта программа Ñобрана Ð´Ð»Ñ %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Эта программа Ñобрана Ð´Ð»Ñ %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "Сообщайте об ошибках по адреÑу \n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "длÑ ключа «%s%s» нужно указать аргументом непуÑтую Ñтроку" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "ключ «-%c» должен иÑпользоватьÑÑ Ñ Ñ†ÐµÐ»Ñ‹Ð¼ положительным аргументом" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sЭта программа Ñобрана Ð´Ð»Ñ %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sЭта программа Ñобрана Ð´Ð»Ñ %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# База данных Make, напечатана %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Печать базы данных Make завершена %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "" +"%s: пользователь %lu (дейÑтвительный %lu),\n" +"группа %lu (дейÑÑ‚Ð²Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "ДоÑтуп инициализации" + +#: misc.c:622 +msgid "User access" +msgstr "ДоÑтуп пользователÑ" + +#: misc.c:670 +msgid "Make access" +msgstr "ДоÑтуп make" + +#: misc.c:704 +msgid "Child access" +msgstr "ДоÑтуп потомка" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Вход в неизвеÑтный каталог\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Выход из неизвеÑтного каталога\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: вход в каталог «%s»\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: выход из каталога «%s»\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: вход в неизвеÑтный каталог\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: выход из неизвеÑтного каталога\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: вход в каталог «%s»\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: выход из каталога «%s»\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "ошибка запиÑи: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". ОÑтанов.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Чтение make-файлов...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Чтение make-файла «%s»" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (нет цели по умолчанию)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (путь поиÑка)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (игнорировать ошибки)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (не раÑкрывать Ñимвол `~') " + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "ПропуÑк UTF-8 BOM в make-файле «%s»\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "ПропуÑк UTF-8 BOM в буфере make-файла\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "неверный ÑинтакÑÐ¸Ñ Ð² уÑловном выражении" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: не удалоÑÑŒ загрузить" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "обнаружен ÑпоÑоб до первого Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ†ÐµÐ»Ð¸" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "перед ÑпоÑобом отÑутÑтвует правило" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr "(не имели ли вы в виду TAB вмеÑто воÑьми пробелов?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "пропущен разделитель%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "пропущен образец цели" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "неÑколько образцов цели" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "образец цели не Ñодержит «%%»" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "отÑутÑтвует «endif»" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "пуÑтое Ð¸Ð¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "излишний текÑÑ‚ поÑле директивы «define»" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "отÑутÑтвует «endif», Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Â«define»" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "излишний текÑÑ‚ поÑле директивы «endef»" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "Излишний текÑÑ‚ поÑле директивы «%s»" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "излишнÑÑ Â«%s»" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "в уÑловном выражении возможна только одна «else»" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Ðеправильный формат Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹ цели" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "в ÑпоÑобах не могут задаватьÑÑ Ð·Ð°Ð²Ð¸ÑимоÑти" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "Ñмешаны неÑвные правила и правила Ñо ÑтатичеÑкими образцами" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "Ñмешаны неÑвные и обычные правила" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "цель «%s» не ÑоответÑтвует образцу целей" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "целевой файл «%s» имеет Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸ Ñ :, и Ñ ::" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "цель «%s» указана неÑколько раз в одном правиле" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "предупреждение: переопределение ÑпоÑоба Ð´Ð»Ñ Ñ†ÐµÐ»Ð¸ «%s»" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "предупреждение: Ñтарый ÑпоÑоб Ð´Ð»Ñ Ñ†ÐµÐ»Ð¸ «%s» игнорируютÑÑ" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "Ñмешаны неÑвные и обычные правила" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "предупреждение: вÑтречен Ñимвол NUL; игнорируетÑÑ Ð´Ð¾ конца Ñтроки" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Цель «%s» не требует Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "«%s» не требует обновлениÑ." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "ОбрезаетÑÑ Ñ„Ð°Ð¹Ð» «%s».\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sÐет правила Ð´Ð»Ñ Ñборки цели «%s», требуемой Ð´Ð»Ñ Â«%s»%s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sÐет правила Ð´Ð»Ñ Ñборки цели «%s»%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Обработка целевого файла «%s».\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° обновить файл «%s» завершилаÑÑŒ неудачно.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Файл «%s» уже был обработан.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Файл «%s» обновлÑетÑÑ Ð² данный момент.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Обновление файла «%s» завершено.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Файл «%s» не ÑущеÑтвует.\n" + +#: remake.c:495 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Предупреждение: у файла «%s» параметр LOW_RESOLUTION_TIME Ñодержит метку " +"времени Ñ Ð²Ñ‹Ñокой точноÑтью" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Ðайдено неÑвное правило Ð´Ð»Ñ Â«%s».\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Ðе найдено неÑвного правила Ð´Ð»Ñ Â«%s».\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "ИÑпользование ÑпоÑоба по умолчанию Ð´Ð»Ñ Â«%s».\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "ЦикличеÑÐºÐ°Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑ‚ÑŒ %s <- %s пропущена." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Обновление целей, от которых завиÑит целевой файл «%s», завершено.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Цели, от которых завиÑит «%s», в наÑтоÑщий момент ÑобираютÑÑ.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Ðварийный оÑтанов на целевом файле «%s».\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Цель «%s» не была переÑобрана из-за ошибок." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "ЗавиÑимоÑÑ‚ÑŒ «%s» Ð´Ð»Ñ Ñ†ÐµÐ»Ð¸ «%s» завиÑит от порÑдка.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "ЗавиÑимоÑÑ‚ÑŒ «%s» цели «%s» не ÑущеÑтвует.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "ЗавиÑимоÑÑ‚ÑŒ «%s» новее, чем цель «%s».\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "ЗавиÑимоÑÑ‚ÑŒ «%s» Ñтарее, чем цель «%s».\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Цель «%s» объÑвлена Ñ Ð´Ð²ÑƒÐ¼Ñ Ð´Ð²Ð¾ÐµÑ‚Ð¾Ñ‡Ð¸Ñми и не имеет завиÑимоÑтей.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "СпоÑоб Ð´Ð»Ñ Â«%s» не задан, и начальные уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ðµ изменены.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "ПереÑборка «%s» из-за уÑтановленного флага always-make.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Ðет необходимоÑти переÑобирать цель «%s»" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; иÑпользуетÑÑ VPATH-Ð¸Ð¼Ñ Â«%s»" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Ðеобходимо переÑобрать цель «%s».\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " ИгнорируетÑÑ VPATH-Ð¸Ð¼Ñ Â«%s».\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑетÑÑ ÑпоÑоб «%s».\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Ðе удалоÑÑŒ переÑоздать файл цели «%s».\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Целевой файл «%s» уÑпешно переÑоздан.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Целевой файл «%s» требует переÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ -q.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "ИÑпользование команд по умолчанию Ð´Ð»Ñ Â«%s».\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Предупреждение: Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° «%s» находитÑÑ Ð² будущем" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Предупреждение: Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° «%s» находитÑÑ Ð² будущем (%s)" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "Элемент .LIBPATTERNS «%s» не ÑвлÑетÑÑ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð¾Ð¼" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Ðе ÑкÑпортируемые наÑтройки: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# ÐеÑвные правила" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# ÐеÑвных правил нет." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# ÐеÑвных правил: %u, терминальных: %u" + +#: rule.c:522 +msgid " terminal." +msgstr " терминал." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ОШИБКÐ: неверное значение num_pattern_rules! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "неизвеÑтный Ñигнал" + +#: signame.c:92 +msgid "Hangup" +msgstr "Обрыв терминальной линии" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Прерывание" + +#: signame.c:98 +msgid "Quit" +msgstr "Ðварийное прерывание" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð¸Ð½ÑтрукциÑ" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Прерывание на контрольной точке" + +#: signame.c:109 +msgid "Aborted" +msgstr "Прервано" + +#: signame.c:112 +msgid "IOT trap" +msgstr "Ошибка IOT" + +#: signame.c:115 +msgid "EMT trap" +msgstr "Ошибка ÑмулÑции" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Ошибка операции Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой" + +#: signame.c:121 +msgid "Killed" +msgstr "Уничтожение" + +#: signame.c:124 +msgid "Bus error" +msgstr "Ðеверное обращение к памÑти" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Ðарушение прав доÑтупа к памÑти" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Ðеправильный ÑиÑтемный вызов" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Обрыв канала" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Сигнал по таймеру" + +#: signame.c:139 +msgid "Terminated" +msgstr "Завершение" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "ОпределÑемый пользователем Ñигнал 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "ОпределÑемый пользователем Ñигнал 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Потомок завершил работу" + +#: signame.c:156 +msgid "Power failure" +msgstr "Отказ питаниÑ" + +#: signame.c:159 +msgid "Stopped" +msgstr "ОÑтанов" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "ОÑтанов (ввод Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½Ð°Ð»Ð°) " + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "ОÑтанов (вывод на терминал)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "ОÑтанов (Ñигнал)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Превышен предел процеÑÑорного времени" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Превышен предел размера файла" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Виртуальное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ñтекло" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñтекло" + +#: signame.c:186 +msgid "Window changed" +msgstr "Окно изменено" + +#: signame.c:189 +msgid "Continued" +msgstr "Возобновление" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "УÑÐ»Ð¾Ð²Ð¸Ñ ÑкÑтренного ввода/вывода" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "Возможен ввод/вывод" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "РеÑÑƒÑ€Ñ Ð¿Ð¾Ñ‚ÐµÑ€Ñн" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Сигнал опаÑноÑти" + +#: signame.c:217 +msgid "Information request" +msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "СопроцеÑÑор Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой недоÑтупен" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s без буферов strcache\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s текущий buf: размер = %hu Б / иÑпользуетÑÑ = %hu Б / кол-во = %hu / Ñред " +"= %hu Б\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "" +"%s Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ иÑпользуетÑÑ: вÑего = %lu Б / кол-во = %lu / Ñред = %lu Б\n" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" +"%s Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ Ñвободно: вÑего = %lu Б / макÑ. = %lu Б / мин. = %lu Б / " +"Ñред. = %hu Б\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"%s производительноÑÑ‚ÑŒ strcache: поиÑков = %lu / найдено = %lu%%\n" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# ÑоÑтоÑние хеш-таблицы:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "автоматичеÑкаÑ" + +#: variable.c:1602 +msgid "default" +msgstr "по умолчанию" + +#: variable.c:1605 +msgid "environment" +msgstr "определена в Ñреде" + +#: variable.c:1608 +msgid "makefile" +msgstr "make-файл" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "окружение Ñ -e" + +#: variable.c:1614 +msgid "command line" +msgstr "определена в командной Ñтроке" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "Директива «override»" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (из «%s», Ñтрока %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# ÑоÑтоÑние переменных в хеш-таблице:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Переменные\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… оÑобенные Ð´Ð»Ñ Ð¼Ð°Ñки" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Ðет значений переменных оÑобенных Ð´Ð»Ñ Ð¼Ð°Ñки." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u значений переменных оÑобенных Ð´Ð»Ñ Ð¼Ð°Ñки" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "предупреждение: Ð½ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Â«%.*s»" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() вернула код ошибки %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Предупреждение: ПуÑтое перенаправление\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: «%s» command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-предупреждение, возможно вам потребуетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ разрешить\n" +"обработку CTRL-Y из DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "ВСТРОЕÐÐЫЙ [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "ВСТРОЕÐÐЫЙ CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "ВСТРОЕÐÐЫЙ CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð²ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° '%s'\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Ошибка, пуÑÑ‚Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Стандартный ввод перенаправлен из %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Поток ошибок перенаправлен в %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Стандартный вывод добавлен в %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Стандартный вывод перенаправлен в %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Добавить %.*s и очиÑтить\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "ВмеÑто заданного выполнÑетÑÑ %s\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Ошибка Ð¿Ð¾Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Пути поиÑка VPATH\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Ðе определён путь поиÑка «vpath»." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u путей поиÑка по «vpath»\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Ðе определён общий (Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Â«VPATH») путь поиÑка." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Общий (Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Â«VPATH») путь поиÑка:\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/po/stamp-po b/po/stamp-po new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/po/stamp-po @@ -0,0 +1 @@ +timestamp diff --git a/po/sv.gmo b/po/sv.gmo new file mode 100644 index 0000000..4f9b305 Binary files /dev/null and b/po/sv.gmo differ diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..4545ab3 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,2251 @@ +# Swedish messages translation of make +# Copyright © 2002, 2007, 2011, 2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Tomas Gradin , 1996-2002. +# Christer Andersson , 2007. +# Göran Uddeborg , 2011, 2013. +# +# $Id: make.po,v 1.14 2013-10-09 21:33:42+02 göran Exp $ +msgid "" +msgstr "" +"Project-Id-Version: make 4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-10-09 21:33+0200\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" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "försök att använda en funktion som inte stöds: â€%sâ€" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "att nudda en arkivmedlem är inte tillgängligt i VMS" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "nudda: Arkivet â€%s†finns inte" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "nudda: â€%s†är inte nÃ¥got giltigt arkiv" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "nudda: medlemmen â€%s†finns inte i â€%sâ€" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "nudda: Felaktig returkod frÃ¥n ar_member_touch pÃ¥ â€%sâ€" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"lbr$set_module() misslyckades med att extrahera modulinformation, status = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() misslyckades och gav status = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "kan inte öppna biblioteket â€%s†för att slÃ¥ upp medlemmen â€%sâ€" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Medlem â€%sâ€%s: %ld byte vid %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (namnet kan vara avkortat)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, flaggor = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Receptet har för mÃ¥nga rader (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Avbrott.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Arkivmedlemmen â€%s†kan vara felaktig; ej borttagen" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Arkivmedlemmen â€%s†kan vara felaktig; ej borttagen" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Tar bort filen â€%sâ€" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Tar bort filen â€%sâ€" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# recept att utföra" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (inbyggd):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (frÃ¥n â€%sâ€, rad %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Kataloger\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: kunde inte ta status.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (nyckel %s, mtid %d): kunde inte öppnas.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (enhet %d, inod [%d,%d,%d]): kunde inte öppnas.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (enhet %ld, inod %ld): kunde inte öppnas.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (nyckel %s, mtid %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (enhet %d, inod [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (enhet %ld, inod %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Inga" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " filer, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "inga" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " omöjligheter" + +#: dir.c:1068 +msgid " so far." +msgstr " hittills." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " omöjligheter i %lu kataloger.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Den rekursiva variabeln â€%s†hänvisar till sig själv (sÃ¥ smÃ¥ningom)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "oavslutad variabelreferens" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Recept angavs för filen â€%s†pÃ¥ %s:%lu," + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Recept för filen â€%s†hittades genom sökning efter implicit regel," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "men â€%s†anses nu vara samma fil som â€%sâ€." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" +"Kommer att bortse frÃ¥n recept för â€%s†till förmÃ¥n för det som gäller â€%sâ€." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "kan inte ändra namn frÃ¥n enkelkolon â€%s†till dubbelkolon â€%sâ€" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "kan inte ändra namn frÃ¥n dubbelkolon â€%s†till enkelkolon â€%sâ€" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Tar bort mellanfilen â€%sâ€" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Tar bort mellanfiler …\n" + +#: file.c:811 +msgid "Current time" +msgstr "Nuvarande tid" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tidsvärde utanför gränser; ersätter med %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Inte ett mÃ¥l:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Värdefull fil (nödvändig för .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# LÃ¥tsasmÃ¥l (nödvändig för .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# KommandoradsmÃ¥l." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" +"# En standardmakefil, eller enligt MAKEFILES, eller en -include/sinclude-" +"makefil." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# Inbyggd regel" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Implicit regelsökning har genomförts." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Implicit regelsökning har inte genomförts." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Implicit/statisk mönsterstam: â€%sâ€\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Filen är ett övergÃ¥ende beroende." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Skapar ocksÃ¥:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Ändringstiden har inte kontrollerats." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Filen finns inte." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Filen är mycket gammal." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Senast ändrad %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Filen har uppdaterats." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Filen har inte uppdaterats." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Recept körs just nu (DETTA ÄR ETT FEL)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Beroenderecept körs (DETTA ÄR ETT FEL)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Uppdateringen lyckades." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Behöver uppdateras (-q har angivits)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Uppdateringen misslyckades." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Ogiltigt värde i medlemmen â€command_stateâ€!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Filer" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistik för filhashtabell:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: Fältet â€%s†cachas inte: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "icke-numeriskt första argument till funktionen â€wordâ€" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "det första argumentet till funktionen â€word†mÃ¥ste vara större än 0" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "icke-numeriskt första argument till funktionen â€wordlistâ€" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "icke-numeriskt andra argument till funktionen â€wordlistâ€" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) misslyckades (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(Fel) misslyckades (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() misslyckades (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() misslyckades\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Städar bort tillfällig satsfil %s\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "öppna: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "skriv: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "Felaktig filÃ¥tgärd: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "otillräckligt antal argument (%d) till funktionen â€%sâ€" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "ej implementerat pÃ¥ denna plattform: funktionen â€%sâ€" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "oavslutat funktionsanrop â€%sâ€: â€%c†saknas" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "Tomt funktionsnamn\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Felaktigt funktionsnamn: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Funktionsnamnet är för lÃ¥ngt: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "Felaktigt minsta antal argument (%d) till funktionen â€%sâ€\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "Felaktigt största antal argument (%d) till funktionen â€%sâ€\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: flaggan â€%s†är tvetydig\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: flaggan â€--%s†tar inget argument\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: flaggan â€%c%s†tar inget argument\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: flaggan â€%s†kräver ett argument\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: okänd flagga â€--%sâ€\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: okänd flagga â€%c%sâ€\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: otillÃ¥ten flagga -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ogiltig flagga -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: flaggan kräver ett argument -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: flaggan â€-W %s†är tvetydig\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: flaggan â€-W %s†tar inget argument\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Expanderar â€%sâ€\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Evaluerar â€%sâ€\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "kan inte allokera %lu byte för hashtabell: minnet slut" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Fyllnadsgrad=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Omhash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Kollisioner=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Letar efter en implicit regel för â€%sâ€.\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Letar efter en implicit regel för arkivmedlemmen â€%sâ€.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Undviker rekursion orsakad av implicit regel.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Stammen är för lÃ¥ng: â€%.*sâ€.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Prövar mönsterregel med stammen â€%.*sâ€.\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Avvisar den omöjliga regelförutsättningen â€%sâ€.\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Avvisar den omöjliga implicita förutsättningen â€%sâ€.\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Prövar det regelförutsättningen â€%sâ€.\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Prövar den implicita förutsättningen â€%sâ€.\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Hittade förutsättningen â€%s†som VPATH â€%sâ€\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Letar efter en regel med mellanfilen â€%sâ€.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Kan inte skapa en temporärfil\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (minnesdump)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (ignoreras)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: receptet för mÃ¥let â€%s†misslyckades" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Fel %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Fel 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s]: %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Inväntar oavslutade jobb..." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Levande barnprocess %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (fjärr)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Inhöstar misslyckad barnprocess: %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Inhöstar lyckad barnprocess: %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Städar bort tillfällig satsfil %s\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Bortstädning av tillfällig satsfil %s misslyckades (%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Tar bort barnprocessen %p PID %s%s frÃ¥n kedjan.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "släpp jobbserversemafor: (Fel %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Frigjorde symbol för barnprocessen %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "skriver till jobbserver" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() misslyckades med processtart (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Räknade till %d argument vid misslyckad start\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "För upp barnprocessen %p (%s) PID %s%s pÃ¥ kedjan.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "väntan pÃ¥ semafor eller barnprocess: (Fel %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Erhöll symbol för barnprocessen %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "läser frÃ¥n jobbledning" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: mÃ¥let â€%s†finns inte" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: uppdatera mÃ¥let â€%s†pÃ¥ grund av: %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "kan inte upprätthÃ¥lla lastbegränsningar i detta operativsystem" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "kan inte upprätthÃ¥lla lastbegränsning: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "inga fler filhandtag: kunde inte duplicera standard in\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "inga fler filhandtag: kunde inte duplicera standard ut\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "inga fler filhandtag: kunde inte duplicera standard fel\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Kunde inte Ã¥terställa standard in\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Kunde inte Ã¥terställa standard ut\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Kunde inte Ã¥terställa standard fel\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make inhöstade barn-pid %s, inväntar fortfarande pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Kommandot hittades inte" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Skalprogrammet hittades inte" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: miljöutrymmet kanske är slut" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL ändrades (var â€%sâ€, är nu â€%sâ€)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Skapar tillfällig satsfil %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"SatsfilinnehÃ¥ll:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"SatsfilinnehÃ¥ll:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (rad %d) Felaktigt skalsammanhang (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "-O[TYP] (--output-sync[=TYP]) är inte konfigurerat för detta bygge." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Misslyckades att öppna den globala symboltabellen: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Laddat objekt %s är inte deklarerat att vara GPL-kompatibelt" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Misslyckades att ladda symbolen %s frÃ¥n %s: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Tomt symbolnamn för laddning: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Laddar symbol %s frÃ¥n %s\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "Operationen â€load†stödjs inte pÃ¥ denna plattform." + +#: main.c:313 +msgid "Options:\n" +msgstr "Flaggor:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoreras av kompatibilitetsskäl.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Bygg ovillkorligen alla mÃ¥l.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Skriv ut massor av felsökningsinformation.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGGOR] Skriv ut olika sorters " +"felsökningsinformation.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Miljövariabler Ã¥sidosätter makefiler.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr " --eval=STRÄNG Evaluera STRÄNG som en makefile-sats.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Skriv ut detta meddelande och avsluta.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignorera fel frÃ¥n recept.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Fortsätt även om vissa mÃ¥l inte kan skapas.\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +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" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Skriv ut makes interna databas.\n" + +#: main.c:360 +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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Inaktivera de inbyggda implicita reglerna.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Inaktivera de inbyggda " +"variabelinställningarna.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Ã…terge inte recept.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Stäng av -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Nydatera mÃ¥l i stället för att Ã¥terskapa dem.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace Skriv spÃ¥rningsinformation.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Skriv ut makes versionsnummer och avsluta.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Skriv ut aktuell katalog.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "en tom sträng är ett ogiltigt filnamn" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "okänd felsökningsnivÃ¥ â€%s†angiven" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "okänd typ av utmatningssynkronisering â€%sâ€" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Avbrott/Undantag fÃ¥ngat (kod = 0x%lx, adress = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Ã…tkomstförseelse: skrivinstruktion pÃ¥ adressen 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Ã…tkomstförseelse: läsinstruktion pÃ¥ adressen 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() ger default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "sökvägen för find_and_set_shell() gav default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s suspenderas i 30 sekunder..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "färdig med sleep(30). Fortsätter.\n" + +#: main.c:1527 +#, 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)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Jobbserverklient (semafor %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "internt fel: ogiltig sträng â€--jobserver-fds†â€%sâ€" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Jobbserverklient (fb %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "varning: -jN framtvingat i del-make: inaktiverar jobbserverläge." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "duplicerar jobbserver" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"varning: jobbserver otillgänglig: använder -j1. Lägg till â€+†i " +"föräldraregeln." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefil frÃ¥n standard in angavs dubbelt." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (temporärfil)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (temporärfil)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Parallella jobb (-j) stöds inte pÃ¥ denna plattform." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Ã…terställer till enkeljobbsläge (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Jobbserfacj begränsat till %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "skapar jobbserversemafor: (Fel %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "skapar jobbledning" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "iordningställer ledning till jobbserver" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Symboliska länkar stöds inte: inaktiverar -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Uppdaterar makefiler...\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Makefilen â€%s†kan loopa; Ã¥terskapas inte.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Misslyckades med att Ã¥terskapa makefilen â€%sâ€." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Den inkluderade makefilen â€%s†fanns inte." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Makefilen â€%s†fanns inte" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Kunde inte Ã¥tergÃ¥ till ursprungskatalogen." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Utför pÃ¥ nytt[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "avlänka (temporärfil): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL innehÃ¥ller fler än ett mÃ¥l" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Inga mÃ¥l angavs och ingen makefil hittades" + +#: main.c:2511 +msgid "No targets" +msgstr "Inga mÃ¥l" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Uppdaterar slutmÃ¥l...\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"varning: Klockförskjutning upptäckt. Bygget kan ha blivit ofullständigt." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Användning: %s [flaggor] [mÃ¥l] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Detta program byggdes för %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Detta program byggdes för %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Anmäl fel till .\n" +"Skicka synpunkter pÃ¥ översättningen till .\n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "flaggan â€%s%s†kräver ett strängargument som inte är tomt" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "flaggan â€-%c†kräver ett positivt heltal som argument" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sByggt för %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sByggt för %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make-databas, utskriven %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Färdigställde Make-databas %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Okänt fel %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: användare %lu (verklig %lu), grupp %lu (verklig %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Ã…tkomst inledd" + +#: misc.c:622 +msgid "User access" +msgstr "AnvändarÃ¥tkomst" + +#: misc.c:670 +msgid "Make access" +msgstr "Make-Ã¥tkomst" + +#: misc.c:704 +msgid "Child access" +msgstr "BarnÃ¥tkomst" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: GÃ¥r till en okänd katalog\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Lämnar en okänd katalog\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: GÃ¥r till katalogen â€%sâ€\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Lämnar katalogen â€%sâ€\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: GÃ¥r till en okänd katalog\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Lämnar en okänd katalog\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: GÃ¥r till katalogen â€%sâ€\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Lämnar katalogen â€%sâ€\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "skrivfel: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Stannar.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Läser makefiler...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Läser makefilen â€%sâ€" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (inget standardmÃ¥l)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (sökväg)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (oviktigt)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ingen ~-expansion)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "Hoppar över UTF-8-BOM i makefilen â€%sâ€\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Hoppar över UTF-8-BOM i makefile-buffert\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "ogiltig syntax i villkorssats" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: misslyckades att ladda" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "recept inleds före första mÃ¥let" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "regel saknas före recept" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (var avsikten TAB i stället för 8 mellanslag?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "separator saknas%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "mÃ¥lmönster saknas" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "flera mÃ¥lmönster" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "mÃ¥lmönstret innehÃ¥ller inget â€%%â€" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "â€endif†saknas" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "tomt variabelnamn" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "överflödig text efter direktivet â€defineâ€" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "â€endef†saknas, oavslutad â€defineâ€" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "överflödig text efter direktivet â€endefâ€" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "överflödig text efter direktivet â€%sâ€" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "överflödigt â€%sâ€" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "endast ett â€else†per villkor" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Felformad mÃ¥lberoende variabeldefinition" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "beroenden kan inte definieras i recept" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "blandade implicita regler och statiska mönsterregler" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "blandade implicita regler och normala regler" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "mÃ¥let â€%s†motsvarar inte mÃ¥lmönstret" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "mÃ¥lfilen â€%s†har bÃ¥de poster med : och ::" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "mÃ¥let â€%s†anges flera gÃ¥nger i samma regel" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "varning: Ã¥sidosätter recept för mÃ¥let â€%sâ€" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "varning: ignorerar gammalt recept för mÃ¥let â€%sâ€" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "blandade implicita regler och normala regler" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "varning: NUL-tecken upptäckt, bortser frÃ¥n resten av raden" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Inget behöver göras för â€%sâ€." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "â€%s†är aktuell." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Beskär filen â€%sâ€.\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sIngen regel för att skapa mÃ¥let â€%sâ€, som behövs av â€%sâ€%s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sIngen regel för att skapa mÃ¥let â€%sâ€%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Överväger mÃ¥lfilen â€%sâ€.\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Misslyckades nyligen med att uppdatera filen â€%sâ€.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Filen â€%s†har redan övervägts.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Uppdaterar fortfarande filen â€%sâ€.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Slutförde uppdaterandet av filen â€%sâ€.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Filen â€%s†finns inte.\n" + +#: remake.c:495 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** Varning: .LOW_RESOLUTION_TIME-filen â€%s†har en högupplöst tidsstämpel" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Hittade en implicit regel för â€%sâ€.\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Hittade ingen implicit regel för â€%sâ€.\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Använder standardrecept för â€%sâ€.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Det cirkulära beroendet %s <- %s släpptes." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Avslutade förutsättningarna för mÃ¥lfilen â€%sâ€.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Förutsättningarna för â€%s†skapas.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Ger upp med mÃ¥lfilen â€%sâ€.\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "MÃ¥let â€%s†återskapades inte pÃ¥ grund av fel." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Förutsättningen â€%s†för mÃ¥let â€%s†är endast ordning.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Förutsättningen â€%s†för mÃ¥let â€%s†finns inte.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Förutsättningen â€%s†är nyare än mÃ¥let â€%sâ€.\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Förutsättningen â€%s†är äldre än mÃ¥let â€%sâ€.\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "MÃ¥let â€%s†är dubbelkolon och har inga förutsättningar.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "Inget recept för â€%s†och inga förutsättningar har förändrats.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Skapar â€%s†pÃ¥ grund av flaggan always-make.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Inget behov att Ã¥terskapa mÃ¥let â€%sâ€" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; använder VPATH-namnet â€%sâ€" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "MÃ¥ste Ã¥terskapa mÃ¥let â€%sâ€.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Bortser frÃ¥n VPATH-namnet â€%sâ€.\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Receptet för â€%s†körs.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Misslyckades med att Ã¥terskapa mÃ¥lfilen â€%sâ€.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Ã…terskapade mÃ¥lfilen â€%sâ€.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "MÃ¥lfilen â€%s†behöver Ã¥terskapas med -q.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Använder standardkommandon för â€%sâ€.\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Varning: Filen â€%s†har ett ändringstid i framtiden" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Varning: Filen â€%s†har en ändringstid %s s i framtiden" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS-elementet â€%s†är inte ett mönster" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs kommer inte att exportera %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Implicita regler" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Inga implicita regler." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u implicita regler, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " slutregler." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FEL: num_pattern_rules är felaktigt! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "okänd signal" + +#: signame.c:92 +msgid "Hangup" +msgstr "Avringd" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Avbrott" + +#: signame.c:98 +msgid "Quit" +msgstr "Avslutad" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "OtillÃ¥ten instruktion" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "SpÃ¥rningsfälla" + +#: signame.c:109 +msgid "Aborted" +msgstr "Avbruten" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IO-fälla" + +#: signame.c:115 +msgid "EMT trap" +msgstr "Emulatorfälla" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Flyttalsundantag" + +#: signame.c:121 +msgid "Killed" +msgstr "Dödad" + +#: signame.c:124 +msgid "Bus error" +msgstr "Bussfel" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Segmenteringsfel" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Felaktigt systemanrop" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Ledningsbrott" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Alarmklocka" + +#: signame.c:139 +msgid "Terminated" +msgstr "Avslutad" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Användarsignal 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Användarsignal 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Barn avslutades" + +#: signame.c:156 +msgid "Power failure" +msgstr "Strömavbrott" + +#: signame.c:159 +msgid "Stopped" +msgstr "Stoppades" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Stoppades (tty-läsning)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Stoppades (tty-utskrift)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Stoppades (signal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU-tidsgräns överskreds" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Filstorleksgräns överskreds" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Virtuellt tidur löpte ut" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Profileringstidur löpte ut" + +#: signame.c:186 +msgid "Window changed" +msgstr "Fönster ändrat" + +#: signame.c:189 +msgid "Continued" +msgstr "Fortsatte" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "BrÃ¥dskande I/O-läge" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "I/O-tillfälle" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Miste resurs" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Farosignal" + +#: signame.c:217 +msgid "Information request" +msgstr "Informationsbegäran" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Flyttalsprocessor inte tillgänglig" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Inga strcache-buffertar\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s aktuell buf: storlek = %hu B / använt = %hu B / antal = %hu / snitt = %hu " +"B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s annat använt: totalt = %lu B / antal = %lu / snitt = %lu B\n" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" +"%s annat ledigt: totalt = %lu B / max = %lu B / min = %lu B / snitt = %hu B\n" + +#: strcache.c:287 +#, 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" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# statistik för hashtabell:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "automatisk" + +#: variable.c:1602 +msgid "default" +msgstr "normal" + +#: variable.c:1605 +msgid "environment" +msgstr "miljö" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefil" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "miljö enligt -e" + +#: variable.c:1614 +msgid "command line" +msgstr "kommandorad" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "â€overrideâ€-direktiv" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (frÃ¥n â€%sâ€, rad %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# statistik för variabelmängd-hashtabell:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabler\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Mönsterspecifika variabelvärden" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Inga mönsterspecifika variabelvärden." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u mönsterspecifika variabelvärden" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "varning: odefinierad variabel â€%.*sâ€" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() misslyckades med %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Varning: Tom omdirigering\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "internt fel: â€%s†command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-varning, CTRL-Y-hantering kanske behöver Ã¥terställas frÃ¥n DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "INBYGGT [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "INBYGGT CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "INBYGGT CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Okänt inbyggt kommando \"%s\"\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Fel, tomt kommando\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Inkanal omdirigerad till %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Felkanal omdirigerad till %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Lägg till utdata till %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Utkanal omdirigerad till %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Lägg till %.*s och rensa upp\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Utför %s i stället\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Fel vid avknoppning, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-sökvägar\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Inga â€vpathâ€-sökvägar." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u â€vpathâ€-sökvägar.\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Ingen allmän sökväg (enligt â€VPATHâ€-variabeln)." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Allmän sökväg (enligt â€VPATHâ€-variabeln):\n" +"# " + +#~ msgid "internal error: multiple --sync-mutex options" +#~ msgstr "internt fel: flera flaggor â€--sync-mutexâ€" + +#~ msgid "internal error: multiple --jobserver-fds options" +#~ msgstr "internt fel: flera \"--jobserver-fds\"-flaggor" + +#~ msgid "virtual memory exhausted" +#~ msgstr "virtuellt minne uttömt" + +#~ msgid "write error" +#~ msgstr "skrivfel" + +#~ msgid "BUILTIN RM %s\n" +#~ msgstr "INBYGGT RM %s\n" diff --git a/po/tr.gmo b/po/tr.gmo new file mode 100644 index 0000000..6a3ede8 Binary files /dev/null and b/po/tr.gmo differ diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000..79aa807 --- /dev/null +++ b/po/tr.po @@ -0,0 +1,2396 @@ +# Turkish translations for GNU Make messages. +# Copyright (C) 2006 Free Software Foundation, Inc. +# Nilgün Belma Bugüner , 2001, ..., 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\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-Generator: KBabel 1.9.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "desteklenmeyen özelliÄŸi kullanmaya çalışıyor: `%s'" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "VMS'de iÅŸe yaramayan arÅŸiv üyesine dokunup geçiyor" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "Dokunulup geçildi: ArÅŸiv `%s' yok" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "Dokunulup geçildi: `%s' geçerli bir arÅŸiv deÄŸil" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "Dokunulup geçildi: Ãœye `%s', `%s' içinde yok" + +#: ar.c:164 +#, fuzzy, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "Dokunulup geçildi: `%s' deki ar_member_touch'dan dönen kod hatalı" + +#: arscan.c:124 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module modül bilgisini çıkarırken baÅŸarısız oldu, durum = %d" + +#: arscan.c:230 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control durum =%d ile baÅŸarısız oldu" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "`%s' kaynakçası `%s' üyesine bakmak için açılamadı" + +#: arscan.c:944 +#, fuzzy, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Ãœye `%s'%s: %ld bayt %ld 'de (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr "(isim kırpılmış olmalı)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Tarih %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " Kull-kim = %d, Grup-kim = %d, kip = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Bırakıldı.\n" + +#: commands.c:629 +#, fuzzy, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] ArÅŸiv üyesi `%s' sahte olabilir; silinmedi" + +#: commands.c:633 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** ArÅŸiv üyesi `%s' sahte olabilir; silinmedi" + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] `%s' dosyası siliniyor" + +#: commands.c:649 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** `%s' dosyası siliniyor" + +#: commands.c:685 +#, fuzzy +msgid "# recipe to execute" +msgstr "# çalıştırma komutları" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (paket içinde):" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (`%s'den, satır %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Dizin\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: durumlanamadı.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (anahtar (key) %s, deÄŸiÅŸiklik tarihi (mtime) %d): açılamadı.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (aygıt %d, i-düğüm [%d,%d,%d]): açılamadı.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (aygıt %ld, i-düğüm %ld): açılamadı.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (anahtar (key) %s, deÄŸiÅŸiklik tarihi (mtime) %d):" + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (aygıt %d, i-düğüm [%d,%d,%d]):" + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (aygıt %ld, i-düğüm %ld):" + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Hayır" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " dosyaları," + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "hayır" + +#: dir.c:1064 +msgid " impossibilities" +msgstr "olanaksızlıklar" + +#: dir.c:1068 +msgid " so far." +msgstr " çok uzak." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " %lu dizinde olanaksızlıklar.\n" + +#: expand.c:125 +#, fuzzy, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Çevrimsel deÄŸiÅŸken `%s' tekrar kendine bağıntılı (sonuçta)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "sonlandırılmamış deÄŸiÅŸken bağıntısı" + +#: file.c:271 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "`%s' dosyası için komutlar %s:%lu de belirtildi," + +#: file.c:276 +#, fuzzy, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "`%s' dosyası için komutlar örtük kural aramasında bulundu," + +#: file.c:280 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "fakat `%s' ÅŸimdi `%s' dosyası ile aynı dosya olarak düşünülmeli." + +#: file.c:283 +#, fuzzy, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "`%s' dosyası için komutlar `%s' lehine yoksayılmış olacak." + +#: file.c:303 +#, fuzzy, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "tek-sütun `%s', çift-sütun `%s' olarak yeniden adlandırılamaz" + +#: file.c:309 +#, fuzzy, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "çift-sütun `%s', tek-sütun `%s' olarak yeniden adlandırılamaz" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Aracı dosya `%s' siliniyor" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Aracı dosyalar siliniyor...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Åžu an" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tarih damgası kapsamdışı; yerine %s kullanılıyor" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Bir hedef deÄŸil:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Kıymetli dosya (.PRECIOUS önceden gerekliliÄŸi)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Sahte hedef (.PHONY önceden gerekliliÄŸi)." + +#: file.c:964 +#, fuzzy +msgid "# Command line target." +msgstr "# Komut-satırı hedefi." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Bir öntanımlı,MAKEFILES veya -include/sinclude makefile." + +#: file.c:968 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# Örtük kural yok." + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Örtük kural araÅŸtırması yapılmıştı." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Örtük kural araÅŸtırması yapılmamıştı." + +#: file.c:973 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Örtük/deÄŸiÅŸmeyen kalıp kökü: `%s'\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "" +"# Orta seviyede önceden gerekli bir dosya (öncelikle gerekli dosyalara " +"aracılık eden dosya)" + +#: file.c:979 +msgid "# Also makes:" +msgstr "# OluÅŸtursa da:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# DeÄŸiÅŸiklik zamanı hiç kontrol edilmedi." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Dosya yok." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Dosya çok eski." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Son deÄŸiÅŸiklik tarihi %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Dosya güncelleÅŸtirilmiÅŸti." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Dosya güncelleÅŸtirilmemiÅŸti." + +#: file.c:1001 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Komutlar ÅŸu an iÅŸlemlerini sürdürüyor (BU BÄ°R YAZILIM HATASI)." + +#: file.c:1004 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" +"# Bağımlılıkların komutları iÅŸlemlerini sürdürüyor (BU BÄ°R YAZILIM HATASI)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Tamamen güncellendi." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# GüncellenmiÅŸ olması gerekir (-q verildi)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# GüncellenmiÅŸ olamadı." + +#: file.c:1025 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# `command_state' üyesinde geçersiz deÄŸer!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Dosyalar" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# dosyaların hash tablosu durumları:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "`word' iÅŸlevinde sayısal olmayan ilk argüman" + +#: function.c:785 +#, fuzzy +msgid "first argument to 'word' function must be greater than 0" +msgstr "`word' iÅŸlevinin ilk argümanı sıfırdan büyük olmalı" + +#: function.c:805 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "`wordlist' iÅŸlevinde sayısal olmayan ilk argüman" + +#: function.c:807 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "`wordlist' iÅŸlevinde sayısal olmayan ikinci argüman" + +#: function.c:1499 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) baÅŸarısız (e=%ld)\n" + +#: function.c:1523 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) baÅŸarısız (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() baÅŸarısız (e=%ld)\n" + +#: function.c:1538 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() baÅŸarısız\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Geçici komut-listesi (batch) dosyası %s temizleniyor\n" + +#: function.c:2193 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: function.c:2203 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "yazma hatası: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "argüman sayısı (%d) `%s' iÅŸlevinde yetersiz" + +#: function.c:2336 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "bu platformda gerçekleÅŸtirilmemiÅŸ: iÅŸlev `%s'" + +#: function.c:2399 +#, fuzzy, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "`%s' iÅŸlemine çaÄŸrı sonlandırılmamış: `%c' kayıp" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "argüman sayısı (%d) `%s' iÅŸlevinde yetersiz" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "argüman sayısı (%d) `%s' iÅŸlevinde yetersiz" + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: `%s' seçeneÄŸi belirsiz\n" + +#: getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: `--%s' seçeneÄŸi argümansız kullanılır\n" + +#: getopt.c:688 +#, fuzzy, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: seçenek `%c%s' argümansız kullanılır\n" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: `%s' seçeneÄŸi bir argümanla kullanılır\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: `--%s' seçeneÄŸi bilinmiyor\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: `%c%s' seçeneÄŸi bilinmiyor\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: kuraldışı seçenek -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: geçersiz seçenek -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: seçenek bir argümanla kullanılır -- %c\n" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: `-W %s' seçeneÄŸi belirsiz\n" + +#: getopt.c:862 +#, fuzzy, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: `-W %s' seçeneÄŸi argümansız kullanılır\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "hash tablosu için %ld bayt ayrılamıyor: bellek tükendi" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Yük=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Çakışmalar=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "`%s' için bir örtük kural arıyor.\n" + +#: implicit.c:54 +#, fuzzy, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "`%s' için arÅŸiv-üyesi örtük kural arıyor.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Örtük kural çevrimi görmezden geliniyor.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, fuzzy, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "`%.*s' köküyle kalıp kuralı deneniyor.\n" + +#: implicit.c:697 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Kural önceden gerekliliÄŸi `%s' olanaksız olduÄŸundan reddediliyor.\n" + +#: implicit.c:698 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Örtük önceden gereklilik `%s' olanaksız olduÄŸundan reddediliyor.\n" + +#: implicit.c:711 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Kural önceden gerekliliÄŸi `%s' deneniyor.\n" + +#: implicit.c:712 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Örtük önceden gereklilik `%s' deneniyor.\n" + +#: implicit.c:751 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Önceden gereklilik `%s' VPATH `%s' olarak bulundu.\n" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Aracı dosya `%s' ile bir kural arıyor.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Bir geçici dosya oluÅŸturulamıyor\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (bellek kopyası - core dosyası - diske yazıldı)" + +#: job.c:488 +#, fuzzy +msgid " (ignored)" +msgstr "[%s] Hata %d (yoksayıldı)" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (paket içinde):" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "" + +#: job.c:516 job.c:524 +#, fuzzy, c-format +msgid "%s[%s] Error %d%s" +msgstr "*** [%s] Hata %d" + +#: job.c:519 +#, fuzzy, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "*** [%s] Hata 0x%x" + +#: job.c:529 +#, fuzzy, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s%s: %s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** BitmemiÅŸ iÅŸler için bekliyor...." + +#: job.c:651 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Ast dosya iÅŸini sürdürüyor: 0x%08lx (%s) PID %ld %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (karşıdan)" + +#: job.c:841 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Kaybeden ast dosya saÄŸlanıyor: 0x%08lx PID %ld %s\n" + +#: job.c:842 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Kazanan ast dosya saÄŸlanıyor: 0x%08lx PID %ld %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Geçici komut-listesi dosyası %s temizleniyor\n" + +#: job.c:855 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Geçici komut-listesi dosyası %s temizleniyor\n" + +#: job.c:961 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Ast 0x%08lx PID %ld%s zincirden kaldırılıyor\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Ast 0x%08lx (%s) için simge (token) kullanıma sunuldu.\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "iÅŸ-sunucusu yazıyor" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "Süreci baÅŸlatacak process_easy() baÅŸarısız oldu (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, 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" + +#: job.c:1735 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Ast 0x%08lx (%s) PID %ld%s zincire konuluyor.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Ast 0x%08lx (%s) için simge (token) saÄŸlandı.\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "görev listesi okunuyor" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "Dokunulup geçildi: ArÅŸiv `%s' yok" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "" +"%sHedef `%s' i derlemek için hiçbir kural yok, `%s' tarafından gereksinim " +"duyuluyor%s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "iÅŸletim sisteminde yük sınırlarına ulaşılamadı " + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "ulaşılamayan yük sınırı: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "baÅŸka dosya tutucu yok: standart girdi kopyalanamadı\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "baÅŸka dosya tutucu yok: standart çıktı kopyalanamadı\n" + +#: job.c:2278 +#, fuzzy +msgid "no more file handles: could not duplicate stderr\n" +msgstr "baÅŸka dosya tutucu yok: standart girdi kopyalanamadı\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Standart girdi eski haline getirilemedi\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Standart çıktı eski haline getirilemedi\n" + +#: job.c:2309 +#, fuzzy +msgid "Could not restore stderr\n" +msgstr "Standart girdi eski haline getirilemedi\n" + +#: job.c:2420 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make %ld pid'li ast süreci kaldırdı ama hala pid %ld için bekliyor\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Komut bulunamadı" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Kabuk uygulaması bulunamadı" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: ortam alanı tükenmiÅŸ olabilir" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL deÄŸiÅŸti (`%s' idi, ÅŸimdi `%s')\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "%s geçici komut-liste dosyasını oluÅŸturuyor\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (satır %d) kabuk baÄŸlamı hatalı (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +#, fuzzy +msgid "The 'load' operation is not supported on this platform." +msgstr "Bu platformda paralel iÅŸler (-j) desteklenmiyor." + +#: main.c:313 +msgid "Options:\n" +msgstr "Seçenekler:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Uyumluluk için yoksayıldı.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Tüm hedefler koÅŸulsuz olarak oluÅŸturulur.\n" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr " -C DÄ°ZÄ°N, --directory=DIZIN BirÅŸey yapmadan önce DÄ°ZÄ°Ne geçilir.\n" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -b, -m Bir sürü hata ayıklama bilgisi basar.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=SEÇENEKLER] ÇeÅŸitli türde hata ayıklama bilgileri basar.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides Ortam deÄŸiÅŸkenleri makefile'ları deÄŸiÅŸtirir.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Bu iletiyi basar ve çıkar.\n" + +#: main.c:335 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Komutların ürettiÄŸi hataları yoksayar.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Bazı hedefler yapılmadığında devam eder.\n" + +#: main.c:344 +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" + +#: main.c:347 +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" + +#: main.c:349 +#, 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" + +#: main.c:352 +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" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base make'in içsel veritabanını basar.\n" + +#: main.c:360 +#, 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" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules OluÅŸumiçi örtük kuralları etkisizleÅŸtirir.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables OluÅŸumiçi deÄŸiÅŸken ayarlarını etkisizleÅŸtirir\n" + +#: main.c:366 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Komutlar iÅŸlenirken gösterilmez.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop Bazı hedefler yapılmadığında devam etmez.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Yeniden derlemek yerine hedeflere bakıp " +"geçer.\n" + +#: main.c:373 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr " -b, -m Bir sürü hata ayıklama bilgisi basar.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version make sürüm numarasını basar ve çıkar.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Kullanılan dizini basar.\n" + +#: main.c:379 +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" + +#: main.c:381 +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" + +#: main.c:384 +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" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "dosyaismi olarak boÅŸ dizge geçersiz" + +#: main.c:737 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "Hata ayıklama düzeyi özelliÄŸi `%s' bilinmiyor" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Kesinti/OlaÄŸandışı durum saptandı (kod = 0x%lx, adres = 0x%lx)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "EriÅŸim uyumsuzluÄŸu: %lx adresinde yazma iÅŸlemi\n" + +#: main.c:844 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "EriÅŸim uyumsuzluÄŸu: %lx adresinde okuma iÅŸlemi\n" + +#: main.c:920 main.c:935 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell default_shell = %s olarak belirliyor\n" + +#: main.c:988 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"find_and_set_shell yol aramasını default_shell = %s olarak belirliyor\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s 30 saniyeliÄŸine askıya alınıyor..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) bitti. Devam ediliyor.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: main.c:1534 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "içsel hata: --jobserver-fds dizgesi `%s' geçersiz" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "uyarı: alt derlemede -jN zorlandı: iÅŸ sunucusu kipi kapatılıyor." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "çift iÅŸ sunucusu" + +#: main.c:1570 +#, fuzzy +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"uyarı: iÅŸ sunucusu kullanımdışı: -j1 kullanılıyor. Ãœst make kuralına `+' " +"ekle." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile standart girdiden iki kez belirtildi." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (geçici dosya)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (geçici dosya)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Bu platformda paralel iÅŸler (-j) desteklenmiyor." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Tek iÅŸ kipi (-j1) için make'i baÅŸlatma konumuna alıyor" + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "iÅŸleri yaratıyor" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "iÅŸleri hazırlıyor" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Sembolik baÄŸlar desteklenmiyor: -L iptal ediliyor" + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "makefile'ları güncelliyor...\n" + +#: main.c:2158 +#, fuzzy, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "`%s' make dosyası çevrime girdi; yeniden derlenemez.\n" + +#: main.c:2237 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "`%s' make dosyası yeniden derlenemiyor." + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "İçerilen make dosyası `%s' bulunamadı." + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "`%s' make dosyası bulunamadı" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Geriye, özgün dizine geçilemiyor." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Yeniden çalıştırılıyor[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (geçici dosya): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL bir hedeften fazlasını içeriyor" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Hedefler belirtilmediÄŸinden make dosyası yok" + +#: main.c:2511 +msgid "No targets" +msgstr "Hedef yok" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Amaçlanan hedefler güncelleniyor...\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "uyarı: Clock skew saptandı. Derleme tamamlanamayabilir." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Kullanım: %s [seçenekler] [hedef] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Bu program %s için kurgulanmış\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Bu program %s için kurgulanmış (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Yazılım hatalarını adresine,\n" +"çeviri hatalarını adresine bildiriniz.\n" + +#: main.c:2807 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "`-%c' seçeneÄŸi bir boÅŸ olmayan dizge argüman gerektirir" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "`-%c' seçeneÄŸi bir pozitif tümleyici bağımsız deÄŸiÅŸkenle kullanılır" + +#: main.c:3269 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sBu program %s için derlenmiÅŸ\n" + +#: main.c:3271 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sBu program %s için derlenmiÅŸ (%s)\n" + +#: main.c:3282 +#, 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 "" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make veri tabanı, %s üzerine basıldı" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# %s üzerindeki Make veri tabanı tamamlandı\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Bilinmeyen hata %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: kullanıcı %lu (gerçekte %lu), grup %lu (gerçekte %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Ä°lklendirilmiÅŸ eriÅŸim" + +#: misc.c:622 +msgid "User access" +msgstr "Kullanıcı eriÅŸimi" + +#: misc.c:670 +msgid "Make access" +msgstr "Make eriÅŸimi" + +#: misc.c:704 +msgid "Child access" +msgstr "Asta eriÅŸim" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: bilinmeyen bir dizine giriliyor\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: bilinmeyen dizinden çıkılıyor\n" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: `%s' dizine giriliyor\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: `%s' dizininden çıkılıyor\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Bilinmeyen bir dizine giriliyor\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Bilinmeyen dizinden çıkılıyor\n" + +#: output.c:120 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]:`%s' dizinine giriliyor\n" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: `%s' dizininden çıkılıyor\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "yazma hatası: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Durdu.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Makefile'lar okunuyor...\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "`%s' make dosyası okunuyor" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (öntanımlı amaç yok)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (arama yolu)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (umurunda deÄŸil)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr "( ~ uzantısı yok)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "ÅŸartlı ifade de yazılış hatası" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +#, fuzzy +msgid "recipe commences before first target" +msgstr "komutlar ilk hedeften önce baÅŸlıyor" + +#: read.c:1041 +#, fuzzy +msgid "missing rule before recipe" +msgstr "komutlardan önceki kural kayıp" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr "(8 boÅŸluÄŸu TAB'mı zannettiniz?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "kayıp ayraç%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "hedef kalıp kayıp" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "çok sayıda hedef kalıp" + +#: read.c:1276 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "hedef kalıp `%%' içermiyor" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "`endif' kayıp" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "boÅŸ deÄŸiÅŸken ismi" + +#: read.c:1471 +#, fuzzy +msgid "extraneous text after 'define' directive" +msgstr "`endef' yönergesinden sonraki metin yersiz" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "`endef' kayıp, `define' sonlandırılmamış" + +#: read.c:1524 +#, fuzzy +msgid "extraneous text after 'endef' directive" +msgstr "`endef' yönergesinden sonraki metin yersiz" + +#: read.c:1595 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "`%s' yönergesinden sonraki metin yersiz" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "`%s' yersiz" + +#: read.c:1624 +#, fuzzy +msgid "only one 'else' per conditional" +msgstr "her ÅŸartlı ifade de sadece bir `else'" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Hedefe özgü deÄŸiÅŸken tanımı bozuk" + +#: read.c:1957 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "öngereksinimler komut betiklerinde tanımlanamaz" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "örtük ve duraÄŸan kalıp kuralları karışmış" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "örtük ve normal kurallar karışmış" + +#: read.c:2091 +#, fuzzy, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "hedef `%s' hedef kalıpla eÅŸleÅŸmiyor" + +#: read.c:2106 read.c:2152 +#, fuzzy, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "hedef dosya `%s'hem : hem de :: girdilerine sahip" + +#: read.c:2112 +#, fuzzy, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "hedef `%s' aynı kuralda birden fazla belirtilmiÅŸ." + +#: read.c:2122 +#, fuzzy, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "uyarı: hedef `%s' için komutlar geçersiz kılınıyor" + +#: read.c:2125 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "uyarı: hedef `%s' için eski komutlar yoksayılıyor" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "örtük ve normal kurallar karışmış" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "uyarı: NUL karakteri görüldü; satırın geri kalanı yoksayılıyor" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "`%s' için hiçbir ÅŸey yapılmadı." + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "`%s' güncel" + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "Budanmış dosya `%s'.\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "" +"%sHedef `%s' i derlemek için hiçbir kural yok, `%s' tarafından gereksinim " +"duyuluyor%s" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sHedef `%s' i derlemek için hiçbir kural yok%s" + +#: remake.c:426 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "hedef dosya `%s' hesaba katılıyor.\n" + +#: remake.c:433 +#, fuzzy, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "En son `%s'dosyasının güncellenmesi denendi ve baÅŸarısız oldu.\n" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "`%s' dosyası zaten hesaba katıldı.\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "`%s' dosyası hala güncelleniyor.\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "`%s' dosyasının güncellenmesi tamamlandı.\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "`%s' dosyası yok.\n" + +#: remake.c:495 +#, 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" + +#: remake.c:508 remake.c:1040 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "`%s' için bir örtük kural bulundu.\n" + +#: remake.c:510 remake.c:1042 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "`%s' için bir örtük kural yok.\n" + +#: remake.c:516 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "`%s' için öntanımlı komutlar kullanılıyor.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Çevrimsel %s <- %s bağımlılığı iptal edildi." + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "`%s' hedef dosyasının önceden gereklilikleri tamamlandı.\n" + +#: remake.c:681 +#, fuzzy, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "`%s' için önceden gereklilikler derlenmeye devam ediyor.\n" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "`%s' hedef dosyasında umut kesiliyor.\n" + +#: remake.c:700 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Hedef `%s' hatalardan dolayı yeniden derlenemez." + +#: remake.c:752 +#, fuzzy, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Önceden gerekli `%s' hedef `%s' için ÅŸart.\n" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Hedef `%s' in önceden gereklisi `%s' mevcut deÄŸil.\n" + +#: remake.c:762 +#, fuzzy, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Önceden gerekli `%s' hedef `%s' den daha yeni.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Önceden gerekli `%s' hedef `%s' den daha eski.\n" + +#: remake.c:783 +#, fuzzy, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Hedef `%s' çift-sütunlu ve önceden gereklilikler gerektirmiyor.\n" + +#: remake.c:790 +#, fuzzy, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "`%s' için komutlar ve önceden gerekliliklerde bir deÄŸiÅŸiklik yok.\n" + +#: remake.c:795 +#, fuzzy, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Daima derle seçeneÄŸinden dolayı `%s' derleniyor.\n" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "Hedef `%s' nin yeniden derlenmesine gerek yok" + +#: remake.c:805 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr "; VPATH ismi `%s' kullanılıyor" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "Hedef `%s' yeniden derlenmeli.\n" + +#: remake.c:831 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " VPATH ismi `%s' yoksayılıyor.\n" + +#: remake.c:840 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "`%s' nin komutları çalışmaya devam ediyor.\n" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Hedef dosya `%s' yeniden derlenirken hata oluÅŸtu.\n" + +#: remake.c:850 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Hedef dosya `%s' yeniden derlenmesi baÅŸarıyla tamamlandı.\n" + +#: remake.c:853 +#, fuzzy, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "`%s' hedef dosyasının -q ile yeniden derlenmesi gerekir.\n" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "`%s' için öntanımlı komutlar kullanılıyor.\n" + +#: remake.c:1397 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Uyarı: `%s' dosyası gelecekteki bir deÄŸiÅŸiklik tarihini içeriyor" + +#: remake.c:1411 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Uyarı: `%s' dosyasının deÄŸiÅŸiklik tarihi %.2g s kadar gelecekte" + +#: remake.c:1610 +#, fuzzy, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS elemanı `%s' bir kalıp deÄŸil" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "ÖzelleÅŸtirilmiÅŸ olanlar dışarı aktarılmayacak: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Örtük Kurallar" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Örtük kural yok." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u örtük kural, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " terminal." + +#: rule.c:530 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "YAZILIM HATASI: num_pattern_rules yanlış! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "bilinmeyen sinyal" + +#: signame.c:92 +msgid "Hangup" +msgstr "Tıkanma" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Kesme" + +#: signame.c:98 +msgid "Quit" +msgstr "Çık" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Yönergeler uygun deÄŸil" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Ä°zleme/kesmenoktası yakalayıcı" + +#: signame.c:109 +msgid "Aborted" +msgstr "Ä°ptal edildi" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT tuzağı" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT tuzağı" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Gerçek sayı olaÄŸandışı durumu" + +#: signame.c:121 +msgid "Killed" +msgstr "Süreç durduruldu" + +#: signame.c:124 +msgid "Bus error" +msgstr "Veri yolu hatası" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Parçalama arızası" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Sistem çaÄŸrısı hatalı" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Veri alınamıyor" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Alarm saati" + +#: signame.c:139 +msgid "Terminated" +msgstr "Sonlandırıldı" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Kullanıcı tanımlı sinyal 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Kullanıcı tanımlı sinyal 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Ast bıraktı" + +#: signame.c:156 +msgid "Power failure" +msgstr "Güç kesilmesi" + +#: signame.c:159 +msgid "Stopped" +msgstr "Durduruldu" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Durduruldu (konsol girdisi)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Durduruldu (konsol çıktısı)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Durduruldu (sinyal)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU zaman sınırı aşıldı" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Dosya uzunluÄŸu sınırı aşıldı" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Sanal süreölçer kullanım süresi doldu" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Tanıtım süreölçer kullanım süresi doldu" + +#: signame.c:186 +msgid "Window changed" +msgstr "Pencere boyutları deÄŸiÅŸtirildi" + +#: signame.c:189 +msgid "Continued" +msgstr "Devam ediliyor" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Acil G/Ç koÅŸulu" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "G/Ç mümkün" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Kaynak kaybı" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Tehlike sinyali" + +#: signame.c:217 +msgid "Information request" +msgstr "Bilgi isteÄŸi" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Aritmetik iÅŸlemci kullanılabilir deÄŸil" + +#: strcache.c:236 +#, fuzzy, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "%s dizge belleÄŸi tamponlarının sayısı: %d\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, fuzzy, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s dizge belleÄŸi boyu: toplam = %d / max = %d / min = %d / ort = %d\n" + +#: strcache.c:283 +#, fuzzy, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "%s dizge belleÄŸi boÅŸ: toplam = %d / max = %d / min = %d / ort = %d\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: strcache.c:289 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# dosyaların hash tablosu durumları:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "otomatik" + +#: variable.c:1602 +msgid "default" +msgstr "öntanımlı" + +#: variable.c:1605 +msgid "environment" +msgstr "çevre" + +#: variable.c:1608 +msgid "makefile" +msgstr "derleme dosyası" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "çevre -e altında" + +#: variable.c:1614 +msgid "command line" +msgstr "komut satırı" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "`override' yönergesi" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (`%s'den, satır %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# deÄŸiÅŸken kümesi hash tablosunun durumu:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# DeÄŸiÅŸkenler\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Kalıba özgü DeÄŸiÅŸken DeÄŸerleri" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# ÖrneÄŸe duyarlı deÄŸiÅŸken deÄŸeri yok." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u örneÄŸe duyarlı deÄŸiÅŸken deÄŸeri" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "uyarı: `%.*s' deÄŸiÅŸkeni atanmamış" + +#: vmsfunctions.c:91 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search %d ile baÅŸarısız\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Uyarı: BoÅŸ yönlendirme\n" + +#: vmsjobs.c:183 +#, fuzzy, c-format +msgid "internal error: '%s' command_state" +msgstr "içsel hata: `%s' command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-uyarı, DCL den yönetimi almak için CTRL-Y'yi yeniden " +"etkinleÅŸtirebilirsiniz.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "OLUÅžUMİÇİ [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "OLUÅžUMİÇİ CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "OLUÅžUMİÇİ CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "OluÅŸumiçi komut '%s' bilinmiyor\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Hata, boÅŸ komut\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "%s den yönlendirilmiÅŸ girdi\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "%s e yönlendirilmiÅŸ hata\n" + +#: vmsjobs.c:690 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "%s e yönlendirilmiÅŸ çıktı\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "%s e yönlendirilmiÅŸ çıktı\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s yerine çalıştırılıyor\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "doÄŸum hatası, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Arama yolu\n" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# `vpath' arama yolları yok" + +#: vpath.c:602 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u `vpath' arama yolu.\n" + +#: vpath.c:605 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Genel arama yolu (`VPATH' çevre deÄŸiÅŸkeni) yok." + +#: vpath.c:611 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Genel (`VPATH' çevre deÄŸiÅŸkeni) arama yolu:\n" +"# " + +#~ 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 "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 "internal error: multiple --jobserver-fds options" +#~ msgstr "içsel hata: çok sayıda --jobserver-fds seçeneÄŸi" + +#~ 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 "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 "" +#~ "\n" +#~ "%s # of strings in strcache: %d\n" +#~ msgstr "" +#~ "\n" +#~ "%s dizge belleÄŸindeki dizgelerin sayısı: %d\n" + +#~ 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 RM %s\n" +#~ msgstr "OLUÅžUMİÇİ RM %s\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/po/uk.gmo b/po/uk.gmo new file mode 100644 index 0000000..bfdbf8b Binary files /dev/null and b/po/uk.gmo differ diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..4eefbe0 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,2276 @@ +# Переклад 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. +msgid "" +msgstr "" +"Project-Id-Version: make 4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-10-09 22:15+0300\n" +"Last-Translator: Volodymyr M. Lisivka \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" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Lokalize 1.5\n" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "Ñпроба вжити можливіÑÑ‚ÑŒ, Ñка не підтримуєтьÑÑ: \"%s\"" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу зміни члена архіву неможливо у ÑиÑтемі VMS" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу зміни: Ðрхів \"%s\" не Ñ–Ñнує" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу зміни: Ðевірний архів: \"%s\"" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу зміни: Член \"%s\" не міÑтитьÑÑ Ñƒ \"%s\"" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "" +"Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу зміни: Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ ar_member_touch повернула\n" +"поганий код відповіді Ð´Ð»Ñ \"%s\"" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module() не вдалоÑÑ Ð²Ð¸Ð´Ð¾Ð±ÑƒÑ‚Ð¸ дані модулÑ, Ñтан = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "Помилка lbr$ini_control() з повідомленнÑм Ñтану = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ бібліотеку «%s» Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ елемента «%s»" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Елемент «%s»%s: %ld байтів з %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (ім'Ñ Ð¼Ð¾Ð¶Ðµ бути обрізано)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Дата %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, режим = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "У рецепті забагато Ñ€Ñдків (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Зупинка.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Елемент архіву, «%s», можливо Ñ” фіктивним; не вилучено" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Елемент архіву, «%s», можливо Ñ” фіктивним; не вилучено" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Вилучаємо файл \"%s\"" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Вилучаємо файл \"%s\"" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# ÑпоÑіб, Ñкий Ñлід заÑтоÑувати" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (вбудоване):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (з \"%s\", Ñ€Ñдок %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Каталоги\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: неможливо отримати інформацію (stat).\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (ключ %s, Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ %d): не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (приÑтрій %d, івузол [%d,%d,%d]): неможливо відкрити.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (приÑтрій %ld, івузол %ld): не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (ключ %s, Ñ‡Ð°Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (приÑтрій %d, івузол [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (приÑтрій %ld, івузол %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "ÐÑ–" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " файлів, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "ні" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " недоÑÑжних цілей" + +#: dir.c:1068 +msgid " so far." +msgstr " на поточний момент." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " недоÑÑжних цілей у %lu каталогах.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "РекурÑивна змінна \"%s\" поÑилаєтьÑÑ Ñама на Ñебе (у результаті)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "незавершена поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° змінну" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "СпоÑіб Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° «%s» було задано %s:%lu," + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "" +"СпоÑіб Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° «%s» було знайдено за допомогою пошуку неÑвних правил," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "але \"%s\" Ñ– \"%s\" тепер вважаютьÑÑ Ð¾Ð´Ð½Ð¸Ð¼ Ñ– тим же ж файлом. " + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "СпоÑіб Ð´Ð»Ñ Â«%s» буде проігноровано на кориÑÑ‚ÑŒ ÑпоÑобу Ð´Ð»Ñ Â«%s»." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "" +"неможливо перейменувати \"%s\" з однією двокрапкою у \"%s\" з двома " +"двокрапками" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "" +"неможливо перейменувати \"%s\" з двома двокрапками у \"%s\" з однією " +"двокрапкою" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Вилучаємо проміжний файл «%s»" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "ВидалÑÑŽ проміжні файли...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Поточний чаÑ" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: чаÑова позначка поза допуÑтимим діапазоном; замінюємо на %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Ðе Ñ” метою:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# ВартіÑний файл (залежніÑÑ‚ÑŒ .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# ПÑевдоціль (залежніÑÑ‚ÑŒ .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Мета, що викликаєтьÑÑ Ð· командного Ñ€Ñдка." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Типово, MAKEFILES, або -include/sinclude makefile." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# Вбудоване правило" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Пошук неÑвних правил виконано." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# Пошук неÑвних правил не було виконано." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# ОÑнова неÑвного або Ñтатичного шаблону: \"%s\"\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Файл Ñ” проміжною залежніÑÑ‚ÑŽ." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# Збирає також:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# Ð§Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ ніколи не перевірÑвÑÑ." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Файл не Ñ–Ñнує." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Файл дуже Ñтарий." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# ВоÑтаннє оновлено %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Файл був оновлений." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Файл не було оновлено." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# ВиконуєтьÑÑ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ° (ЦЕ ПОМИЛКÐ)" + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Ці залежноÑÑ‚Ñ– вже оброблÑÑŽÑ‚ÑŒÑÑ (ЦЕ ПОМИЛКÐ)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# УÑпішно оновлено." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Повинно бути оновлено (вÑтановлений ключ -q)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Спроба Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÐµÐ·ÑƒÑпішна." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Ðекоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð»ÐµÐ½Ð° \"command_state\"!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Файли" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# ÑтатиÑтика щодо таблиці хешів файлів:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: поле «%s» не кешовано: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "не чиÑловий перший аргумент Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— \"word\"" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "першим аргументом функції «word» має бути чиÑло, більше за 0" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "не чиÑловий перший аргумент Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— \"wordlist\"" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "не чиÑловий другий аргумент Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— \"wordlist\"" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: помилка DuplicateHandle(In) (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: помилка DuplicateHandle(Err) (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "Помилка CreatePipe() (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): помилка process_init_fd()\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Спорожнюємо тимчаÑовий пакетний файл %s\n" + +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "open: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "write: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "Ðекоректна Ð´Ñ–Ñ Ð½Ð°Ð´ файлом: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "недоÑÑ‚Ð°Ñ‚Ð½Ñ ÐºÑ–Ð»ÑŒÐºÑ–ÑÑ‚ÑŒ аргументів (%d) функції «%s»" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "не реалізовано на цій платформі: Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Â«%s»" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "незавершений виклик функції \"%s\"; пропущено \"%c\"" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "ÐŸÐ¾Ñ€Ð¾Ð¶Ð½Ñ Ð½Ð°Ð·Ð²Ð° функції\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Ðекоректна назва функції: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Ðазва функції Ñ” задовгою: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "Ðекоректна мінімальна кількіÑÑ‚ÑŒ аргументів (%d) функції %s\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "Ðекоректна макÑимальна кількіÑÑ‚ÑŒ аргументів (%d) функції %s\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: параметр «%s» не Ñ” однозначним\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² до параметра «--%s» не передбачено\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² до параметра «%c%s» не передбачено\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: до параметра «%s» Ñлід додати аргумент\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: невідомий параметр «--%s»\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: невідомий параметр «%c%s»\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: невірний параметр -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: невірний параметр -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: параметру необхідний аргумент -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: параметр «-W %s» не Ñ” однозначним\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² до параметра «-W %s» не передбачено\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: розгортаємо «%s»\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: обчиÑлюємо «%s»\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¼Ñ–Ñтити %lu байтів Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– хешів: вичерпано пам’ÑÑ‚ÑŒ" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "ЗавантаженнÑ=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Повторне хешуваннÑ=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Збіги=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Пошук неÑвного правила Ð´Ð»Ñ \"%s\".\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Пошук неÑвного правила Ð´Ð»Ñ Ñ‡Ð»ÐµÐ½Ð° архіву \"%s\".\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Ð—Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ñ€ÐµÐºÑƒÑ€Ñивного виклику неÑвного правила.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Занадто довгий шаблон: «%.*s».\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Спроба заÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° зі зразком, оÑнова \"%.*s\".\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Ð’Ñ–Ð´ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾Ñ— залежноÑÑ‚Ñ– правила «%s».\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Ð’Ñ–Ð´ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾Ñ— неÑвної залежноÑÑ‚Ñ– «%s».\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Пробую залежніÑÑ‚ÑŒ правило \"%s\".\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Пробую неÑвні залежноÑÑ‚Ñ– \"%s\".\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "ВиÑвлено залежніÑÑ‚ÑŒ «%s» у форматі VPATH «%s»\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Пошук правила з проміжним файлом \"%s\".\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Ðе вдалоÑÑ Ñтворити тимчаÑовий файл\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (зроблений дамп пам'ÑÑ‚Ñ–)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (ігноруєтьÑÑ)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "<вбудований>" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: Ñпроба Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ€ÐµÑ†ÐµÐ¿Ñ‚Ð° Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¸ «%s» зазнала невдачі" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Помилка %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Помилка 0x%x%s" + +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð²Ð´Ð°Ð½ÑŒ..." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Ðезавершений дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (віддалений)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Підбираємо невдалий дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð· PID %p %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Підбираємо вдалий дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð· PID %p %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Ð—Ð½Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñового командного файла %s\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "" +"Спроба Ð²Ð¸Ñ‚Ð¸ÐºÐ°Ð½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñового файла пакетної обробки %s зазнала невдачі (%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Вилучаємо PID дочірнього процеÑу %p %s%s з ланцюжка.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "ÑпуÑкаємо Ñемафор Ñервера завдань: (Помилка %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Звільнено Ñимвол Ð´Ð»Ñ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½ÑŒÐ¾Ð³Ð¾ процеÑу %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ Ñервера завдань" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Під Ñ‡Ð°Ñ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾Ð³Ð¾ запуÑку кількіÑÑ‚ÑŒ аргументів дорівнювала %d\n" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Додаємо дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð· PID %p (%s) %s%s до ланцюжка.\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "Ð¾Ñ‡Ñ–ÐºÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñемафора або дочірнього процеÑу: (помилка %ld: %s)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Отримано Ñимвол Ð´Ð»Ñ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½ÑŒÐ¾Ð³Ð¾ процеÑу %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "читаємо запиÑи з потоку завдань" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: мети «%s» не Ñ–Ñнує" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼ÐµÑ‚Ð¸ «%s» з такої причини: %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "" +"Ñ†Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹Ð½Ð° ÑиÑтема не дозволÑÑ” вÑтановлювати Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° завантаженнÑ" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "неможливо вÑтановити Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° завантаженнÑ: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "не виÑтачає файлових деÑкрипторів: не вдалоÑÑ Ð·Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ñ‚Ð¸ stdin\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "не виÑтачає файлових деÑкрипторів: не вдалоÑÑ Ð·Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ñ‚Ð¸ stdout\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "не виÑтачає файлових деÑкрипторів: не вдалоÑÑ Ð·Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ñ‚Ð¸ stderr\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ stdin\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ stdout\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ stderr\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"make підібрано дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð· pid %s, Ñкий вÑе ще чекає на Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ " +"процеÑу з pid %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Команда не знайдена" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Командний процеÑор не знайдений" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: ймовірно, завершилоÑÑ Ð¼Ñ–Ñце у Ñередовищі" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL змінено (було «%s», тепер «%s»)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Створюємо тимчаÑовий пакетний файл %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"ВміÑÑ‚ файла пакетної обробки:\n" +"\t@echo off\n" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"ВміÑÑ‚ пакетного файла:%s\n" +"\t%s\n" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (Ñ€Ñдок %d) Поганий контекÑÑ‚ оболонки (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" +"-O[ТИП] (--output-sync[=ТИП]) Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ ÑеанÑу Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð½Ðµ налаштовано." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ таблицю загальних Ñимволів: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Завантажений об’єкт %s не оголошено Ñк ÑуміÑний з GPL" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ Ñимвол %s з %s: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "ÐŸÐ¾Ñ€Ð¾Ð¶Ð½Ñ Ð½Ð°Ð·Ð²Ð° Ñимволу Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Завантажуємо Ñимвол %s з %s\n" + +#: load.c:244 +msgid "The 'load' operation is not supported on this platform." +msgstr "Ðа цій платформі Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´Ñ–Ñ— «load» не передбачено." + +#: main.c:313 +msgid "Options:\n" +msgstr "Ключі:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m ІгноруєтьÑÑ, Ð´Ð»Ñ ÑуміÑноÑÑ‚Ñ–.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make безумовно оброблÑти вÑÑ– запиÑи мети.\n" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C КÐТÐЛОГ, --directory=КÐТÐЛОГ\n" +" Перейти до каталогу до Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ´ÑŒ-Ñких " +"дій.\n" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d ВивеÑти діагноÑтичні повідомленнÑ.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=ПРÐПОРЦІ] ВивеÑти діагноÑтичні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ñ… " +"типів.\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Змінні Ñередовища мають вищий пріоритет за " +"змінні makefile.\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr " --eval=РЯДОК Обробити РЯДОК Ñк інÑтрукцію makefile.\n" + +#: main.c:330 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f ФÐЙЛ, --file=ФÐЙЛ, --makefile=ФÐЙЛ\n" +" ВикориÑтати ФÐЙЛ Ñк makefile.\n" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help ВивеÑти це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ– вийти.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Ігнорувати помилки від ÑпоÑобів збираннÑ.\n" + +#: main.c:337 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I КÐТÐЛОГ, --include-dir=КÐТÐЛОГ\n" +" Виконати пошук включених makefile у каталозі.\n" + +#: main.c:340 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Виконувати одночаÑно N завдань; Ñкщо не " +"вказано — необмежену кількіÑÑ‚ÑŒ.\n" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Продовжувати роботу, Ñкщо Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ ÑкоїÑÑŒ мети " +"неможливе.\n" + +#: main.c:344 +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" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times ВикориÑтовувати новіший Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ з чаÑів " +"зміни поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ– мети.\n" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" +" -O[ТИП], --output-sync[=ТИП]\n" +" Ñинхронізувати виведені дані паралельних " +"завдань за ТИПом.\n" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base ВивеÑти внутрішню базу даних make.\n" + +#: main.c:360 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question не заÑтоÑовувати жодних " +"ÑпоÑобів; код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·ÑƒÑ”, чи вÑе вже " +"зроблено.\n" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules Вимкнути вбудовані неÑвні правила.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables Вимкнути вбудовані параметри змінних.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Ðе виводити ÑпоÑоби збираннÑ.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Вимкнути -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Змінювати Ñ‡Ð°Ñ Ð´Ð¾Ñтупу до мети заміÑÑ‚ÑŒ Ñ—Ñ— " +"повторного збираннÑ.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace ВивеÑти дані щодо траÑуваннÑ.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version ВивеÑти дані щодо верÑÑ–Ñ— make Ñ– вийти.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Виводити дані щодо поточного каталогу.\n" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Вимкнути -w, навіть Ñкщо Ð²Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ " +"виконано неÑвним чином.\n" + +#: main.c:381 +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" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Попереджати про поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° невизначену " +"змінну.\n" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "порожній Ñ€Ñдок не може бути назвою файла" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "невідома ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ€Ñ–Ð²Ð½Ñ Ð´Ñ–Ð°Ð³Ð½Ð¾Ñтики, «%s»" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "невідомий тип Ñинхронізації виведених даних, «%s»" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: ÑталоÑÑ Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ (код = 0x%lx, адреÑа = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» доÑтупу: Ð´Ñ–Ñ Ð· запиÑу за адреÑою 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» доÑтупу: Ð´Ñ–Ñ Ð· Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð° адреÑою 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() вÑтановлює default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"Пошуком шлÑхів find_and_set_shell() вÑтановлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s призупинÑєтьÑÑ Ð½Ð° 30 Ñекунд..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "виконано sleep(30). Продовжуємо.\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" +"Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ Ñемафор Ñервера завдань «%s»: " +"(помилка %ld: %s)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Клієнт Ñервера завдань (Ñемафор %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: некоректний Ñ€Ñдок --jobserver-fds, «%s»" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Клієнт Ñервера завдань (fd %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"попередженнÑ: у вкладеному файлів Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ -jN: вимикаємо режим " +"Ñервера завдань." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "дублюємо Ñервер завдань" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"попередженнÑ: Ñервер завдань недоÑтупний: викориÑтовуємо -j1. Додайте «+» до " +"батьківÑького правила збираннÑ." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Makefile зі Ñтандартного джерела вхідних даних вказано двічі." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (тимчаÑовий файл)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (тимчаÑовий файл)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Ðа цій платформі паралельної обробки завдань (-j) не передбачено." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "ПовертаємоÑÑ Ð´Ð¾ режиму єдиного Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Слоти Ñервера завдань обмежено значеннÑм %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "Ñтворюємо Ñемафор Ñервера завдань: (помилка %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "Ñтворюємо канал завдань" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "ініціалізуємо канал Ñервера завдань" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Підтримки Ñимволічних поÑилань не передбачено: вимикаємо -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ make-файлів...\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Make-файл \"%s\", можливо, зациклений, він не перезбиратиметьÑÑ.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Спроба перезібрати make-файл \"%s\" безуÑпішна." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Make-файл \"%s\", Ñкий включаєтьÑÑ, не було знайдено." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Make-файл \"%s\" не було знайдено" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Ðеможливо перейти у первіÑний каталог." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Повторне виконаннÑ[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (тимчаÑовий файл): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL міÑтить декілька запиÑів мети" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "Ðе задані цілі Ñ– не знайдений make-файл" + +#: main.c:2511 +msgid "No targets" +msgstr "Ðема цілей" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ†Ñ–Ð»ÐµÐ¹ мети...\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"попередженнÑ: виÑвлено Ð²Ñ–Ð´Ñ…Ð¸Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ–Ð² годинника. Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути " +"неповним." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "ВикориÑтаннÑ: %s [КЛЮЧІ]... [ЦІЛЬ]...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Цю програму зібрано Ð´Ð»Ñ %s\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Цю програму зібрано Ð´Ð»Ñ %s (%s)\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "Повідомлюйте про помилки до \n" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "разом з «%s%s» мало бути вказано непорожній Ñ€Ñдковий аргумент" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "ключ \"-%c\" повинен викориÑтовуватиÑÑ Ð· цілим додатним аргументом" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sЗібрано Ð´Ð»Ñ %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sЗібрано Ð´Ð»Ñ %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# База даних Make, надрукована %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Друк бази даних Make завершено %s\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Ðевідома помилка %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: кориÑтувач %lu (наÑправді %lu), група %lu (наÑправді %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Ініціалізований доÑтуп" + +#: misc.c:622 +msgid "User access" +msgstr "ДоÑтуп кориÑтувача" + +#: misc.c:670 +msgid "Make access" +msgstr "ДоÑтуп make" + +#: misc.c:704 +msgid "Child access" +msgstr "ДоÑтуп дочірнього процеÑу" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: входимо до невідомого каталогу\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: виходимо з невідомого каталогу\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: входимо до каталогу «%s»\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Залишаю каталог \"%s\"\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: входимо до невідомого каталогу\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: залишаємо невідомий каталог\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: входимо до каталогу «%s»\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Залишаю каталог \"%s\"\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "помилка запиÑу: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Зупинка.\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ make-файлів...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ make-файла \"%s\"" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (немає типової мети)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (шлÑÑ… пошуку)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (не зважати)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (не розширювати ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "ПропуÑкаємо мітку UTF-8 у файлі makefile «%s»\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "ПропуÑкаємо мітку UTF-8 у буфері файла makefile\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "невірний ÑинтакÑÐ¸Ñ Ñƒ умовному вираженні" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑпоÑобу Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ð¿Ð¾Ñ‡Ð¸Ð½Ð°Ñ”Ñ‚ÑŒÑÑ Ð´Ð¾ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÑˆÐ¾Ñ— мети" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "пропущено правило до ÑпоÑобу" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (ви хотіли ввеÑти TAB заміÑÑ‚ÑŒ 8 пробілів?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "пропущений розділювач%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "пропущений шаблон цілі" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "не один шаблон цілі" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "шаблон цілі не міÑтить \"%%\"" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "пропущена \"endif\"" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "порожнє ім'Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ—" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "зайвий текÑÑ‚ піÑÐ»Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð¸ «define»" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "пропущена \"endif\", незавершена \"define\"" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "зайвий текÑÑ‚ піÑÐ»Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð¸ «endef»" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "зайвий текÑÑ‚ піÑÐ»Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð¸ \"%s\"" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "зайва \"%s\"" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "в умовному виразі можлива лише одна директива `else'" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Помилкове Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñпецифічного Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¸ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ—" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "у ÑпоÑобах Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð½Ðµ можна вказувати залежноÑтей" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "змішані неÑвні правила Ñ– правила зі Ñтатичними зразками" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "змішані неÑвні Ñ– звичайні правила" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "ціль \"%s\" не відповідає зразку цілей" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "цільовий файл \"%s\" має Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ñ– з \":\", Ñ– з \"::\" " + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "ціль \"%s\" зазначено декілька разів у одному правилі" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "попередженнÑ: замінюємо ÑпоÑіб Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¸ «%s»" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "попередженнÑ: ігноруємо заÑтарілий ÑпоÑіб Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¸ «%s»" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "змішані неÑвні Ñ– звичайні правила" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "попередженнÑ: зуÑтрінутий Ñимвол NUL; ігноруєтьÑÑ Ð´Ð¾ ÐºÑ–Ð½Ñ†Ñ Ñ€Ñдки" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Ціль \"%s\" не вимагає Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "\"%s\" не вимагає оновленнÑ." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Обрізаємо файл «%s».\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sÐема правила Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ†Ñ–Ð»Ñ– \"%s\", необхідної Ð´Ð»Ñ \"%s\"%s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sÐема правила Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ†Ñ–Ð»Ñ– \"%s\"%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Обробка цільового файла \"%s\".\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñпроба оновити файл \"%s\" завершилаÑÑ Ð±ÐµÐ·ÑƒÑпішно.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Файл \"%s\" вже було оброблено.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Ð’Ñе ще оновлюєтьÑÑ Ñ„Ð°Ð¹Ð» \"%s\".\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\" завершено.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Ðе виÑвлено файла з назвою «%s».\n" + +#: remake.c:495 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "" +"*** ПопередженнÑ: файл .LOW_RESOLUTION_TIME «%s» має чаÑову позначку виÑокої " +"точноÑÑ‚Ñ–" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Знайдено неÑвне правило Ð´Ð»Ñ \"%s\".\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Ðе знайдено неÑвних правил Ð´Ð»Ñ \"%s\".\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "ВикориÑтовуємо типовий ÑпоÑіб Ð´Ð»Ñ Â«%s».\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Циклічна залежніÑÑ‚ÑŒ %s <- %s пропущена." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Завершено обробку попередніх залежноÑтей файла мети «%s».\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Цілі, від Ñких залежить \"%s\", збираютьÑÑ.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Ðварійний зупинка на цільовому файлі \"%s\".\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Ціль \"%s\" не була перезібрана через помилки." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "ЗалежніÑÑ‚ÑŒ «%s» визначено Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¸ «%s» лише порÑдком збираннÑ.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "ЗалежноÑÑ‚Ñ– «%s» мети «%s» не Ñ–Ñнує.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "ЗалежніÑÑ‚ÑŒ «%s» Ñ” новішою за мету «%s».\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "ЗалежніÑÑ‚ÑŒ «%s» Ñ” Ñтарішою за мету «%s».\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Ціль \"%s\" оголошена з двома двокрапками Ñ– не має залежноÑтей.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "Ðемає ÑпоÑобу Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Â«%s», вÑÑ– попередні залежноÑÑ‚Ñ– не змінено.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Збираємо «%s» через вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° always-make.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Потреби у повторному збиранні мети «%s» немає" + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; викориÑтовуємо назву VPATH «%s»" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Ðеобхідно перезібрати ціль \"%s\".\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Ігноруємо назву VPATH «%s».\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "ЗаÑтоÑовуємо ÑпоÑіб «%s».\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Спроба перезібрати цільовий файл \"%s\" безуÑпішна.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Цільовий файл \"%s\" уÑпішно перезібраний.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Цільовий файл \"%s\" вимагає Ð¿ÐµÑ€ÐµÐ·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð· ключем -q.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¸Ñ… команд Ð´Ð»Ñ Â«%s».\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Увага: Файл \"%s\" має майбутній Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸" + +#: remake.c:1411 +#, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "Увага: Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ файла «%s» перебуває на %s Ñ Ñƒ майбутньому" + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "Елемент .LIBPATTERNS «%s» не Ñ” зразком" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "ÐеекÑпортовні налаштуваннÑ: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# ÐеÑвні правила" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# ÐеÑвних правил нема." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# ÐеÑвних правил: %u, термінальних: %u" + +#: rule.c:522 +msgid " terminal." +msgstr "." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ПОМИЛКÐ: Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ num_pattern_rules Ñ” помилковим! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "невідомий Ñигнал" + +#: signame.c:92 +msgid "Hangup" +msgstr "Обрив" + +#: signame.c:95 +msgid "Interrupt" +msgstr "ПерериваннÑ" + +#: signame.c:98 +msgid "Quit" +msgstr "Вихід" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "ÐеприпуÑтима інÑтрукціÑ" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "ПаÑтка траÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡Ð¸ точки зупинки" + +#: signame.c:109 +msgid "Aborted" +msgstr "Припинено" + +#: signame.c:112 +msgid "IOT trap" +msgstr "ПаÑтка IOT" + +#: signame.c:115 +msgid "EMT trap" +msgstr "ПаÑтка EMT" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Помилка операції з крапкою, що плаває" + +#: signame.c:121 +msgid "Killed" +msgstr "ЗнищеннÑ" + +#: signame.c:124 +msgid "Bus error" +msgstr "Помилка на шині" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Збій Ñегментації" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Поганий ÑиÑтемний виклик" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "Обрив каналу" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Сигнал по таймеру" + +#: signame.c:139 +msgid "Terminated" +msgstr "Завершено" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Обумовлений кориÑтувачем Ñигнал 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Обумовлений кориÑтувачем Ñигнал 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Ðащадок завершив роботу" + +#: signame.c:156 +msgid "Power failure" +msgstr "Збій живленнÑ" + +#: signame.c:159 +msgid "Stopped" +msgstr "Зупинено" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Зупинено (ввід з термінала) " + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Зупинено (вивід на термінал)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Зупинено (Ñигнал)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Перевищене Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° процеÑорний чаÑ" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Перевищений межа розміру файла" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Віртуальний Ñ‡Ð°Ñ Ð¼Ð¸Ð½ÑƒÐ²" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Ð§Ð°Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð¼Ð¸Ð½ÑƒÐ²" + +#: signame.c:186 +msgid "Window changed" +msgstr "Вікно змінено" + +#: signame.c:189 +msgid "Continued" +msgstr "Продовжено" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Умова екÑтреного вводу/виводу" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "Можливий ввід/вивід" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "РеÑÑƒÑ€Ñ Ð²Ñ‚Ñ€Ð°Ñ‡ÐµÐ½Ð¾" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Сигнал небезпеки" + +#: signame.c:217 +msgid "Information request" +msgstr "Запит інформації" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Допоміжний процеÑор Ð´Ð»Ñ Ð¾Ð±Ñ‡Ð¸Ñлень з рухомою комою недоÑтупний" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s немає буферів strcache\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"Поточний буфер %s: розмір = %hu Б / викориÑтано = %hu Б / кількіÑÑ‚ÑŒ = %hu / " +"Ñер = %hu Б\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "Інше викориÑтане %s: загалом = %lu B / кількіÑÑ‚ÑŒ = %lu / Ñер = %lu Б\n" + +#: strcache.c:283 +#, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "" +"Інше вільне %s: загалом = %lu Б / Ð¼Ð°ÐºÑ = %lu Б / мін = %lu Б / Ñер = %hu Б\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" +"\n" +"Ð¨Ð²Ð¸Ð´ÐºÐ¾Ð´Ñ–Ñ strcache %s: циклів пошуку = %lu / відÑоток знайденого = %lu%%\n" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# ÑтатиÑтика щодо таблиці хешів:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "автоматична" + +#: variable.c:1602 +msgid "default" +msgstr "типовий" + +#: variable.c:1605 +msgid "environment" +msgstr "визначена у Ñередовищі" + +#: variable.c:1608 +msgid "makefile" +msgstr "файл make" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "заданий ключ -e" + +#: variable.c:1614 +msgid "command line" +msgstr "визначена у командному Ñ€Ñдку" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "Директива «override»" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (з \"%s\", Ñ€Ñдок %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# Ñтан змінних у хеш-таблиці:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Змінні\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Специфічні Ð´Ð»Ñ Ð·Ñ€Ð°Ð·ÐºÐ° Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¸Ñ…" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Ðемає Ñпецифічних Ð´Ð»Ñ Ð·Ñ€Ð°Ð·ÐºÐ° значень змінних." + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u Ñпецифічних Ð´Ð»Ñ Ð·Ñ€Ð°Ð·ÐºÐ° значень змінних" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "попередженнÑ: невизначена змінна \"%.*s\"" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() повернуто код помилки %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "ПопередженнÑ: порожнє переÑпрÑмуваннÑ\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: «%s» command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-попередженнÑ, ймовірно, вам варто повторно увімкнути обробку CTRL-Y з DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "ВБУДОВÐÐИЙ [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "ВБУДОВÐÐИЙ CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "ВБУДОВÐÐИЙ CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Ðевідома вбудована команда \"%s\".\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Помилка, Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "ПереÑпрÑмоване Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð· %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку переÑпрÑмовано до %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "ДопиÑати виведенні дані до %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "ПереÑпрÑмовуємо Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð¾ %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "ДопиÑати %.*s Ñ– Ñпорожнити\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "ЗаміÑÑ‚ÑŒ заданого виконуєтьÑÑ %s\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Помилка Ð¿Ð¾Ñ€Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# ШлÑхи пошуку VPATH\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Ðе визначено шлÑÑ… пошуку \"vpath\"." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u шлÑхи пошуку \"vpath\".\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Ðе визначено загальний шлÑÑ… пошуку (змінна \"VPATH\")." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Загальний шлÑÑ… пошуку (змінна \"VPATH\"):\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/po/vi.gmo b/po/vi.gmo new file mode 100644 index 0000000..ee98bb2 Binary files /dev/null and b/po/vi.gmo differ diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..6e64cf0 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,2312 @@ +# Vietnamese translation for Make. +# Copyright © 2013 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-2013. +# +msgid "" +msgstr "" +"Project-Id-Version: make-4.0\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-10-10 07:36+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" +"Team-Website: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 1.5.5\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-Language: Vietnamese\n" +"X-Poedit-Country: VIET NAM\n" + +#: ar.c:46 +#, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "đã dùng tính năng chÆ°a được há»— trợ: “%sâ€" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "“touch†thành viên kho không có trên VMS" + +#: ar.c:147 +#, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch: Kho “%s†không tồn tại" + +#: ar.c:150 +#, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch: “%s†không phải là kho hợp lệ" + +#: ar.c:157 +#, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch: Thành viên “%s†không tồn tại trong “%sâ€" + +#: ar.c:164 +#, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch: Gặp mã trả lại sai từ ar_member_touch trên “%sâ€" + +#: arscan.c:124 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"lbr$set_module() đã không giải nén thông tin vá» mô-Ä‘un, trạng thái = %d" + +#: arscan.c:230 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() bị lá»—i vá»›i trạng thái = %d" + +#: arscan.c:255 +#, fuzzy, 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 “%sâ€" + +#: arscan.c:944 +#, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Thành viên “%sâ€%s: %ld byte tại %ld (%ld).\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (có lẽ tên bị cắt ngắn)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " Ngày %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, chế Ä‘á»™ = 0%o.\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "Công thức có quá nhiá»u dòng (%ud)" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** Ngắt.\n" + +#: commands.c:629 +#, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] Thành phần kho “%s†có thể là giả; chÆ°a bị xóa bá»" + +#: commands.c:633 +#, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** Thành viên kho “%s†có thể là giả; chÆ°a bị xóa bá»" + +#: commands.c:647 +#, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] Äang xoá tập tin “%sâ€" + +#: commands.c:649 +#, c-format +msgid "*** Deleting file '%s'" +msgstr "*** Äang xoá tập tin “%sâ€" + +#: commands.c:685 +msgid "# recipe to execute" +msgstr "# công thức cần thá»±c hiện" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (dá»±ng-sẵn):" + +#: commands.c:690 +#, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (từ “%sâ€, dòng %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# ThÆ° mục\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: không thể lấy thống kê.\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (khoá %s, mtime %d): không thể mở.\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (thiết bị %d, nút thông tin [%d,%d,%d]): không thể mở.\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (thiết bị %ld, nút thông tin %ld): không thể mở.\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (khoá %s, mtime %d): " + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (thiết bị %d, inode [%d,%d,%d]): " + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (thiết bị %ld, inode %ld): " + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "Không" + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " tập tin, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "không" + +#: dir.c:1064 +msgid " impossibilities" +msgstr " việc không thể làm được" + +#: dir.c:1068 +msgid " so far." +msgstr " cho đến giá»." + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " việc không thể làm được trong %lu thÆ° mục.\n" + +#: expand.c:125 +#, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "Biến đệ quy “%s†(cuối cùng) lại tham chiếu đến chính nó" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "tham chiếu biến chÆ°a chấm dứt" + +#: file.c:271 +#, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "Công thức được chỉ định cho tập tin “%s†tại %s:%lu," + +#: file.c:276 +#, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "Tìm thấy công thức cho tập tin “%s†nhá» quy tắc tìm kiếm ngầm," + +#: file.c:280 +#, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "nhÆ°ng “%s†bây giỠđược cÅ©ng được xem là cùng tập tin “%sâ€." + +#: file.c:283 +#, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "" +"Công thức cho “%s†sẽ bị bá» qua trong sá»± chấp thuận của má»™t cái cho “%sâ€." + +#: file.c:303 +#, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "không thể đổi tên “%s†hai chấm Ä‘Æ¡n thành “%s†hai chấm đôi" + +#: file.c:309 +#, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "không thể đổi tên “%s†hai chấm đôi thành “%s†hai chấm Ä‘Æ¡n" + +#: file.c:401 +#, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** Äang xoá tập tin trung gian “%sâ€" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "Xoá các tập tin trung gian...\n" + +#: file.c:811 +msgid "Current time" +msgstr "Giá» hiện tại" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Thá»i gian của tập tin ở ngoài phạm vi nên thay thế bằng %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# Không phải là đích:" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Tập tin giá trị (Ä‘iá»u kiện tiên quyết của .PRECIOUS)." + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Äích giả (Ä‘iá»u kiện tiên quyết của .PHONY)." + +#: file.c:964 +msgid "# Command line target." +msgstr "# Äích dòng lệnh." + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Mặc định, MAKEFILES, hoặc makefile kiểu -include/sinclude." + +#: file.c:968 +msgid "# Builtin rule" +msgstr "# Quy tắc dá»±ng sẵn" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# Hoàn tất tìm quy tắc ngầm." + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# ChÆ°a hoàn tất tìm quy tắc ngầm." + +#: file.c:973 +#, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# Cuống mẫu ngầm/tÄ©nh: “%sâ€\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# Tập tin là má»™t Ä‘iá»u kiện tiên quyết trung gian." + +#: file.c:979 +msgid "# Also makes:" +msgstr "# CÅ©ng tạo:" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# ChÆ°a kiểm tra giá» sá»­a đổi." + +#: file.c:987 +msgid "# File does not exist." +msgstr "# Tập tin không tồn tại." + +#: file.c:989 +msgid "# File is very old." +msgstr "# Tập tin rất cÅ©." + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Lần sá»­a cuối cùng %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# Tập tin đã được cập nhật." + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# Tập tin chÆ°a được cập nhật." + +#: file.c:1001 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Công thức Ä‘ang chạy (ÄÂY LÀ MỘT Lá»–I)." + +#: file.c:1004 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Công thức phụ thuá»™c Ä‘ang chạy (ÄÂY LÀ MỘT Lá»–I)." + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# Cập nhật thành công." + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# Cần được cập nhật (-q được đặt)." + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# Gặp lá»—i khi cập nhật." + +#: file.c:1025 +msgid "# Invalid value in 'command_state' member!" +msgstr "# Gặp giá trị sai trong thành viên “command_stateâ€!" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Tập tin" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# thống kê bảng băm tập tin:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "%s: TrÆ°á»ng “%s†chÆ°a được nhá»› đệm: %s" + +#: function.c:780 +msgid "non-numeric first argument to 'word' function" +msgstr "đối số thứ nhất không phải dạng số cho hàm “wordâ€" + +#: function.c:785 +msgid "first argument to 'word' function must be greater than 0" +msgstr "đối số thứ nhất cho hàm “word†phải lá»›n hÆ¡n 0" + +#: function.c:805 +msgid "non-numeric first argument to 'wordlist' function" +msgstr "đối số thứ nhất không phải số cho hàm “wordlistâ€" + +#: function.c:807 +msgid "non-numeric second argument to 'wordlist' function" +msgstr "đối số thứ hai không phải số cho hàm “wordlistâ€" + +#: function.c:1499 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(In) gặp lá»—i (e=%ld)\n" + +#: function.c:1523 +#, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe: DuplicateHandle(Err) gặp lá»—i (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() bị lá»—i (e=%ld)\n" + +#: function.c:1538 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() gặp lá»—i\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Dá»n dẹp tập tin bó tạm %s\n" + +# Variable: do not translate/ biến: đừng dịch +#: function.c:2193 +#, c-format +msgid "open: %s: %s" +msgstr "mở: %s: %s" + +#: function.c:2203 +#, c-format +msgid "write: %s: %s" +msgstr "ghi: %s: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "Thao tác tập tin không hợp lệ: %s" + +#: function.c:2324 +#, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "không đủ số đối số (%d) cho hàm “%sâ€" + +#: function.c:2336 +#, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "chÆ°a được viết mã thi hành trên hệ thống này: hàm “%sâ€" + +#: function.c:2399 +#, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "cuá»™c gá»i chÆ°a được chấm dứt cho hàm “%sâ€: thiếu “%câ€" + +#: function.c:2591 +#, fuzzy +msgid "Empty function name" +msgstr "Tên hàm trống rá»—ng\n" + +#: function.c:2593 +#, fuzzy, c-format +msgid "Invalid function name: %s" +msgstr "Tên hàm không hợp lệ: %s\n" + +#: function.c:2595 +#, fuzzy, c-format +msgid "Function name too long: %s" +msgstr "Tên hàm quá dài: %s\n" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "số lượng đối số tối thiểu (%d) là không hợp lệ cho hàm “%sâ€\n" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "số lượng đối số tối Ä‘a (%d) là không hợp lệ cho hàm “%sâ€\n" + +#: getopt.c:659 +#, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s: tùy chá»n “%s†chÆ°a rõ ràng\n" + +#: getopt.c:683 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s: tùy chá»n “--%s†không nhận đối số\n" + +#: getopt.c:688 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s: tùy chá»n “%c%s†không nhận đối số\n" + +#: getopt.c:705 getopt.c:878 +#, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s: tùy chá»n “%s†cần má»™t đối số\n" + +#: getopt.c:734 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s: không nhận ra tùy chá»n “--%sâ€\n" + +#: getopt.c:738 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s: không nhận ra tùy chá»n “%c%sâ€\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: tùy chá»n không hợp lệ -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: tùy chá»n không hợp lệ -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: tùy chá»n cần má»™t đối số -- %c\n" + +#: getopt.c:844 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s: tùy chá»n “-W %s†chÆ°a rõ ràng\n" + +#: getopt.c:862 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s: tùy chá»n “-W %s†không nhận má»™t đối số\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "guile: Äang khai triển “%sâ€\n" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "guile: Äang định giá “%sâ€\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "không thể cấp phát %lu byte cho bảng băm: hết bá»™ nhá»›" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Tải =%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Băm lại=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Xung Ä‘á»™t =%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "Tìm quy tắc ngầm cho “%sâ€.\n" + +#: implicit.c:54 +#, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "Tìm quy tắc ngầm vá» thành phần kho cho “%sâ€.\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Tránh quy tắc ngầm đệ quy.\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "Stem quá dài: “%.*sâ€.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "Thá»­ quy tắc mẫu vá»›i cuống “%.*sâ€.\n" + +#: implicit.c:697 +#, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "Từ chối Ä‘iá»u kiện tiên quyết không thể thá»a “%sâ€.\n" + +#: implicit.c:698 +#, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "Từ chối Ä‘iá»u kiện tiên quyết ngầm không thể “%sâ€.\n" + +#: implicit.c:711 +#, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "Thá»­ Ä‘iá»u kiện tiên quyết quy tắc “%sâ€.\n" + +#: implicit.c:712 +#, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "Thá»­ Ä‘iá»u kiện tiên quyết ngầm “%sâ€.\n" + +#: implicit.c:751 +#, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "Tìm thấy Ä‘iá»u kiện tiên quyết “%s†làm VPATH “%sâ€\n" + +#: implicit.c:765 +#, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "Tìm quy tắc có tập tin trung gian “%sâ€.\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "Không thể tạo tập tin tạm\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (đổ lõi)" + +#: job.c:488 +msgid " (ignored)" +msgstr " (bá» qua)" + +#: job.c:492 job.c:2046 +msgid "" +msgstr "" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "%s: công thức cho đích “%s†gặp lá»—i" + +#: job.c:516 job.c:524 +#, c-format +msgid "%s[%s] Error %d%s" +msgstr "%s[%s] Lá»—i %d%s" + +#: job.c:519 +#, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "%s[%s] Lá»—i 0x%x%s" + +# Variable: don't translate / Biến: đừng dịch +#: job.c:529 +#, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s[%s] %s%s%s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Äang đợi những công việc chÆ°a hoàn tất..." + +#: job.c:651 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Tiến trình con còn sống %p (%s) PID %s %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (máy chủ)" + +#: job.c:841 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Äang mất tiến trình con %p PID %s %s\n" + +#: job.c:842 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Äang thắng lại tiến trình con %p PID %s %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Dá»n dẹp tập tin bó tạm %s\n" + +#: job.c:855 +#, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "Dá»n dẹp tập tin bó tạm %s gặp lá»—i (%d)\n" + +#: job.c:961 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Bá» tiến trình con %p PID %s%s khá»i xâu.\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "giải phóng tín hiệu jobserver: (Lá»—i %ld: %s)" + +#: job.c:1024 job.c:1038 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Äã giải phóng thẻ bài cho tiến trình con %p (%s).\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "ghi lại trình phục vụ công việc" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() gặp lá»—i khi chạy tiến trình (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, 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" + +#: job.c:1735 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Äặt tiến trình con %p (%s) PID %s%s vào xâu.\n" + +#: job.c:2005 +#, 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)" + +#: job.c:2019 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Äã lấy thẻ bài cho Ä‘iá»u con %p (%s).\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "Ä‘á»c ống dẫn công việc" + +#: job.c:2056 +#, c-format +msgid "%s: target '%s' does not exist" +msgstr "%s: đích “%s†không tồn tại" + +#: job.c:2059 +#, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%s: cập nhật đích “%sâ€, cần bởi: %s" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "không thể buá»™c giá»›i hạn tải trên hệ Ä‘iá»u hành này" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "không thể buá»™c giá»›i hạn tải: " + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"không thể xá»­ lý thêm tập tin nào nữa: không thể nhân đôi đầu vào chuẩn\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"không thể xá»­ lý thêm tập tin nào nữa: không thể nhân đôi đầu ra chuẩn\n" + +#: job.c:2278 +msgid "no more file handles: could not duplicate stderr\n" +msgstr "" +"không thể xá»­ lý thêm tập tin nào nữa: không thể nhân đôi đầu ra lá»—i chuẩn\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "Không thể phục hồi đầu vào chuẩn\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "Không thể phục hồi đầu ra chuẩn\n" + +#: job.c:2309 +msgid "Could not restore stderr\n" +msgstr "Không thể phục hồi đầu ra lá»—i tiêu chuẩn\n" + +#: job.c:2420 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "đặt Ä‘iá»u con đã bắt là PID %s, vẫn còn đợi PID %s\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Không tìm thấy lệnh" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Không tìm thấy chÆ°Æ¡ng trình hệ vá»" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: cạn không gian dành cho biến môi trÆ°á»ng" + +#: job.c:2765 +#, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL thay đổi (trÆ°á»›c là “%sâ€, giá» là “%sâ€)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Tạo tập tin bó lệnh tạm: %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" +"Ná»™i dung tập tin bó lệnh:\n" +"\t@echo off\n" + +#: job.c:3395 +#, 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" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (dòng %d) Ngữ cảnh shell sai (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "-O[KIỂU] (--output-sync[=KIỂU]) chÆ°a được cấu hình cho lần dịch này." + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "Gặp lá»—i khi mở bảng ký hiệu toàn cục: %s" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "Äối tượng %s đã được tải không được công bố là tÆ°Æ¡ng thích GPL" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "Gặp lá»—i khi tải ký hiệu %s từ %s: %s" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "Tên ký hiệu là trống rá»—ng cho việc tải: %s" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "Äang tải ký hiệu %s từ %s\n" + +#: load.c:244 +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." + +#: main.c:313 +msgid "Options:\n" +msgstr "Tùy chá»n:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Bá» qua để tÆ°Æ¡ng thích.\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Tạo má»i đích vô Ä‘iá»u kiện.\n" + +#: main.c:318 +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" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d In rất nhiá»u thông tin gỡ rối.\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=CỜ...] In nhiá»u loại thông tin gỡ rối khác nhau.\n" + +#: main.c:325 +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" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=CHUá»–I Äịnh lượng CHUá»–I nhÆ° má»™t lệnh makefile.\n" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Hiển thị trợ giúp này và thoát.\n" + +#: main.c:335 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Bá» qua lá»—i từ công thức.\n" + +#: main.c:337 +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" + +#: main.c:340 +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" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr " -k, --keep-going Cứ tiếp tục khi không thể tạo đích.\n" + +#: main.c:344 +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" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Dùng mtime má»›i nhất giữa liên kết và đích.\n" + +#: main.c:349 +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" + +#: main.c:352 +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" + +#: main.c:355 +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" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base In cÆ¡ sở dữ liệu ná»™i bá»™ của make.\n" + +#: main.c:360 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Không chạy; mã thoát là \"đã cập nhật\".\n" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules Tắt quy tắc ngầm dá»±ng sẵn.\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables Tắt đặt biến dá»±ng sẵn.\n" + +#: main.c:366 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Không in lại công thức.\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Tắt -k.\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " -t, --touch Chạm đích thay vì tạo lại.\n" + +#: main.c:373 +msgid " --trace Print tracing information.\n" +msgstr " --trace Hiển thị thông tin dấu vết.\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version Hiển thị phiên bản make rồi thoát.\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Hiển thị thÆ° mục hiện thá»i.\n" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr " --no-print-directory Tắt -w, thậm chí nếu được bật ngầm.\n" + +#: main.c:381 +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" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Cảnh báo tham chiếu đến biến chÆ°a xác định.\n" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "chuá»—i rá»—ng không hợp lệ làm tên tập tin" + +#: main.c:737 +#, c-format +msgid "unknown debug level specification '%s'" +msgstr "không hiểu đặc tả cấp gỡ rối “%sâ€" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "không hiểu kiểu output-sync “%sâ€" + +#: main.c:828 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Bắt được ngắt/ngoại lệ (mã = 0x%lx, địa chỉ = 0x%p)\n" + +#: main.c:835 +#, 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" + +#: main.c:843 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Vi phạm truy cập: thao tác ghi tại địa chỉ 0x%p\n" + +#: main.c:844 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Vi phạm truy cập: thao tác Ä‘á»c tại địa chỉ 0x%p\n" + +#: main.c:920 main.c:935 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() Ä‘ang đặt default_shell = %s\n" + +#: main.c:988 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell() đã quét Ä‘Æ°á»ng dẫn thì đặt default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s Ä‘ang ngÆ°ng trong 30 giây..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "đã ngủ(30). Tiếp tục.\n" + +#: main.c:1527 +#, 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)" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "Ứng dụng khách jobserver (cá» hiệu %s)\n" + +#: main.c:1534 +#, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "lá»—i ná»™i bá»™: gặp chuá»—i --jobserver-fds “%s†không hợp lệ" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Ứng dụng khách jobserver (fds %d,%d)\n" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "cảnh báo: -jN bị ép buá»™c trong make con: tắt chế Ä‘á»™ jobserver." + +#: main.c:1567 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1570 +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "" +"cảnh báo: trình jobserver không sẵn sàng: dùng -j1. Thêm “+†vào quy tắc " +"make cha." + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "Tập tin makefile từ đầu vào chuẩn được ghi hai lần." + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (tập tin tạm)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (tập tin tạm)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Không há»— trợ công việc song song (-j) trên hệ thống này." + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "Äặt lại thành chế Ä‘á»™ công việc Ä‘Æ¡n (-j1)." + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "Khe jobserver bị giá»›i hạn thành %d\n" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "Ä‘ang tạo tín hiệu jobserver: (Lá»—i %ld: %s)" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "tạo ống dẫn công việc" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "khởi tạo Ä‘Æ°á»ng ống “jobserverâ€" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "Không há»— trợ liên kết má»m: tắt -L." + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "Cập nhật makefile...\n" + +#: main.c:2158 +#, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Makefile “%s†bị lặp; không tạo lại nó.\n" + +#: main.c:2237 +#, c-format +msgid "Failed to remake makefile '%s'." +msgstr "Gặp lá»—i khi làm lại makefile “%sâ€." + +#: main.c:2257 +#, c-format +msgid "Included makefile '%s' was not found." +msgstr "Không tìm thấy makefile bao gồm “%sâ€." + +#: main.c:2262 +#, c-format +msgid "Makefile '%s' was not found" +msgstr "Không tìm thấy makefile “%sâ€." + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "Không thể chuyển vá» thÆ° mục gốc." + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Thá»±c hiện lại[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "unlink (bá» liên kết tập tin tạm): " + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL chứa nhiá»u đích" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "ChÆ°a chỉ định đích, và không tìm thấy makefile" + +#: main.c:2511 +msgid "No targets" +msgstr "Không có đích" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "Äang cập nhật đích mong muốn...\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"cảnh báo: Phát hiện lệch giá». Bản dịch của bạn có thể không hoàn thiện." + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Cách dùng: %s [các_tùy_chá»n] [đích] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"ChÆ°Æ¡ng trình này đã được dịch cho %s\n" + +#: main.c:2718 +#, 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" + +#: main.c:2721 +#, 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" + +#: main.c:2807 +#, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "tùy chá»n “%s%s†cần má»™t đối số là chuá»—i khác rá»—ng" + +#: main.c:2871 +#, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "tùy chá»n “-%c†cần má»™t đối số số nguyên dÆ°Æ¡ng" + +#: main.c:3269 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sÄược dịch cho %s\n" + +#: main.c:3271 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sÄược dịch cho %s (%s)\n" + +#: main.c:3282 +#, 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" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# CÆ¡ sở dữ liệu Make, in lúc %s" + +#: main.c:3313 +#, 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" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "Lá»—i lạ %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: ngÆ°á»i dùng %lu (thật %lu), nhóm %lu (thật %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "Truy cập đã được khởi tạo" + +#: misc.c:622 +msgid "User access" +msgstr "Truy cập ngÆ°á»i dùng" + +#: misc.c:670 +msgid "Make access" +msgstr "Truy cập Make" + +#: misc.c:704 +msgid "Child access" +msgstr "Truy cập con" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Vào thÆ° mục lạ\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Rá»i khá»i thÆ° mục lạ\n" + +#: output.c:109 +#, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: Vào thÆ° mục “%sâ€\n" + +#: output.c:111 +#, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: Rá»i thÆ° mục “%sâ€\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Vào thÆ° mục lạ\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Rá»i thÆ° mục lạ\n" + +#: output.c:120 +#, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: Vào thÆ° mục “%sâ€\n" + +#: output.c:122 +#, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: Rá»i thÆ° mục “%sâ€\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "lá»—i ghi: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr ". Dừng.\n" + +# Variable: don't translate / Biến: đừng dịch +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +# Variable: do not translate/ biến: đừng dịch +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "Äang Ä‘á»c makefile...\n" + +#: read.c:335 +#, c-format +msgid "Reading makefile '%s'" +msgstr "Äang Ä‘á»c makefile “%sâ€" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (không có mục đích mặc định)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (Ä‘Æ°á»ng dẫn tìm kiếm)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (không quan tâm)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (không nối thêm ~)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "Bá» qua “UTF-8 BOM†trong makefile “%sâ€\n" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "Bá» qua “UTF-8 BOM†trong bá»™ đệm makefile\n" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "cú pháp không hợp lệ trong biểu thức Ä‘iá»u kiện" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "%s: gặp lá»—i khi tải" + +#: read.c:992 +msgid "recipe commences before first target" +msgstr "công thức bắt đầu trÆ°á»›c đích thứ nhất" + +#: read.c:1041 +msgid "missing rule before recipe" +msgstr "thiếu quy tắc trÆ°á»›c công thức" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (bạn đã định dùng TAB thay vì 8 khoảng trắng phải không?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "thiếu dấu phân cách%s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "thiếu mẫu đích" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "nhiá»u mẫu đích" + +#: read.c:1276 +#, c-format +msgid "target pattern contains no '%%'" +msgstr "mẫu đích không chứa “%%â€" + +#: read.c:1398 +msgid "missing 'endif'" +msgstr "thiếu chỉ thị “endifâ€" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "tên biến rá»—ng" + +#: read.c:1471 +msgid "extraneous text after 'define' directive" +msgstr "gặp các ký tá»± thừa đằng sau chỉ thị “defineâ€" + +#: read.c:1496 +msgid "missing 'endef', unterminated 'define'" +msgstr "thiếu “endefâ€, chỉ thị “define†chÆ°a hoàn thiện" + +#: read.c:1524 +msgid "extraneous text after 'endef' directive" +msgstr "gặp các ký tá»± thừa đằng sau chỉ thị “endefâ€" + +#: read.c:1595 +#, c-format +msgid "extraneous text after '%s' directive" +msgstr "gặp các ký tá»± thừa đằng sau chỉ thị “%sâ€" + +#: read.c:1596 +#, c-format +msgid "extraneous '%s'" +msgstr "gặp “%s†thừa" + +#: read.c:1624 +msgid "only one 'else' per conditional" +msgstr "chỉ cho phép má»™t “else†cho má»—i biểu thức Ä‘iá»u kiện" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "Äịnh nghÄ©a biến đích riêng biệt bị há»ng" + +#: read.c:1957 +msgid "prerequisites cannot be defined in recipes" +msgstr "không thể định nghÄ©a Ä‘iá»u kiện tiên quyết cho công thức" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "trá»™n lẫn quy tắc ngầm và mẫu tÄ©nh" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "trá»™n quy tắc ngầm và thÆ°á»ng" + +#: read.c:2091 +#, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "đích “%s†không tÆ°Æ¡ng ứng vá»›i mẫu đích" + +#: read.c:2106 read.c:2152 +#, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "tập tin đích “%s†có cả hai mục nhập : và ::" + +#: read.c:2112 +#, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "đích “%s†có nhiá»u hÆ¡n má»™t trong cùng má»™t quy tắc" + +#: read.c:2122 +#, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "cảnh báo: đè công thức cho đích “%sâ€" + +#: read.c:2125 +#, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "cảnh báo: bá» qua công thức cÅ© cho đích “%sâ€" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "trá»™n quy tắc ngầm và thÆ°á»ng" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "cảnh báo: thấy ký tá»± NUL; bá» qua phần còn lại của dòng" + +#: remake.c:230 +#, c-format +msgid "Nothing to be done for '%s'." +msgstr "Không cần làm gì cho “%sâ€." + +#: remake.c:231 +#, c-format +msgid "'%s' is up to date." +msgstr "Äã cập nhật “%sâ€." + +#: remake.c:303 +#, c-format +msgid "Pruning file '%s'.\n" +msgstr "Xén bá»›t tập tin “%sâ€.\n" + +#: remake.c:390 remake.c:393 +#, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%sKhông có quy tắc để tạo đích “%sâ€, cần bởi “%sâ€%s" + +#: remake.c:402 remake.c:405 +#, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%sKhông có quy tắc để tạo đích “%sâ€%s" + +#: remake.c:426 +#, c-format +msgid "Considering target file '%s'.\n" +msgstr "Coi tập tin đích “%sâ€.\n" + +#: remake.c:433 +#, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "Vừa thá»­ và thất bại khi cập nhật “%sâ€.\n" + +#: remake.c:445 +#, c-format +msgid "File '%s' was considered already.\n" +msgstr "Coi tập tin “%s†là đã sẵn có rồi.\n" + +#: remake.c:455 +#, c-format +msgid "Still updating file '%s'.\n" +msgstr "Vẫn Ä‘ang cập nhật tập tin “%sâ€.\n" + +#: remake.c:458 +#, c-format +msgid "Finished updating file '%s'.\n" +msgstr "Hoàn tất cập nhật tập tin “%sâ€.\n" + +#: remake.c:487 +#, c-format +msgid "File '%s' does not exist.\n" +msgstr "Tập tin “%s†không tồn tại.\n" + +#: remake.c:495 +#, 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" + +#: remake.c:508 remake.c:1040 +#, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "Tìm thấy quy tắc ngầm cho “%sâ€.\n" + +#: remake.c:510 remake.c:1042 +#, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "Không tìm thấy quy tắc ngầm cho “%sâ€.\n" + +#: remake.c:516 +#, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "Dùng công thức mặc định cho “%sâ€.\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Bá» phụ thuá»™c vòng tròn %s <- %s." + +#: remake.c:675 +#, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "Hoàn tất Ä‘iá»u kiện tiên quyết của tập tin đích “%sâ€.\n" + +#: remake.c:681 +#, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "Äang tạo Ä‘iá»u kiện tiên quyết của “%sâ€.\n" + +#: remake.c:695 +#, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "Chịu thua tập tin đích “%sâ€.\n" + +#: remake.c:700 +#, c-format +msgid "Target '%s' not remade because of errors." +msgstr "Äích “%s†không được tạo lại do lá»—i." + +#: remake.c:752 +#, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "Äiá»u kiện tiên quyết “%s†là order-only (chỉ thứ tá»±) cho đích “%sâ€.\n" + +#: remake.c:757 +#, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "Äiá»u kiện tiên quyết “%s†của đích “%s†không tồn tại.\n" + +#: remake.c:762 +#, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "Äiá»u kiện tiên quyết “%s†là má»›i hÆ¡n đích “%s†.\n" + +#: remake.c:765 +#, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "Äiá»u kiện tiên quyết “%s†cÅ© hÆ¡n đích “%s†.\n" + +#: remake.c:783 +#, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "Äích “%s†là hai chấm đôi và không có Ä‘iá»u kiện tiên quyết.\n" + +#: remake.c:790 +#, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "" +"Không có công thức cho “%s†và chÆ°a thay đổi Ä‘iá»u kiện tiên quyết nào.\n" + +#: remake.c:795 +#, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "Tạo “%s†do cỠ“always-makeâ€.\n" + +#: remake.c:803 +#, c-format +msgid "No need to remake target '%s'" +msgstr "Không cần tạo lại đích “%sâ€." + +#: remake.c:805 +#, c-format +msgid "; using VPATH name '%s'" +msgstr "; dùng tên VPATH “%sâ€" + +#: remake.c:825 +#, c-format +msgid "Must remake target '%s'.\n" +msgstr "Phải tạo lại đích “%sâ€.\n" + +#: remake.c:831 +#, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " Bá» qua tên VPATH “%sâ€.\n" + +#: remake.c:840 +#, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "Äang chạy công thức của “%sâ€.\n" + +#: remake.c:847 +#, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "Gặp lá»—i khi tạo lại được tập tin đích “%sâ€.\n" + +#: remake.c:850 +#, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "Tạo lại thành công tập tin đích “%sâ€.\n" + +#: remake.c:853 +#, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "Tập tin đích “%s†cần được tạo lại dÆ°á»›i tùy chá»n “-qâ€.\n" + +#: remake.c:1048 +#, c-format +msgid "Using default commands for '%s'.\n" +msgstr "Dùng lệnh mặc định cho “%sâ€.\n" + +#: remake.c:1397 +#, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "Cảnh báo: Tập tin “%s†có giá» sá»­a đổi ở thì tÆ°Æ¡ng lai." + +#: remake.c:1411 +#, 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." + +#: remake.c:1610 +#, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr "Phần tá»­ .LIBPATTERNS “%s†không phải là má»™t mẫu" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Phần tùy chỉnh không xuất được: %s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Quy tắc ngầm" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Không có quy tắc ngầm." + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u quy tắc ngầm, %u" + +#: rule.c:522 +msgid " terminal." +msgstr " thiết bị cuối." + +#: rule.c:530 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "Lá»–I: num_pattern_rules không đúng! %u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "tín hiệu lạ" + +#: signame.c:92 +msgid "Hangup" +msgstr "Treo" + +#: signame.c:95 +msgid "Interrupt" +msgstr "Ngắt" + +#: signame.c:98 +msgid "Quit" +msgstr "Thoát" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "Chỉ lệnh không hợp lệ" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "Bẫy vết/Ä‘iểm ngắt" + +#: signame.c:109 +msgid "Aborted" +msgstr "Bị hủy bá»" + +#: signame.c:112 +msgid "IOT trap" +msgstr "Bẫy IOT" + +#: signame.c:115 +msgid "EMT trap" +msgstr "Bẫy EMT" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "Ngoại lệ dấu chấm Ä‘á»™ng" + +#: signame.c:121 +msgid "Killed" +msgstr "Bị buá»™c kết thúc" + +#: signame.c:124 +msgid "Bus error" +msgstr "Lá»—i bus" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "Lá»—i phân Ä‘oạn" + +#: signame.c:130 +msgid "Bad system call" +msgstr "Lệnh gá»i hệ thống sai" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "á»ng dẫn há»ng" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "Äồng hồ báo Ä‘á»™ng" + +#: signame.c:139 +msgid "Terminated" +msgstr "Äã chấm dứt" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "Tín hiệu tá»± định nghÄ©a 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "Tín hiệu tá»± định nghÄ©a 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "Tiến trình con đã thoát" + +#: signame.c:156 +msgid "Power failure" +msgstr "Mất Ä‘iện Ä‘á»™t ngá»™t" + +#: signame.c:159 +msgid "Stopped" +msgstr "Bị ngừng" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "Bị ngừng (đầu vào tty)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "Bị ngừng (đầu ra tty)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "Bị ngừng (tín hiệu)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "Vượt giá»›i hạn thá»i gian CPU" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "Vượt giá»›i hạn kích cỡ tập tin" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "Bá»™ đếm thá»i gian ảo đã hết hạn" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "Hết hạn đếm thá»i gian khi theo dõi cách sá»­ dụng tiá»m năng hệ thống" + +#: signame.c:186 +msgid "Window changed" +msgstr "Cá»­a sổ bị thay đổi" + +#: signame.c:189 +msgid "Continued" +msgstr "Äã tiếp tục" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "Äiá»u kiện I/O khẩn cấp" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "I/O có thể" + +# Literal: don't translate / NghÄ©a chữ: đừng dịch +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +# Literal: don't translate / NghÄ©a chữ: đừng dịch +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "Tài nguyên bị mất" + +#: signame.c:214 +msgid "Danger signal" +msgstr "Tín hiệu nguy hiểm" + +#: signame.c:217 +msgid "Information request" +msgstr "Yêu cầu thông tin" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "Không có bá»™ đồng xá»­ lý số thá»±c dấu chấm Ä‘á»™ng" + +#: strcache.c:236 +#, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "" +"\n" +"%s Không có bá»™ đệm strcache\n" + +#: strcache.c:266 +#, 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" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" +"%s đệm hiện tại: kcỡ = %hu B / đã dùng = %hu B / slượng = %hu / tbình = %hu " +"B\n" + +#: strcache.c:280 +#, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s được dùng khác: tổng = %lu B / s.lượng = %lu / t.bình = %lu B\n" + +#: strcache.c:283 +#, 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" + +#: strcache.c:287 +#, 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" + +#: strcache.c:289 +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"# thống kê bảng băm tập tin:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "tá»± Ä‘á»™ng" + +#: variable.c:1602 +msgid "default" +msgstr "mặc định" + +#: variable.c:1605 +msgid "environment" +msgstr "môi trÆ°á»ng" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "môi trÆ°á»ng vá»›i -e" + +#: variable.c:1614 +msgid "command line" +msgstr "dòng lệnh" + +#: variable.c:1617 +msgid "'override' directive" +msgstr "chỉ thị “overrideâ€" + +#: variable.c:1628 +#, c-format +msgid " (from '%s', line %lu)" +msgstr " (từ “%sâ€, dòng %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# thống kê bảng băm biến được đặt:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Biến\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Giá trị biến đặc tả cho mẫu" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Không có giá trị biến đặc tả cho mẫu" + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u giá trị biến đặc tả cho mẫu" + +#: variable.h:224 +#, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "cảnh báo: biến “%.*s†chÆ°a được định nghÄ©a" + +#: vmsfunctions.c:91 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() gặp lá»—i vá»›i %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Cảnh báo: Chuyển hÆ°á»›ng trống rá»—ng\n" + +#: vmsjobs.c:183 +#, c-format +msgid "internal error: '%s' command_state" +msgstr "lá»—i ná»™i bá»™: command_state “%sâ€" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-warning, có lẽ bạn cần phải bật lại xá»­ lý CTRL-Y từ DCL.\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Không hiểu lệnh dá»±ng sẵn “%sâ€\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "Lá»—i, lệnh trống rá»—ng\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Äã chuyển hÆ°á»›ng đầu vào từ %s\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Äã chuyển hÆ°á»›ng lá»—i tá»›i %s\n" + +#: vmsjobs.c:690 +#, c-format +msgid "Append output to %s\n" +msgstr "Nối thêm đầu ra vào %s\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Äã chuyển hÆ°á»›ng đầu ra tá»›i %s\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Nối thêm %.*s và dá»n dẹp\n" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "Thá»±c hiện %s để thay thế\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Gặp lá»—i sản sinh tiến trình, %d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# ÄÆ°á»ng dẫn tìm kiếm VPATH\n" + +#: vpath.c:600 +msgid "# No 'vpath' search paths." +msgstr "# Không có Ä‘Æ°á»ng dẫn tìm kiếm “vpathâ€." + +#: vpath.c:602 +#, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u Ä‘Æ°á»ng dẫn tìm kiếm “vpathâ€.\n" + +#: vpath.c:605 +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# Không có Ä‘Æ°á»ng dẫn tìm kiếm chung (biến “VPATHâ€)." + +#: vpath.c:611 +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# ÄÆ°á»ng dẫn tìm kiếm chung (biến “VPATHâ€):\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/po/zh_CN.gmo b/po/zh_CN.gmo new file mode 100644 index 0000000..54b7430 Binary files /dev/null and b/po/zh_CN.gmo differ diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..2282094 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,2373 @@ +# SOME DESCRIPTIVE TITLE. +# 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. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.99.90\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2014-10-05 12:25-0400\n" +"PO-Revision-Date: 2013-06-12 15:54+0800\n" +"Last-Translator: LI Daobing \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" + +#: ar.c:46 +#, fuzzy, c-format +msgid "attempt to use unsupported feature: '%s'" +msgstr "试图使用ä¸æ”¯æŒçš„功能:“%sâ€" + +#: ar.c:123 +msgid "touch archive member is not available on VMS" +msgstr "VMS 系统上ä¸æ”¯æŒ touch å½’æ¡£æˆå‘˜" + +#: ar.c:147 +#, fuzzy, c-format +msgid "touch: Archive '%s' does not exist" +msgstr "touch:归档文件“%sâ€ä¸å­˜åœ¨" + +#: ar.c:150 +#, fuzzy, c-format +msgid "touch: '%s' is not a valid archive" +msgstr "touch:“%sâ€ä¸æ˜¯åˆæ³•çš„归档文件" + +#: ar.c:157 +#, fuzzy, c-format +msgid "touch: Member '%s' does not exist in '%s'" +msgstr "touch:在“%2$sâ€ä¸­ä¸å­˜åœ¨æˆå‘˜â€œ%1$sâ€" + +#: ar.c:164 +#, fuzzy, c-format +msgid "touch: Bad return code from ar_member_touch on '%s'" +msgstr "touch:æ¥è‡ªâ€œ%sâ€ä¸Šçš„ ar_member_touch 的错误返回ç " + +#: arscan.c:124 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_modules 获å–模å—ä¿¡æ¯å¤±è´¥ï¼Œè¿”å›žçŠ¶æ€ = %d" + +#: arscan.c:230 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control å¤±è´¥ï¼Œè¿”å›žçŠ¶æ€ = %d" + +#: arscan.c:255 +#, fuzzy, c-format +msgid "unable to open library '%s' to lookup member status %d" +msgstr "无法打开库“%sâ€ä»¥å¯»æ‰¾æˆå‘˜â€œ%sâ€" + +#: arscan.c:944 +#, fuzzy, c-format +msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "æˆå‘˜â€œ%sâ€%s: %ld 字节在 %ld (%ld)。\n" + +#: arscan.c:945 +msgid " (name might be truncated)" +msgstr " (å称å¯èƒ½è¢«æˆªçŸ­)" + +#: arscan.c:947 +#, c-format +msgid " Date %s" +msgstr " 日期 %s" + +#: arscan.c:948 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d,gid = %d,mode = 0%o。\n" + +#: commands.c:404 +#, c-format +msgid "Recipe has too many lines (%ud)" +msgstr "" + +#: commands.c:505 +msgid "*** Break.\n" +msgstr "*** 中断。\n" + +#: commands.c:629 +#, fuzzy, c-format +msgid "*** [%s] Archive member '%s' may be bogus; not deleted" +msgstr "*** [%s] å½’æ¡£æˆå‘˜â€œ%sâ€å¯èƒ½æ˜¯å‡çš„;未删除" + +#: commands.c:633 +#, fuzzy, c-format +msgid "*** Archive member '%s' may be bogus; not deleted" +msgstr "*** å½’æ¡£æˆå‘˜â€œ%sâ€å¯èƒ½æ˜¯å‡çš„;未删除" + +#: commands.c:647 +#, fuzzy, c-format +msgid "*** [%s] Deleting file '%s'" +msgstr "*** [%s] 正在删除文件“%sâ€" + +#: commands.c:649 +#, fuzzy, c-format +msgid "*** Deleting file '%s'" +msgstr "*** 正在删除文件“%sâ€" + +#: commands.c:685 +#, fuzzy +msgid "# recipe to execute" +msgstr "# è¦æ‰§è¡Œçš„命令" + +#: commands.c:688 +msgid " (built-in):" +msgstr " (内置):" + +#: commands.c:690 +#, fuzzy, c-format +msgid " (from '%s', line %lu):\n" +msgstr " (从“%sâ€ï¼Œè¡Œ %lu):\n" + +#: dir.c:989 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# 目录\n" + +#: dir.c:1001 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s:无法对其进行 stat æ“作。\n" + +#: dir.c:1005 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (关键字 %s,修改时间 %d):无法打开。\n" + +#: dir.c:1009 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (设备 %d,i-节点 [%d,%d,%d]):无法打开。\n" + +#: dir.c:1014 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (设备 %ld,i-节点 %ld):无法打开。\n" + +#: dir.c:1041 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (关键字 %s,修改时间 %d):" + +#: dir.c:1045 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (设备 %d,i-节点 [%d,%d,%d]):" + +#: dir.c:1050 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (设备 %ld,i-节点 %ld):" + +#: dir.c:1056 dir.c:1077 +msgid "No" +msgstr "æ— " + +#: dir.c:1059 dir.c:1080 +msgid " files, " +msgstr " 文件, " + +#: dir.c:1061 dir.c:1082 +msgid "no" +msgstr "æ— " + +#: dir.c:1064 +msgid " impossibilities" +msgstr " ä¸å¯èƒ½" + +#: dir.c:1068 +msgid " so far." +msgstr " 迄今为止。" + +#: dir.c:1085 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " ä¸å¯èƒ½åœ¨ %lu 目录中。\n" + +#: expand.c:125 +#, fuzzy, c-format +msgid "Recursive variable '%s' references itself (eventually)" +msgstr "递归å˜é‡â€œ%sâ€åº”用自身 (最终)" + +#: expand.c:269 +msgid "unterminated variable reference" +msgstr "未终止的å˜é‡å¼•ç”¨" + +#: file.c:271 +#, fuzzy, c-format +msgid "Recipe was specified for file '%s' at %s:%lu," +msgstr "关于文件“%sâ€çš„命令在 %s:%lu 处指定," + +#: file.c:276 +#, fuzzy, c-format +msgid "Recipe for file '%s' was found by implicit rule search," +msgstr "关于文件“%sâ€çš„命令通过éšå«è§„则æœç´¢è€Œæ‰¾åˆ°ï¼Œ" + +#: file.c:280 +#, fuzzy, c-format +msgid "but '%s' is now considered the same file as '%s'." +msgstr "但“%sâ€çŽ°åœ¨è¢«çœ‹åšâ€œ%sâ€çš„åŒä¸€ä¸ªæ–‡ä»¶ã€‚" + +#: file.c:283 +#, fuzzy, c-format +msgid "Recipe for '%s' will be ignored in favor of the one for '%s'." +msgstr "“%2$sâ€æ›´ä¼˜å…ˆï¼Œâ€œ%1$sâ€çš„命令被忽略。" + +#: file.c:303 +#, fuzzy, c-format +msgid "can't rename single-colon '%s' to double-colon '%s'" +msgstr "无法将å•å†’å·â€œ%sâ€é‡å‘½å为åŒå†’å·â€œ%sâ€" + +#: file.c:309 +#, fuzzy, c-format +msgid "can't rename double-colon '%s' to single-colon '%s'" +msgstr "无法将åŒå†’å·â€œ%sâ€é‡å‘½å为å•å†’å·â€œ%sâ€" + +#: file.c:401 +#, fuzzy, c-format +msgid "*** Deleting intermediate file '%s'" +msgstr "*** 正在删除中间文件“%sâ€" + +#: file.c:405 +msgid "Removing intermediate files...\n" +msgstr "正在删除中间文件...\n" + +#: file.c:811 +msgid "Current time" +msgstr "当å‰æ—¶é—´" + +#: file.c:815 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%sï¼šæ—¶é—´æ ‡è®°è¶…å‡ºèŒƒå›´ï¼›æ­£åœ¨æ›¿æ¢ %s" + +#: file.c:955 +msgid "# Not a target:" +msgstr "# ä¸æ˜¯ä¸€ä¸ªç›®æ ‡ï¼š" + +#: file.c:960 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# é‡è¦æ–‡ä»¶ (.PRECIOUSçš„å‰æ)。" + +#: file.c:962 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# å‡ç›®æ ‡ (.PHONYçš„å‰æ)。" + +#: file.c:964 +#, fuzzy +msgid "# Command line target." +msgstr "# 命令行目标。" + +#: file.c:966 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# 缺çœçš„ã€MAKEFILES 指定的ã€-include/sinclude 包å«çš„ makefile。" + +#: file.c:968 +#, fuzzy +msgid "# Builtin rule" +msgstr "" +"\n" +"# 没有éšå«è§„则。" + +#: file.c:970 +msgid "# Implicit rule search has been done." +msgstr "# 对éšå«è§„则的æœç´¢å·²å®Œæˆã€‚" + +#: file.c:971 +msgid "# Implicit rule search has not been done." +msgstr "# 对éšå«è§„则的æœç´¢å°šæœªå®Œæˆã€‚" + +#: file.c:973 +#, fuzzy, c-format +msgid "# Implicit/static pattern stem: '%s'\n" +msgstr "# éšå«/é™æ€æ¨¡å¼ä¸»å¹²ï¼šâ€œ%sâ€\n" + +#: file.c:975 +msgid "# File is an intermediate prerequisite." +msgstr "# 文件是一个中间å‰æ。" + +#: file.c:979 +msgid "# Also makes:" +msgstr "# 还è¦åˆ›å»ºï¼š" + +#: file.c:985 +msgid "# Modification time never checked." +msgstr "# 从ä¸æ£€æŸ¥ä¿®æ”¹æ—¶é—´ã€‚" + +#: file.c:987 +msgid "# File does not exist." +msgstr "# 文件ä¸å­˜åœ¨ã€‚" + +#: file.c:989 +msgid "# File is very old." +msgstr "# 文件éžå¸¸é™ˆæ—§ã€‚" + +#: file.c:994 +#, c-format +msgid "# Last modified %s\n" +msgstr "# 最近更新 %s\n" + +#: file.c:997 +msgid "# File has been updated." +msgstr "# 文件已ç»è¢«æ›´æ–°ã€‚" + +#: file.c:997 +msgid "# File has not been updated." +msgstr "# 文件尚未被更新。" + +#: file.c:1001 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# 正在è¿è¡Œçš„命令 (这是个错误)。" + +#: file.c:1004 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# 正在è¿è¡Œçš„ä¾èµ–性命令 (这是个错误)。" + +#: file.c:1013 +msgid "# Successfully updated." +msgstr "# æ›´æ–°æˆåŠŸã€‚" + +#: file.c:1017 +msgid "# Needs to be updated (-q is set)." +msgstr "# 需è¦æ›´æ–° (用 -q 设定)。" + +#: file.c:1020 +msgid "# Failed to be updated." +msgstr "# 更新失败。" + +#: file.c:1025 +#, fuzzy +msgid "# Invalid value in 'command_state' member!" +msgstr "# “command_stateâ€æˆå‘˜ä¸­æ— æ•ˆçš„值ï¼" + +#: file.c:1044 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# 文件" + +#: file.c:1048 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# 文件æ‚凑表状æ€:\n" +"# " + +#: file.c:1058 +#, c-format +msgid "%s: Field '%s' not cached: %s" +msgstr "" + +#: function.c:780 +#, fuzzy +msgid "non-numeric first argument to 'word' function" +msgstr "“wordâ€å‡½æ•°çš„第一个å‚æ•°ä¸æ˜¯æ•°å€¼å‚æ•°" + +#: function.c:785 +#, fuzzy +msgid "first argument to 'word' function must be greater than 0" +msgstr "“wordâ€å‡½æ•°çš„第一个å‚数必须大于 0" + +#: function.c:805 +#, fuzzy +msgid "non-numeric first argument to 'wordlist' function" +msgstr "“wordlistâ€å‡½æ•°çš„第一个å‚æ•°ä¸æ˜¯æ•°å€¼å‚æ•°" + +#: function.c:807 +#, fuzzy +msgid "non-numeric second argument to 'wordlist' function" +msgstr "“wordlistâ€å‡½æ•°çš„第二个å‚æ•°ä¸æ˜¯æ•°å€¼å‚æ•°" + +#: function.c:1499 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n" +msgstr "创建å­è¿›ç¨‹ï¼šå¤åˆ¶å¥æŸ„(In)失败 (e=%ld)\n" + +#: function.c:1523 +#, fuzzy, c-format +msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "创建å­è¿›ç¨‹ï¼šå¤åˆ¶å¥æŸ„(Err)失败 (e=%ld)\n" + +#: function.c:1530 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() 失败 (e=%ld)\n" + +#: function.c:1538 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe ():process_init_fd() 失败\n" + +#: function.c:1832 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "正在清除临时批处ç†æ–‡ä»¶ %s\n" + +#: function.c:2193 +#, fuzzy, c-format +msgid "open: %s: %s" +msgstr "%s: %s" + +#: function.c:2203 +#, fuzzy, c-format +msgid "write: %s: %s" +msgstr "写错误: %s" + +#: function.c:2209 +#, c-format +msgid "Invalid file operation: %s" +msgstr "" + +#: function.c:2324 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function '%s'" +msgstr "函数“%2$sâ€çš„å‚æ•°æ•°é‡(%1$d)ä¸å¤Ÿ" + +#: function.c:2336 +#, fuzzy, c-format +msgid "unimplemented on this platform: function '%s'" +msgstr "在本平å°ä¸Šæœªå®žçŽ°ï¼šå‡½æ•°â€œ%sâ€" + +#: function.c:2399 +#, fuzzy, c-format +msgid "unterminated call to function '%s': missing '%c'" +msgstr "对函数“%sâ€çš„未终止的调用:é—æ¼â€œ%câ€" + +#: function.c:2591 +msgid "Empty function name" +msgstr "" + +#: function.c:2593 +#, c-format +msgid "Invalid function name: %s" +msgstr "" + +#: function.c:2595 +#, c-format +msgid "Function name too long: %s" +msgstr "" + +#: function.c:2598 +#, fuzzy, c-format +msgid "Invalid minimum argument count (%d) for function %s" +msgstr "函数“%2$sâ€çš„å‚æ•°æ•°é‡(%1$d)ä¸å¤Ÿ" + +#: function.c:2601 +#, fuzzy, c-format +msgid "Invalid maximum argument count (%d) for function %s" +msgstr "函数“%2$sâ€çš„å‚æ•°æ•°é‡(%1$d)ä¸å¤Ÿ" + +#: getopt.c:659 +#, fuzzy, c-format +msgid "%s: option '%s' is ambiguous\n" +msgstr "%s:选项“%sâ€å«ä¹‰ä¸æ¸…\n" + +#: getopt.c:683 +#, fuzzy, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "%s:选项“--%sâ€ä¸éœ€è¦å‚æ•°\n" + +#: getopt.c:688 +#, fuzzy, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "%s:选项“%c%sâ€ä¸éœ€è¦å‚æ•°\n" + +#: getopt.c:705 getopt.c:878 +#, fuzzy, c-format +msgid "%s: option '%s' requires an argument\n" +msgstr "%s:选项“%sâ€éœ€è¦ä¸€ä¸ªå‚æ•°\n" + +#: getopt.c:734 +#, fuzzy, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "%s:无法识别的选项“--%sâ€\n" + +#: getopt.c:738 +#, fuzzy, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "%s:无法识别的选项“%c%sâ€\n" + +#: getopt.c:764 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s:éžæ³•é€‰é¡¹ -- %c\n" + +#: getopt.c:767 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s:éžæ³•é€‰é¡¹ -- %c\n" + +#: getopt.c:797 getopt.c:927 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s:选项需è¦ä¸€ä¸ªå‚æ•° -- %c\n" + +#: getopt.c:844 +#, fuzzy, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "%s:选项“-W %sâ€å«ä¹‰ä¸æ¸…\n" + +#: getopt.c:862 +#, fuzzy, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "%s:选项“-W %sâ€ä¸å…许给出å‚æ•°\n" + +#: guile.c:58 +#, c-format +msgid "guile: Expanding '%s'\n" +msgstr "" + +#: guile.c:74 +#, c-format +msgid "guile: Evaluating '%s'\n" +msgstr "" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "无法为æ‚å‡‘è¡¨åˆ†é… %ld 字节: 内存耗尽" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "è´Ÿè½½=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "é‡æ–°æ‚凑=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "碰撞=%ld/%ld=%.0f%%" + +#: implicit.c:38 +#, fuzzy, c-format +msgid "Looking for an implicit rule for '%s'.\n" +msgstr "正在为“%sâ€å¯»æ‰¾éšå«è§„则。\n" + +#: implicit.c:54 +#, fuzzy, c-format +msgid "Looking for archive-member implicit rule for '%s'.\n" +msgstr "正在为“%sâ€å¯»æ‰¾å½’æ¡£æˆå‘˜éšå«è§„则。\n" + +#: implicit.c:310 +msgid "Avoiding implicit rule recursion.\n" +msgstr "é¿å…éšå«è§„则递归。\n" + +#: implicit.c:486 +#, c-format +msgid "Stem too long: '%.*s'.\n" +msgstr "" + +#: implicit.c:491 +#, fuzzy, c-format +msgid "Trying pattern rule with stem '%.*s'.\n" +msgstr "以主干“%.*sâ€å°è¯•åŒ¹é…模å¼è§„则。\n" + +#: implicit.c:697 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite '%s'.\n" +msgstr "æ‹’ç»ä¸å¯èƒ½çš„规则å‰æ“%sâ€ã€‚\n" + +#: implicit.c:698 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite '%s'.\n" +msgstr "æ‹’ç»ä¸å¯èƒ½çš„éšå«å‰æ“%sâ€ã€‚\n" + +#: implicit.c:711 +#, fuzzy, c-format +msgid "Trying rule prerequisite '%s'.\n" +msgstr "å°è¯•è§„则å‰æ“%sâ€ã€‚\n" + +#: implicit.c:712 +#, fuzzy, c-format +msgid "Trying implicit prerequisite '%s'.\n" +msgstr "å°è¯•éšå«å‰æ“%sâ€ã€‚\n" + +#: implicit.c:751 +#, fuzzy, c-format +msgid "Found prerequisite '%s' as VPATH '%s'\n" +msgstr "å‰æ“%sâ€åœ¨ VPATH “%s†中å‘现\n" + +#: implicit.c:765 +#, fuzzy, c-format +msgid "Looking for a rule with intermediate file '%s'.\n" +msgstr "正在寻找使用中间文件“%sâ€çš„规则。\n" + +#: job.c:361 +msgid "Cannot create a temporary file\n" +msgstr "无法创建临时文件\n" + +#: job.c:483 +msgid " (core dumped)" +msgstr " (core dumped)" + +#: job.c:488 +#, fuzzy +msgid " (ignored)" +msgstr "[%s] 错误 %d (忽略)" + +#: job.c:492 job.c:2046 +#, fuzzy +msgid "" +msgstr " (内置):" + +#: job.c:503 +#, c-format +msgid "%s: recipe for target '%s' failed" +msgstr "" + +#: job.c:516 job.c:524 +#, fuzzy, c-format +msgid "%s[%s] Error %d%s" +msgstr "*** [%s] 错误 %d" + +#: job.c:519 +#, fuzzy, c-format +msgid "%s[%s] Error 0x%x%s" +msgstr "*** [%s] 错误 0x%x" + +#: job.c:529 +#, fuzzy, c-format +msgid "%s[%s] %s%s%s" +msgstr "%s%s: %s" + +#: job.c:621 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** 正在等待未完æˆçš„任务...." + +#: job.c:651 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "活跃å­è¿›ç¨‹ 0x%08lx (%s) PID %ld %s\n" + +#: job.c:653 job.c:843 job.c:962 job.c:1737 +msgid " (remote)" +msgstr " (远程)" + +#: job.c:841 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "正在中止失败的å­è¿›ç¨‹ 0x%08lx PID %ld %s\n" + +#: job.c:842 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "正在中止获胜的å­è¿›ç¨‹ 0x%08lx PID %ld %s\n" + +#: job.c:849 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "正在清除临时批文件 %s\n" + +#: job.c:855 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s failed (%d)\n" +msgstr "正在清除临时批文件 %s\n" + +#: job.c:961 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "从链中删除å­è¿›ç¨‹ 0x%08lx PID %ld%s。\n" + +#: job.c:1021 +#, c-format +msgid "release jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: job.c:1024 job.c:1038 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "为å­è¿›ç¨‹ 0x%08lx (%s) 释放令牌(token)。\n" + +#: job.c:1036 +msgid "write jobserver" +msgstr "写入任务æœåŠ¡å™¨" + +#: job.c:1662 job.c:2387 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() å¯åŠ¨è¿›ç¨‹å¤±è´¥ (e=%ld)\n" + +#: job.c:1666 job.c:2391 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"失败执行中共有 %d 个å‚数。\n" + +#: job.c:1735 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "å°†å­è¿›ç¨‹ 0x%08lx (%s) PID %ld%s 放入链。\n" + +#: job.c:2005 +#, c-format +msgid "semaphore or child process wait: (Error %ld: %s)" +msgstr "" + +#: job.c:2019 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "获得至进程 0x%08lx (%s) 的标记。\n" + +#: job.c:2029 +msgid "read jobs pipe" +msgstr "读å–任务管é“" + +#: job.c:2056 +#, fuzzy, c-format +msgid "%s: target '%s' does not exist" +msgstr "touch:归档文件“%sâ€ä¸å­˜åœ¨" + +#: job.c:2059 +#, fuzzy, c-format +msgid "%s: update target '%s' due to: %s" +msgstr "%1$s没有规则å¯ä»¥åˆ›å»ºâ€œ%3$sâ€%4$s需è¦çš„目标“%2$sâ€" + +#: job.c:2171 +msgid "cannot enforce load limits on this operating system" +msgstr "无法在本æ“作系统中实施负载é™åˆ¶" + +#: job.c:2173 +msgid "cannot enforce load limit: " +msgstr "无法实施负载é™åˆ¶ï¼š" + +#: job.c:2252 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "没有剩余的文件å¥æŸ„: 无法å¤åˆ¶æ ‡å‡†è¾“å…¥\n" + +#: job.c:2264 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "没有剩余的文件å¥æŸ„: 无法å¤åˆ¶æ ‡å‡†è¾“出\n" + +#: job.c:2278 +#, fuzzy +msgid "no more file handles: could not duplicate stderr\n" +msgstr "没有剩余的文件å¥æŸ„: 无法å¤åˆ¶æ ‡å‡†è¾“å…¥\n" + +#: job.c:2293 +msgid "Could not restore stdin\n" +msgstr "无法还原标准输入\n" + +#: job.c:2301 +msgid "Could not restore stdout\n" +msgstr "无法还原标准输出\n" + +#: job.c:2309 +#, fuzzy +msgid "Could not restore stderr\n" +msgstr "无法还原标准输入\n" + +#: job.c:2420 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make 已中止的å­è¿›ç¨‹ pid %ld,ä»åœ¨ç­‰å¾… pid %ld\n" + +#: job.c:2458 +#, c-format +msgid "%s: Command not found" +msgstr "%s:命令未找到" + +#: job.c:2518 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s:未找到 shell 程åº" + +#: job.c:2527 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: 环境å˜é‡ç©ºé—´å¯èƒ½ä¼šè€—å°½" + +#: job.c:2765 +#, fuzzy, c-format +msgid "$SHELL changed (was '%s', now '%s')\n" +msgstr "$SHELL å·²æ”¹å˜ (原为“%sâ€ï¼ŒçŽ°ä¸ºâ€œ%sâ€)\n" + +#: job.c:3198 job.c:3383 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "正在创建临时批文件 %s\n" + +#: job.c:3206 +msgid "" +"Batch file contents:\n" +"\t@echo off\n" +msgstr "" + +#: job.c:3395 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3503 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (è¡Œ %d) 错误的 shell 上下文 (!unixy && !batch_mode_shell)\n" + +#: job.h:43 +msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build." +msgstr "" + +#: load.c:60 +#, c-format +msgid "Failed to open global symbol table: %s" +msgstr "" + +#: load.c:97 +#, c-format +msgid "Loaded object %s is not declared to be GPL compatible" +msgstr "" + +#: load.c:104 +#, c-format +msgid "Failed to load symbol %s from %s: %s" +msgstr "" + +#: load.c:149 +#, c-format +msgid "Empty symbol name for load: %s" +msgstr "" + +#: load.c:205 +#, c-format +msgid "Loading symbol %s from %s\n" +msgstr "" + +#: load.c:244 +#, fuzzy +msgid "The 'load' operation is not supported on this platform." +msgstr "本平å°ä¸æ”¯æŒå¹¶è¡Œä»»åŠ¡ (-j)。" + +#: main.c:313 +msgid "Options:\n" +msgstr "选项:\n" + +#: main.c:314 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m 忽略兼容性。\n" + +#: main.c:316 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make æ— æ¡ä»¶ make 所有目标。\n" + +#: main.c:318 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" 在执行å‰å…ˆåˆ‡æ¢åˆ° DIRECTORY 目录。\n" + +#: main.c:321 +msgid " -d Print lots of debugging information.\n" +msgstr " -d 打å°å¤§é‡è°ƒè¯•ä¿¡æ¯ã€‚\n" + +#: main.c:323 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr " --debug[=FLAGS] 打å°å„ç§è°ƒè¯•ä¿¡æ¯ã€‚\n" + +#: main.c:325 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" 环境å˜é‡è¦†ç›– makefile 中的å˜é‡ã€‚\n" + +#: main.c:328 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:330 +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" + +#: main.c:333 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help 打å°è¯¥æ¶ˆæ¯å¹¶é€€å‡ºã€‚\n" + +#: main.c:335 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors 忽略æ¥è‡ªå‘½ä»¤çš„错误。\n" + +#: main.c:337 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" 在 DIRECTORY 中æœç´¢è¢«åŒ…å«çš„ makefile。\n" + +#: main.c:340 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] åŒæ—¶å…许 N 个任务;无å‚数表明å…许无é™ä¸ªä»»åŠ¡ã€‚\n" + +#: main.c:342 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr " -k, --keep-going 当æŸäº›ç›®æ ‡æ— æ³•åˆ›å»ºæ—¶ä»ç„¶ç»§ç»­ã€‚\n" + +#: main.c:344 +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" + +#: main.c:347 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times 使用软链接åŠè½¯é“¾æŽ¥ç›®æ ‡ä¸­ä¿®æ”¹æ—¶é—´è¾ƒæ™šçš„一个。\n" + +#: main.c:349 +#, 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" + +#: main.c:352 +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 当åšå¾ˆæ—§ï¼Œä¸å¿…é‡æ–°ç”Ÿæˆã€‚\n" + +#: main.c:355 +msgid "" +" -O[TYPE], --output-sync[=TYPE]\n" +" Synchronize output of parallel jobs by TYPE.\n" +msgstr "" + +#: main.c:358 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base æ‰“å° make 的内部数æ®åº“。\n" + +#: main.c:360 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question ä¸è¿è¡Œä»»ä½•å‘½ä»¤ï¼›é€€å‡ºçŠ¶æ€è¯´æ˜Žæ˜¯å¦å·²å…¨éƒ¨æ›´æ–°ã€‚\n" + +#: main.c:362 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules ç¦ç”¨å†…ç½®éšå«è§„则。\n" + +#: main.c:364 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables ç¦ç”¨å†…ç½®å˜é‡è®¾ç½®ã€‚\n" + +#: main.c:366 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet ä¸è¾“出命令。\n" + +#: main.c:368 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" 关闭 -k。\n" + +#: main.c:371 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " -t, --touch touch 目标而ä¸æ˜¯é‡æ–°åˆ›å»ºå®ƒä»¬ã€‚\n" + +#: main.c:373 +#, fuzzy +msgid " --trace Print tracing information.\n" +msgstr " --debug[=FLAGS] 打å°å„ç§è°ƒè¯•ä¿¡æ¯ã€‚\n" + +#: main.c:375 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version æ‰“å° make 的版本å·å¹¶é€€å‡ºã€‚\n" + +#: main.c:377 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory 打å°å½“å‰ç›®å½•ã€‚\n" + +#: main.c:379 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr " --no-print-directory 关闭 -w,å³ä½¿ -w 默认开å¯ã€‚\n" + +#: main.c:381 +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" + +#: main.c:384 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr " --warn-undefined-variables 当引用未定义å˜é‡çš„时候å‘出警告。\n" + +#: main.c:654 +msgid "empty string invalid as file name" +msgstr "空字符串是无效的文件å" + +#: main.c:737 +#, fuzzy, c-format +msgid "unknown debug level specification '%s'" +msgstr "未知的调试级别“%sâ€" + +#: main.c:774 +#, c-format +msgid "unknown output-sync type '%s'" +msgstr "" + +#: main.c:828 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s:æ•èŽ·ä¸­æ–­/异常 (ä»£ç  = 0x%lx, åœ°å€ = 0x%lx)\n" + +#: main.c:835 +#, 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" +"å¼‚å¸¸ç  = %lx\n" +"异常标志 = %lx\n" +"å¼‚å¸¸åœ°å€ = %lx\n" + +#: main.c:843 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "访问冲çªï¼šåœ°å€ %lx 处的写æ“作\n" + +#: main.c:844 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "访问冲çªï¼šåœ°å€ %lx处的读æ“作\n" + +#: main.c:920 main.c:935 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell 设置 default_shell = %s\n" + +#: main.c:988 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell 路径æœç´¢ç»“果设置 default_shell = %s\n" + +#: main.c:1436 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s 正在挂起 30 秒..." + +#: main.c:1438 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "ç¡çœ å®Œæˆ(30)。继续。\n" + +#: main.c:1527 +#, c-format +msgid "" +"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)" +msgstr "" + +#: main.c:1530 +#, c-format +msgid "Jobserver client (semaphore %s)\n" +msgstr "" + +#: main.c:1534 +#, fuzzy, c-format +msgid "internal error: invalid --jobserver-fds string '%s'" +msgstr "内部错误:éžæ³• --jobserver-fds 字符串“%sâ€" + +#: main.c:1537 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1551 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "警告: å­ make 中强制 -jN: 关闭 jobserver 模å¼ã€‚" + +#: main.c:1567 +msgid "dup jobserver" +msgstr "å¤åˆ¶ä»»åŠ¡æœåŠ¡å™¨" + +#: main.c:1570 +#, fuzzy +msgid "" +"warning: jobserver unavailable: using -j1. Add '+' to parent make rule." +msgstr "警告: jobserver ä¸å­˜åœ¨: 使用 -j1。添加 “+†到父 make 的规则。" + +#: main.c:1742 +msgid "Makefile from standard input specified twice." +msgstr "两次指明æ¥è‡ªæ ‡å‡†è¾“入的 makefile。" + +#: main.c:1780 vmsjobs.c:653 +msgid "fopen (temporary file)" +msgstr "fopen (临时文件)" + +#: main.c:1786 +msgid "fwrite (temporary file)" +msgstr "fwrite (临时文件)" + +#: main.c:1974 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "本平å°ä¸æ”¯æŒå¹¶è¡Œä»»åŠ¡ (-j)。" + +#: main.c:1975 +msgid "Resetting to single job (-j1) mode." +msgstr "é‡ç½®ä¸ºå•ä»»åŠ¡æ¨¡å¼ (-j1)。" + +#: main.c:1994 +#, c-format +msgid "Jobserver slots limited to %d\n" +msgstr "" + +#: main.c:2002 +#, c-format +msgid "creating jobserver semaphore: (Error %ld: %s)" +msgstr "" + +#: main.c:2008 +msgid "creating jobs pipe" +msgstr "正在创建任务管é“" + +#: main.c:2028 +msgid "init jobserver pipe" +msgstr "创始化任务æœåŠ¡å™¨ç®¡é“" + +#: main.c:2047 +msgid "Symbolic links not supported: disabling -L." +msgstr "ä¸æ”¯æŒè½¯é“¾æŽ¥: 关闭 -L" + +#: main.c:2133 +msgid "Updating makefiles....\n" +msgstr "正在更新 makefile....\n" + +#: main.c:2158 +#, fuzzy, c-format +msgid "Makefile '%s' might loop; not remaking it.\n" +msgstr "Makefile “%sâ€å¯èƒ½å¾ªçŽ¯ï¼›ä¸ä¼šé‡æ–°åˆ›å»ºå®ƒã€‚\n" + +#: main.c:2237 +#, fuzzy, c-format +msgid "Failed to remake makefile '%s'." +msgstr "é‡æ–°åˆ›å»º makefile “%s†失败。" + +#: main.c:2257 +#, fuzzy, c-format +msgid "Included makefile '%s' was not found." +msgstr "找ä¸åˆ°è¢«å¼•å…¥çš„ makefile “%sâ€" + +#: main.c:2262 +#, fuzzy, c-format +msgid "Makefile '%s' was not found" +msgstr "找ä¸åˆ° makefile “%sâ€" + +#: main.c:2330 +msgid "Couldn't change back to original directory." +msgstr "无法回到原始目录。" + +#: main.c:2343 +#, c-format +msgid "Re-executing[%u]:" +msgstr "é‡æ–°æ‰§è¡Œ[%u]:" + +#: main.c:2453 +msgid "unlink (temporary file): " +msgstr "删除 (临时文件):" + +#: main.c:2486 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL 包å«å¤šä½™ä¸€ä¸ªç›®æ ‡" + +#: main.c:2509 +msgid "No targets specified and no makefile found" +msgstr "没有指明目标并且找ä¸åˆ° makefile" + +#: main.c:2511 +msgid "No targets" +msgstr "无目标" + +#: main.c:2516 +msgid "Updating goal targets....\n" +msgstr "更新目标....\n" + +#: main.c:2541 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "警告:检测到时钟错误。您的创建å¯èƒ½æ˜¯ä¸å®Œæ•´çš„。" + +#: main.c:2710 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "用法:%s [选项] [目标] ...\n" + +#: main.c:2716 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"该程åºä¸º %s 编译\n" + +#: main.c:2718 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"该程åºä¸º %s (%s) 编译\n" + +#: main.c:2721 +#, c-format +msgid "Report bugs to \n" +msgstr "报告错误到 \n" + +#: main.c:2807 +#, fuzzy, c-format +msgid "the '%s%s' option requires a non-empty string argument" +msgstr "“-%câ€é€‰é¡¹éœ€è¦éžç©ºå­—符串å‚æ•°" + +#: main.c:2871 +#, fuzzy, c-format +msgid "the '-%c' option requires a positive integer argument" +msgstr "“-%câ€é€‰é¡¹éœ€è¦æ­£æ•´æ•°å‚æ•°" + +#: main.c:3269 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%s该程åºä¸º %s 编译\n" + +#: main.c:3271 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%s该程åºä¸º %s (%s) 编译\n" + +#: main.c:3282 +#, 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 "" + +#: main.c:3303 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# make æ•°æ®åŸºç¡€ï¼Œæ‰“å°åœ¨ %s" + +#: main.c:3313 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# 在 %s ä¸Šå®Œæˆ make æ•°æ®åŸºç¡€\n" + +#: misc.c:201 +#, c-format +msgid "Unknown error %d" +msgstr "未知错误 %d" + +#: misc.c:522 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: 用户 %lu (真实用户 %lu), 组 %lu (真实组 %lu)\n" + +#: misc.c:543 +msgid "Initialized access" +msgstr "åˆå§‹åŒ–æˆåŠŸ" + +#: misc.c:622 +msgid "User access" +msgstr "用户æƒé™" + +#: misc.c:670 +msgid "Make access" +msgstr "Make æƒé™" + +#: misc.c:704 +msgid "Child access" +msgstr "å­è¿›ç¨‹ æƒé™" + +#: output.c:104 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: 进入一个未知的目录\n" + +#: output.c:106 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: 离开一个未知的目录\n" + +#: output.c:109 +#, fuzzy, c-format +msgid "%s: Entering directory '%s'\n" +msgstr "%s: 进入目录“%sâ€\n" + +#: output.c:111 +#, fuzzy, c-format +msgid "%s: Leaving directory '%s'\n" +msgstr "%s: 离开目录“%sâ€\n" + +#: output.c:115 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: 进入一个未知的目录\n" + +#: output.c:117 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: 离开一个未知的目录\n" + +#: output.c:120 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory '%s'\n" +msgstr "%s[%u]: 进入目录“%sâ€\n" + +#: output.c:122 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory '%s'\n" +msgstr "%s[%u]: 离开目录“%sâ€\n" + +#: output.c:495 output.c:497 +#, fuzzy +msgid "write error: stdout" +msgstr "写错误: %s" + +#: output.c:677 +msgid ". Stop.\n" +msgstr "。 åœæ­¢ã€‚\n" + +#: output.c:711 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: output.c:720 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: read.c:180 +msgid "Reading makefiles...\n" +msgstr "正在读入 makefiles...\n" + +#: read.c:335 +#, fuzzy, c-format +msgid "Reading makefile '%s'" +msgstr "正在读入 makefile “%sâ€" + +#: read.c:337 +#, c-format +msgid " (no default goal)" +msgstr " (没有缺çœç›®æ ‡)" + +#: read.c:339 +#, c-format +msgid " (search path)" +msgstr " (æœç´¢è·¯å¾„)" + +#: read.c:341 +#, c-format +msgid " (don't care)" +msgstr " (ä¸ç”¨ç†)" + +#: read.c:343 +#, c-format +msgid " (no ~ expansion)" +msgstr " (没有 ~ 扩展)" + +#: read.c:656 +#, c-format +msgid "Skipping UTF-8 BOM in makefile '%s'\n" +msgstr "" + +#: read.c:659 +#, c-format +msgid "Skipping UTF-8 BOM in makefile buffer\n" +msgstr "" + +#: read.c:789 +msgid "invalid syntax in conditional" +msgstr "æ¡ä»¶ä¸­å«æœ‰æ— æ•ˆè¯­æ³•" + +#: read.c:966 +#, c-format +msgid "%s: failed to load" +msgstr "" + +#: read.c:992 +#, fuzzy +msgid "recipe commences before first target" +msgstr "命令在第一个目标å‰å¼€å§‹" + +#: read.c:1041 +#, fuzzy +msgid "missing rule before recipe" +msgstr "命令之å‰é—æ¼äº†è§„则" + +#: read.c:1131 +#, fuzzy +msgid "missing separator (did you mean TAB instead of 8 spaces?)" +msgstr " (您的æ„æ€æ˜¯ç”¨ TAB 代替 8 个空格?)" + +#: read.c:1133 +#, fuzzy +msgid "missing separator" +msgstr "é—æ¼åˆ†éš”符 %s" + +#: read.c:1270 +msgid "missing target pattern" +msgstr "无目标匹é…" + +#: read.c:1272 +msgid "multiple target patterns" +msgstr "多个目标匹é…" + +#: read.c:1276 +#, fuzzy, c-format +msgid "target pattern contains no '%%'" +msgstr "目标模å¼ä¸å«æœ‰â€œ%%â€" + +#: read.c:1398 +#, fuzzy +msgid "missing 'endif'" +msgstr "é—æ¼â€œendifâ€" + +#: read.c:1436 read.c:1481 variable.c:1546 +msgid "empty variable name" +msgstr "空å˜é‡å" + +#: read.c:1471 +#, fuzzy +msgid "extraneous text after 'define' directive" +msgstr "“endefâ€æŒ‡ä»¤åŽå«æœ‰ä¸è¯¥å‡ºçŽ°çš„文字" + +#: read.c:1496 +#, fuzzy +msgid "missing 'endef', unterminated 'define'" +msgstr "é—æ¼â€œendefâ€ï¼Œæœªç»ˆæ­¢çš„“defineâ€" + +#: read.c:1524 +#, fuzzy +msgid "extraneous text after 'endef' directive" +msgstr "“endefâ€æŒ‡ä»¤åŽå«æœ‰ä¸è¯¥å‡ºçŽ°çš„文字" + +#: read.c:1595 +#, fuzzy, c-format +msgid "extraneous text after '%s' directive" +msgstr "在“%sâ€æŒ‡ä»¤ä¹‹åŽå«æœ‰ä¸è¯¥å‡ºçŽ°çš„文字" + +#: read.c:1596 +#, fuzzy, c-format +msgid "extraneous '%s'" +msgstr "ä¸è¯¥å‡ºçŽ°çš„“%sâ€" + +#: read.c:1624 +#, fuzzy +msgid "only one 'else' per conditional" +msgstr "æ¯ä¸ªæ¡ä»¶åªèƒ½æœ‰ä¸€ä¸ªâ€œelseâ€" + +#: read.c:1899 +msgid "Malformed target-specific variable definition" +msgstr "畸形的针对目标的标é‡å®šä¹‰" + +#: read.c:1957 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "ä¾èµ–无法在命令脚本中定义" + +#: read.c:2015 +msgid "mixed implicit and static pattern rules" +msgstr "混和的éšå«å’Œé™æ€æ¨¡å¼è§„则" + +#: read.c:2038 +msgid "mixed implicit and normal rules" +msgstr "混和的éšå«å’Œæ™®é€šè§„则" + +#: read.c:2091 +#, fuzzy, c-format +msgid "target '%s' doesn't match the target pattern" +msgstr "目标“%sâ€ä¸åŒ¹é…目标模å¼" + +#: read.c:2106 read.c:2152 +#, fuzzy, c-format +msgid "target file '%s' has both : and :: entries" +msgstr "目标文件“%sâ€å«æœ‰ : å’Œ :: 两ç§æ¡ç›®" + +#: read.c:2112 +#, fuzzy, c-format +msgid "target '%s' given more than once in the same rule" +msgstr "目标“%sâ€åœ¨åŒä¸€ä¸ªè§„则中给出了多次。" + +#: read.c:2122 +#, fuzzy, c-format +msgid "warning: overriding recipe for target '%s'" +msgstr "警告:覆盖关于目标“%sâ€çš„命令" + +#: read.c:2125 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target '%s'" +msgstr "警告:忽略关于目标“%sâ€çš„旧命令" + +#: read.c:2229 +#, fuzzy +msgid "*** mixed implicit and normal rules: deprecated syntax" +msgstr "混和的éšå«å’Œæ™®é€šè§„则" + +#: read.c:2539 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "警告:é‡åˆ°äº† NUL 字符;忽略行的剩余部分" + +#: remake.c:230 +#, fuzzy, c-format +msgid "Nothing to be done for '%s'." +msgstr "对“%sâ€æ— éœ€åšä»»ä½•äº‹ã€‚" + +#: remake.c:231 +#, fuzzy, c-format +msgid "'%s' is up to date." +msgstr "“%sâ€æ˜¯æœ€æ–°çš„。" + +#: remake.c:303 +#, fuzzy, c-format +msgid "Pruning file '%s'.\n" +msgstr "正在删除文件“%sâ€ã€‚\n" + +#: remake.c:390 remake.c:393 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s', needed by '%s'%s" +msgstr "%1$s没有规则å¯ä»¥åˆ›å»ºâ€œ%3$sâ€%4$s需è¦çš„目标“%2$sâ€" + +#: remake.c:402 remake.c:405 +#, fuzzy, c-format +msgid "%sNo rule to make target '%s'%s" +msgstr "%s没有规则å¯ä»¥åˆ›å»ºç›®æ ‡â€œ%sâ€%s" + +#: remake.c:426 +#, fuzzy, c-format +msgid "Considering target file '%s'.\n" +msgstr "正在考虑目标文件“%sâ€ã€‚\n" + +#: remake.c:433 +#, fuzzy, c-format +msgid "Recently tried and failed to update file '%s'.\n" +msgstr "最近已å°è¯•è¿‡æ›´æ–°æ–‡ä»¶â€œ%sâ€å¹¶å¤±è´¥ã€‚\n" + +#: remake.c:445 +#, fuzzy, c-format +msgid "File '%s' was considered already.\n" +msgstr "已考虑过文件“%sâ€ã€‚\n" + +#: remake.c:455 +#, fuzzy, c-format +msgid "Still updating file '%s'.\n" +msgstr "ä»ç„¶åœ¨æ›´æ–°æ–‡ä»¶â€œ%sâ€ã€‚\n" + +#: remake.c:458 +#, fuzzy, c-format +msgid "Finished updating file '%s'.\n" +msgstr "更新文件“%sâ€å®Œæˆã€‚\n" + +#: remake.c:487 +#, fuzzy, c-format +msgid "File '%s' does not exist.\n" +msgstr "文件“%sâ€ä¸å­˜åœ¨ã€‚\n" + +#: remake.c:495 +#, fuzzy, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp" +msgstr "*** 警告: .LOW_RESOLUTION_TIME 文件 `%s' 有一个精细的时间标志" + +#: remake.c:508 remake.c:1040 +#, fuzzy, c-format +msgid "Found an implicit rule for '%s'.\n" +msgstr "找到一æ¡å…³äºŽâ€œ%sâ€çš„éšå«è§„则。\n" + +#: remake.c:510 remake.c:1042 +#, fuzzy, c-format +msgid "No implicit rule found for '%s'.\n" +msgstr "找ä¸åˆ°å…³äºŽâ€œ%sâ€çš„éšå«è§„则。\n" + +#: remake.c:516 +#, fuzzy, c-format +msgid "Using default recipe for '%s'.\n" +msgstr "使用关于“%sâ€çš„默认命令。\n" + +#: remake.c:550 remake.c:1089 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "放弃循环ä¾èµ– %s <- %s 。" + +#: remake.c:675 +#, fuzzy, c-format +msgid "Finished prerequisites of target file '%s'.\n" +msgstr "目标文件“%sâ€çš„å‰æ已完æˆã€‚\n" + +#: remake.c:681 +#, fuzzy, c-format +msgid "The prerequisites of '%s' are being made.\n" +msgstr "正在创建“%sâ€çš„å‰æ。\n" + +#: remake.c:695 +#, fuzzy, c-format +msgid "Giving up on target file '%s'.\n" +msgstr "放弃目标文件“%sâ€ã€‚\n" + +#: remake.c:700 +#, fuzzy, c-format +msgid "Target '%s' not remade because of errors." +msgstr "由于错误目标“%sâ€å¹¶æœªé‡æ–°åˆ›å»ºã€‚" + +#: remake.c:752 +#, fuzzy, c-format +msgid "Prerequisite '%s' is order-only for target '%s'.\n" +msgstr "“%sâ€æ˜¯ç›®æ ‡â€œ%sâ€çš„一个仅用于指定执行顺åº(order-only)çš„å‰æ。\n" + +#: remake.c:757 +#, fuzzy, c-format +msgid "Prerequisite '%s' of target '%s' does not exist.\n" +msgstr "目标“%2$sâ€çš„å‰æ“%1$sâ€ä¸å­˜åœ¨ã€‚\n" + +#: remake.c:762 +#, fuzzy, c-format +msgid "Prerequisite '%s' is newer than target '%s'.\n" +msgstr "å‰æ“%sâ€æ¯”目标“%sâ€æ–°ã€‚\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "Prerequisite '%s' is older than target '%s'.\n" +msgstr "å‰æ“%sâ€æ¯”目标“%sâ€æ—§ã€‚\n" + +#: remake.c:783 +#, fuzzy, c-format +msgid "Target '%s' is double-colon and has no prerequisites.\n" +msgstr "目标“%sâ€æ˜¯åŒå†’å·ç›®æ ‡å¹¶ä¸”没有å‰æ。\n" + +#: remake.c:790 +#, fuzzy, c-format +msgid "No recipe for '%s' and no prerequisites actually changed.\n" +msgstr "没有关于“%sâ€çš„命令,并且实际上改å˜äº†çš„å‰æ。\n" + +#: remake.c:795 +#, fuzzy, c-format +msgid "Making '%s' due to always-make flag.\n" +msgstr "由于 always-make 标志所以 make “%sâ€ã€‚\n" + +#: remake.c:803 +#, fuzzy, c-format +msgid "No need to remake target '%s'" +msgstr "ä¸éœ€è¦é‡æ–°åˆ›å»ºç›®æ ‡â€œ%sâ€" + +#: remake.c:805 +#, fuzzy, c-format +msgid "; using VPATH name '%s'" +msgstr ";使用 VPATH å称“%sâ€" + +#: remake.c:825 +#, fuzzy, c-format +msgid "Must remake target '%s'.\n" +msgstr "å¿…é¡»é‡æ–°åˆ›å»ºç›®æ ‡â€œ%sâ€ã€‚\n" + +#: remake.c:831 +#, fuzzy, c-format +msgid " Ignoring VPATH name '%s'.\n" +msgstr " 忽略 VPATH å称 `%s'。\n" + +#: remake.c:840 +#, fuzzy, c-format +msgid "Recipe of '%s' is being run.\n" +msgstr "“%sâ€çš„命令正在被执行。\n" + +#: remake.c:847 +#, fuzzy, c-format +msgid "Failed to remake target file '%s'.\n" +msgstr "é‡æ–°åˆ›å»ºç›®æ ‡æ–‡ä»¶â€œ%sâ€å¤±è´¥ã€‚\n" + +#: remake.c:850 +#, fuzzy, c-format +msgid "Successfully remade target file '%s'.\n" +msgstr "é‡æ–°åˆ›å»ºç›®æ ‡æ–‡ä»¶â€œ%sâ€æˆåŠŸã€‚\n" + +#: remake.c:853 +#, fuzzy, c-format +msgid "Target file '%s' needs to be remade under -q.\n" +msgstr "目标文件“%sâ€éœ€è¦ä»¥ -q 选项é‡æ–°åˆ›å»ºã€‚\n" + +#: remake.c:1048 +#, fuzzy, c-format +msgid "Using default commands for '%s'.\n" +msgstr "使用关于“%sâ€çš„默认命令。\n" + +#: remake.c:1397 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time in the future" +msgstr "警告:文件“%sâ€çš„修改时间在未æ¥" + +#: remake.c:1411 +#, fuzzy, c-format +msgid "Warning: File '%s' has modification time %s s in the future" +msgstr "警告:文件“%sâ€çš„修改时间在 %.2g 秒åŽ" + +#: remake.c:1610 +#, fuzzy, c-format +msgid ".LIBPATTERNS element '%s' is not a pattern" +msgstr ".LIBPATTERNS 的元素“%sâ€ä¸æ˜¯ä¸€ä¸ªæ¨¡å¼" + +#: remote-cstms.c:122 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "用户ä¸å¸Œæœ›å¯¼å‡ºï¼š%s\n" + +#: rule.c:495 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# éšå«è§„则。" + +#: rule.c:510 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# 没有éšå«è§„则。" + +#: rule.c:513 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u æ¡éšå«è§„则,%u" + +#: rule.c:522 +msgid " terminal." +msgstr " 终端。" + +#: rule.c:530 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "错误:num_pattern_rules 出错ï¼%u != %u" + +#: signame.c:84 +msgid "unknown signal" +msgstr "未知的信å·" + +#: signame.c:92 +msgid "Hangup" +msgstr "挂起" + +#: signame.c:95 +msgid "Interrupt" +msgstr "中断" + +#: signame.c:98 +msgid "Quit" +msgstr "退出" + +#: signame.c:101 +msgid "Illegal Instruction" +msgstr "éžæ³•æŒ‡ä»¤" + +#: signame.c:104 +msgid "Trace/breakpoint trap" +msgstr "跟踪/断点陷阱" + +#: signame.c:109 +msgid "Aborted" +msgstr "已失败" + +#: signame.c:112 +msgid "IOT trap" +msgstr "IOT 陷阱" + +#: signame.c:115 +msgid "EMT trap" +msgstr "EMT 陷阱" + +#: signame.c:118 +msgid "Floating point exception" +msgstr "浮点数异常" + +#: signame.c:121 +msgid "Killed" +msgstr "å·²æ€æ­»" + +#: signame.c:124 +msgid "Bus error" +msgstr "总线错误" + +#: signame.c:127 +msgid "Segmentation fault" +msgstr "段错误" + +#: signame.c:130 +msgid "Bad system call" +msgstr "错误的系统调用" + +#: signame.c:133 +msgid "Broken pipe" +msgstr "断开的管é“" + +#: signame.c:136 +msgid "Alarm clock" +msgstr "闹钟" + +#: signame.c:139 +msgid "Terminated" +msgstr "已终止" + +#: signame.c:142 +msgid "User defined signal 1" +msgstr "ç”¨æˆ·å®šä¹‰ä¿¡å· 1" + +#: signame.c:145 +msgid "User defined signal 2" +msgstr "ç”¨æˆ·å®šä¹‰ä¿¡å· 2" + +#: signame.c:150 signame.c:153 +msgid "Child exited" +msgstr "å­è¿›ç¨‹å·²é€€å‡º" + +#: signame.c:156 +msgid "Power failure" +msgstr "电æºå¤±æ•ˆ" + +#: signame.c:159 +msgid "Stopped" +msgstr "å·²åœæ­¢" + +#: signame.c:162 +msgid "Stopped (tty input)" +msgstr "å·²åœæ­¢ (tty 输入)" + +#: signame.c:165 +msgid "Stopped (tty output)" +msgstr "å·²åœæ­¢ (tty 输出)" + +#: signame.c:168 +msgid "Stopped (signal)" +msgstr "å·²åœæ­¢ (ä¿¡å·)" + +#: signame.c:171 +msgid "CPU time limit exceeded" +msgstr "CPU 时间超出é™åˆ¶" + +#: signame.c:174 +msgid "File size limit exceeded" +msgstr "文件大å°è¶…出é™åˆ¶" + +#: signame.c:177 +msgid "Virtual timer expired" +msgstr "虚拟时钟超时" + +#: signame.c:180 +msgid "Profiling timer expired" +msgstr "测试时钟超市" + +#: signame.c:186 +msgid "Window changed" +msgstr "窗å£å·²æ”¹å˜" + +#: signame.c:189 +msgid "Continued" +msgstr "继续" + +#: signame.c:192 +msgid "Urgent I/O condition" +msgstr "紧急 I/O æ¡ä»¶" + +#: signame.c:199 signame.c:208 +msgid "I/O possible" +msgstr "I/O å¯è¡Œ" + +#: signame.c:202 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:205 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:211 +msgid "Resource lost" +msgstr "资æºä¸¢å¤±" + +#: signame.c:214 +msgid "Danger signal" +msgstr "å±é™©ä¿¡å·" + +#: signame.c:217 +msgid "Information request" +msgstr "ä¿¡æ¯è¯·æ±‚" + +#: signame.c:220 +msgid "Floating point co-processor not available" +msgstr "浮点数å处ç†å™¨ä¸å¯ç”¨" + +#: strcache.c:236 +#, fuzzy, c-format +msgid "" +"\n" +"%s No strcache buffers\n" +msgstr "%s strcache 缓冲区数é‡: %d\n" + +#: strcache.c:266 +#, fuzzy, c-format +msgid "" +"\n" +"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu " +"B\n" +msgstr "%s strcache 剩余: 总共 = %d / 最大 = %d / æœ€å° = %d / å¹³å‡ = %d\n" + +#: strcache.c:270 +#, c-format +msgid "" +"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n" +msgstr "" + +#: strcache.c:280 +#, fuzzy, c-format +msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n" +msgstr "%s strcache 大å°: 总共 = %d / 最大 = %d / æœ€å° = %d / å¹³å‡ = %d\n" + +#: strcache.c:283 +#, fuzzy, c-format +msgid "" +"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n" +msgstr "%s strcache 剩余: 总共 = %d / 最大 = %d / æœ€å° = %d / å¹³å‡ = %d\n" + +#: strcache.c:287 +#, c-format +msgid "" +"\n" +"%s strcache performance: lookups = %lu / hit rate = %lu%%\n" +msgstr "" + +#: strcache.c:289 +#, fuzzy +msgid "" +"# hash-table stats:\n" +"# " +msgstr "" +"\n" +"# 文件æ‚凑表状æ€:\n" +"# " + +#: variable.c:1599 +msgid "automatic" +msgstr "自动" + +#: variable.c:1602 +msgid "default" +msgstr "默认" + +#: variable.c:1605 +msgid "environment" +msgstr "环境" + +#: variable.c:1608 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1611 +msgid "environment under -e" +msgstr "-e 指定的环境å˜é‡" + +#: variable.c:1614 +msgid "command line" +msgstr "命令行" + +#: variable.c:1617 +#, fuzzy +msgid "'override' directive" +msgstr "“overrideâ€æŒ‡ä»¤" + +#: variable.c:1628 +#, fuzzy, c-format +msgid " (from '%s', line %lu)" +msgstr " (从“%sâ€ï¼Œè¡Œ %lu)" + +#: variable.c:1691 +msgid "# variable set hash-table stats:\n" +msgstr "# å˜é‡çš„æ‚凑表状æ€:\n" + +#: variable.c:1702 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# å˜é‡\n" + +#: variable.c:1706 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Pattern-specific å˜é‡å€¼" + +#: variable.c:1720 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# 没有 pattern-specific å˜é‡çš„值。" + +#: variable.c:1722 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u 个 pattern-specific å˜é‡çš„值" + +#: variable.h:224 +#, fuzzy, c-format +msgid "warning: undefined variable '%.*s'" +msgstr "警告:未定义的å˜é‡â€œ%.*sâ€" + +#: vmsfunctions.c:91 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search 失败并返回 %d\n" + +#: vmsjobs.c:72 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "警告:空的é‡å®šå‘\n" + +#: vmsjobs.c:183 +#, fuzzy, c-format +msgid "internal error: '%s' command_state" +msgstr "内部错误:“%s†command_state" + +#: vmsjobs.c:290 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-警告, ä½ å¯èƒ½å¿…须从 DCL é‡æ–°å¯ç”¨ CTRL-Y。\n" + +#: vmsjobs.c:455 vmsjobs.c:559 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:465 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:501 +#, fuzzy, c-format +msgid "BUILTIN ECHO %s->%s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:505 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "未知的内置命令“%sâ€\n" + +#: vmsjobs.c:592 +#, c-format +msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n" +msgstr "" + +#: vmsjobs.c:643 +#, c-format +msgid "Error, empty command\n" +msgstr "错误,空命令\n" + +#: vmsjobs.c:674 +#, c-format +msgid "Redirected input from %s\n" +msgstr "æ¥è‡ª %s çš„é‡å®šå‘输入\n" + +#: vmsjobs.c:681 +#, c-format +msgid "Redirected error to %s\n" +msgstr "到 %s çš„é‡å®šå‘错误输出\n" + +#: vmsjobs.c:690 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "到 %s çš„é‡å®šå‘输出\n" + +#: vmsjobs.c:696 +#, c-format +msgid "Redirected output to %s\n" +msgstr "到 %s çš„é‡å®šå‘输出\n" + +#: vmsjobs.c:802 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:809 +#, c-format +msgid "Executing %s instead\n" +msgstr "执行 %s 作为替代\n" + +#: vmsjobs.c:915 +#, c-format +msgid "Error spawning, %d\n" +msgstr "错误产生,%d\n" + +#: vpath.c:583 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH æœç´¢è·¯å¾„\n" + +#: vpath.c:600 +#, fuzzy +msgid "# No 'vpath' search paths." +msgstr "# 没有“vpathâ€æœç´¢è·¯å¾„。" + +#: vpath.c:602 +#, fuzzy, c-format +msgid "" +"\n" +"# %u 'vpath' search paths.\n" +msgstr "" +"\n" +"# %u “vpathâ€æœç´¢è·¯å¾„。\n" + +#: vpath.c:605 +#, fuzzy +msgid "" +"\n" +"# No general ('VPATH' variable) search path." +msgstr "" +"\n" +"# 没有通用æœç´¢è·¯å¾„(“VPATHâ€å˜é‡)。" + +#: vpath.c:611 +#, fuzzy +msgid "" +"\n" +"# General ('VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# 通用æœç´¢è·¯å¾„(“VPATHâ€å˜é‡):\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/read.c b/read.c new file mode 100644 index 0000000..6ff4bcc --- /dev/null +++ b/read.c @@ -0,0 +1,3354 @@ +/* Reading and parsing of makefiles for GNU Make. +Copyright (C) 1988-2014 Free 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 "filedef.h" +#include "dep.h" +#include "job.h" +#include "commands.h" +#include "variable.h" +#include "rule.h" +#include "debug.h" +#include "hash.h" + + +#ifdef WINDOWS32 +#include +#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. */ + unsigned int size; /* Malloc'd size of buffer. */ + FILE *fp; /* File, or NULL if this is an internal buffer. */ + gmk_floc floc; /* Info on the file in fp (if any). */ + }; + +/* Track the modifiers we can have on variable assignments */ + +struct vmodifiers + { + unsigned int assign_v:1; + unsigned int define_v:1; + unsigned int undefine_v:1; + unsigned int export_v:1; + unsigned int override_v:1; + unsigned int private_v:1; + }; + +/* Types of "words" that can be read in a makefile. */ +enum make_word_type + { + w_bogus, w_eol, w_static, w_variable, w_colon, w_dcolon, w_semicolon, + w_varassign + }; + + +/* A 'struct conditionals' contains the information describing + all the active conditionals in a makefile. + + The global variable 'conditionals' contains the conditionals + information for the current makefile. It is initialized from + the static structure 'toplevel_conditionals' and is later changed + to new structures for included makefiles. */ + +struct conditionals + { + unsigned int if_cmds; /* Depth of conditional nesting. */ + unsigned int allocated; /* Elts allocated in following arrays. */ + char *ignoring; /* Are we ignoring or interpreting? + 0=interpreting, 1=not yet interpreted, + 2=already interpreted */ + char *seen_else; /* Have we already seen an 'else'? */ + }; + +static struct conditionals toplevel_conditionals; +static struct conditionals *conditionals = &toplevel_conditionals; + + +/* Default directories to search for include files in */ + +static const char *default_include_directories[] = + { +#if defined(WINDOWS32) && !defined(INCLUDEDIR) +/* This completely up to the user when they install MSVC or other packages. + This is defined as a placeholder. */ +# define INCLUDEDIR "." +#endif + INCLUDEDIR, +#ifndef _AMIGA + "/usr/gnu/include", + "/usr/local/include", + "/usr/include", +#endif + 0 + }; + +/* List of directories to search for include files in */ + +static const char **include_directories; + +/* Maximum length of an element of the above. */ + +static unsigned int max_incl_len; + +/* The filename and pointer to line number of the + makefile currently being read in. */ + +const gmk_floc *reading_file = 0; + +/* The chain of files read by read_all_makefiles. */ + +static struct dep *read_files = 0; + +static int eval_makefile (const char *filename, int flags); +static void eval (struct ebuffer *buffer, int flags); + +static long readline (struct ebuffer *ebuf); +static void do_undefine (char *name, enum variable_origin origin, + struct ebuffer *ebuf); +static struct variable *do_define (char *name, enum variable_origin origin, + struct ebuffer *ebuf); +static int conditional_line (char *line, int len, const gmk_floc *flocp); +static void record_files (struct nameseq *filenames, const char *pattern, + const char *pattern_percent, char *depstr, + unsigned int cmds_started, char *commands, + unsigned int commands_idx, int two_colon, + char prefix, const gmk_floc *flocp); +static void record_target_var (struct nameseq *filenames, char *defn, + enum variable_origin origin, + struct vmodifiers *vmod, + const gmk_floc *flocp); +static enum make_word_type get_next_mword (char *buffer, char *delim, + char **startp, unsigned int *length); +static void remove_comments (char *line); +static char *find_char_unquote (char *string, int map); +static char *unescape_char (char *string, int c); + + +/* Compare a word, both length and contents. + P must point to the word to be tested, and WLEN must be the length. +*/ +#define word1eq(s) (wlen == CSTRLEN (s) && strneq (s, p, CSTRLEN (s))) + + +/* Read in all the makefiles and return a chain of targets to rebuild. */ + +struct dep * +read_all_makefiles (const char **makefiles) +{ + unsigned int num_makefiles = 0; + + /* Create *_LIST variables, to hold the makefiles, targets, and variables + we will be reading. */ + + define_variable_cname ("MAKEFILE_LIST", "", o_file, 0); + + DB (DB_BASIC, (_("Reading makefiles...\n"))); + + /* If there's a non-null variable MAKEFILES, its value is a list of + files to read first thing. But don't let it prevent reading the + default makefiles and don't let the default goal come from there. */ + + { + char *value; + char *name, *p; + unsigned int length; + + { + /* Turn off --warn-undefined-variables while we expand MAKEFILES. */ + int save = warn_undefined_variables_flag; + warn_undefined_variables_flag = 0; + + value = allocated_variable_expand ("$(MAKEFILES)"); + + warn_undefined_variables_flag = save; + } + + /* Set NAME to the start of next token and LENGTH to its length. + MAKEFILES is updated for finding remaining tokens. */ + p = value; + + while ((name = find_next_token ((const char **)&p, &length)) != 0) + { + if (*p != '\0') + *p++ = '\0'; + eval_makefile (name, RM_NO_DEFAULT_GOAL|RM_INCLUDED|RM_DONTCARE); + } + + free (value); + } + + /* Read makefiles specified with -f switches. */ + + if (makefiles != 0) + while (*makefiles != 0) + { + struct dep *tail = read_files; + struct dep *d; + + if (! eval_makefile (*makefiles, 0)) + perror_with_name ("", *makefiles); + + /* Find the first element eval_makefile() added to read_files. */ + d = read_files; + while (d->next != tail) + d = d->next; + + /* 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' */ + { "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) + { + if (! eval_makefile (*p, 0)) + 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 dep *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 dep *d = alloc_dep (); + d->file = enter_file (strcache_add (*p)); + d->dontcare = 1; + /* 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->changed = 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 int +eval_makefile (const char *filename, int flags) +{ + struct dep *deps; + struct ebuffer ebuf; + const gmk_floc *curfile; + char *expanded = 0; + int makefile_errno; + + ebuf.floc.filenm = filename; /* Use the original file name. */ + ebuf.floc.lineno = 1; + + if (ISDB (DB_VERBOSE)) + { + printf (_("Reading makefile '%s'"), filename); + if (flags & RM_NO_DEFAULT_GOAL) + printf (_(" (no default goal)")); + if (flags & RM_INCLUDED) + printf (_(" (search path)")); + if (flags & RM_DONTCARE) + printf (_(" (don't care)")); + if (flags & RM_NO_TILDE) + printf (_(" (no ~ expansion)")); + puts ("..."); + } + + /* First, get a stream to read. */ + + /* Expand ~ in FILENAME unless it came from 'include', + in which case it was already done. */ + if (!(flags & RM_NO_TILDE) && filename[0] == '~') + { + expanded = tilde_expand (filename); + if (expanded != 0) + filename = expanded; + } + + ENULLLOOP (ebuf.fp, fopen (filename, "r")); + + /* Save the error code so we print the right message later. */ + makefile_errno = errno; + + /* Check for unrecoverable errors: out of mem or FILE slots. */ + switch (makefile_errno) + { +#ifdef EMFILE + case EMFILE: +#endif +#ifdef ENFILE + case ENFILE: +#endif + case ENOMEM: + { + const char *err = strerror (makefile_errno); + OS (fatal, reading_file, "%s", err); + } + } + + /* If the makefile wasn't found and it's either a makefile from + the 'MAKEFILES' variable or an included makefile, + search the included makefile search path for this makefile. */ + if (ebuf.fp == 0 && (flags & RM_INCLUDED) && *filename != '/') + { + unsigned int i; + for (i = 0; include_directories[i] != 0; ++i) + { + const char *included = concat (3, include_directories[i], + "/", filename); + ebuf.fp = fopen (included, "r"); + if (ebuf.fp) + { + filename = included; + break; + } + } + } + + /* Now we have the final name for this makefile. Enter it into + the cache. */ + filename = strcache_add (filename); + + /* Add FILENAME to the chain of read makefiles. */ + deps = alloc_dep (); + deps->next = read_files; + read_files = deps; + deps->file = lookup_file (filename); + if (deps->file == 0) + deps->file = enter_file (filename); + filename = deps->file->name; + deps->changed = flags; + if (flags & RM_DONTCARE) + deps->dontcare = 1; + + free (expanded); + + /* If the makefile can't be found at all, give up entirely. */ + + if (ebuf.fp == 0) + { + /* If we did some searching, errno has the error from the last + attempt, rather from FILENAME itself. Restore it in case the + caller wants to use it in a message. */ + errno = makefile_errno; + return 0; + } + + /* Set close-on-exec to avoid leaking the makefile to children, such as + $(shell ...). */ +#ifdef HAVE_FILENO + CLOSE_ON_EXEC (fileno (ebuf.fp)); +#endif + + /* Add this makefile to the list. */ + do_variable_definition (&ebuf.floc, "MAKEFILE_LIST", filename, o_file, + f_append, 0); + + /* Evaluate the makefile */ + + ebuf.size = 200; + ebuf.buffer = ebuf.bufnext = ebuf.bufstart = xmalloc (ebuf.size); + + curfile = reading_file; + reading_file = &ebuf.floc; + + eval (&ebuf, !(flags & RM_NO_DEFAULT_GOAL)); + + reading_file = curfile; + + fclose (ebuf.fp); + + free (ebuf.bufstart); + alloca (0); + + return 1; +} + +void +eval_buffer (char *buffer, const gmk_floc *floc) +{ + struct ebuffer ebuf; + struct conditionals *saved; + struct conditionals new; + const gmk_floc *curfile; + + /* Evaluate the buffer */ + + ebuf.size = strlen (buffer); + ebuf.buffer = ebuf.bufnext = ebuf.bufstart = buffer; + ebuf.fp = NULL; + + if (floc) + ebuf.floc = *floc; + else if (reading_file) + ebuf.floc = *reading_file; + else + { + ebuf.floc.filenm = NULL; + ebuf.floc.lineno = 1; + } + + 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. */ + line = next_token (line); + if (*line == '\0') + return (char *)line; + + p = line; + while (1) + { + int wlen; + const char *p2; + struct variable v; + + p2 = parse_variable_definition (p, &v); + + /* If this is a variable assignment, we're done. */ + if (p2) + break; + + /* It's not a variable; see if it's a modifier. */ + p2 = end_of_token (p); + wlen = p2 - p; + + if (word1eq ("export")) + vmod->export_v = 1; + else if (word1eq ("override")) + vmod->override_v = 1; + else if (word1eq ("private")) + vmod->private_v = 1; + else if (word1eq ("define")) + { + /* We can't have modifiers after 'define' */ + vmod->define_v = 1; + p = next_token (p2); + break; + } + else if (word1eq ("undefine")) + { + /* We can't have modifiers after 'undefine' */ + vmod->undefine_v = 1; + p = next_token (p2); + break; + } + else + /* Not a variable or modifier: this is not a variable assignment. */ + return (char *)line; + + /* It was a modifier. Try the next word. */ + p = next_token (p2); + if (*p == '\0') + return (char *)line; + } + + /* Found a variable assignment or undefine. */ + vmod->assign_v = 1; + return (char *)p; +} + + +/* Read file FILENAME as a makefile and add its contents to the data base. + + SET_DEFAULT is true if we are allowed to set the default goal. */ + +static void +eval (struct ebuffer *ebuf, int set_default) +{ + char *collapsed = 0; + unsigned int collapsed_length = 0; + unsigned int commands_len = 200; + char *commands; + unsigned int commands_idx = 0; + unsigned int cmds_started, tgts_started; + int ignoring = 0, in_ignored_define = 0; + int no_targets = 0; /* Set when reading a rule without targets. */ + struct nameseq *filenames = 0; + char *depstr = 0; + long nlines = 0; + int two_colon = 0; + char prefix = cmd_prefix; + const char *pattern = 0; + const char *pattern_percent; + gmk_floc *fstart; + gmk_floc fi; + +#define record_waiting_files() \ + do \ + { \ + if (filenames != 0) \ + { \ + fi.lineno = tgts_started; \ + record_files (filenames, pattern, pattern_percent, depstr, \ + cmds_started, commands, commands_idx, two_colon, \ + prefix, &fi); \ + filenames = 0; \ + } \ + commands_idx = 0; \ + no_targets = 0; \ + pattern = 0; \ + } while (0) + + pattern_percent = 0; + cmds_started = tgts_started = 1; + + fstart = &ebuf->floc; + fi.filenm = ebuf->floc.filenm; + + /* Loop over lines in the file. + The strategy is to accumulate target names in FILENAMES, dependencies + in DEPS and commands in COMMANDS. These are used to define a rule + when the start of the next rule (or eof) is encountered. + + When you see a "continue" in the loop below, that means we are moving on + to the next line. If you see record_waiting_files(), then the statement + we are parsing also finishes the previous rule. */ + + commands = xmalloc (200); + + while (1) + { + unsigned int linelen; + char *line; + unsigned int wlen; + char *p; + char *p2; + struct vmodifiers vmod; + + /* At the top of this loop, we are starting a brand new line. */ + /* Grab the next line to be evaluated */ + ebuf->floc.lineno += nlines; + nlines = readline (ebuf); + + /* If there is nothing left to eval, we're done. */ + if (nlines < 0) + break; + + line = ebuf->buffer; + + /* If this is the first line, check for a UTF-8 BOM and skip it. */ + if (ebuf->floc.lineno == 1 && line[0] == (char)0xEF + && line[1] == (char)0xBB && line[2] == (char)0xBF) + { + line += 3; + if (ISDB(DB_BASIC)) + { + if (ebuf->floc.filenm) + printf (_("Skipping UTF-8 BOM in makefile '%s'\n"), + ebuf->floc.filenm); + else + printf (_("Skipping UTF-8 BOM in makefile buffer\n")); + } + } + + /* If this line is empty, skip it. */ + if (line[0] == '\0') + continue; + + linelen = strlen (line); + + /* Check for a shell command line first. + If it is not one, we can stop treating cmd_prefix specially. */ + if (line[0] == cmd_prefix) + { + if (no_targets) + /* Ignore the commands in a rule with no targets. */ + continue; + + /* If there is no preceding rule line, don't treat this line + as a command, even though it begins with a recipe prefix. + SunOS 4 make appears to behave this way. */ + + if (filenames != 0) + { + if (ignoring) + /* Yep, this is a shell command, and we don't care. */ + continue; + + if (commands_idx == 0) + cmds_started = ebuf->floc.lineno; + + /* Append this command line to the line being accumulated. + Skip the initial command prefix character. */ + if (linelen + commands_idx > commands_len) + { + commands_len = (linelen + commands_idx) * 2; + commands = xrealloc (commands, commands_len); + } + memcpy (&commands[commands_idx], line + 1, linelen - 1); + commands_idx += linelen - 1; + commands[commands_idx++] = '\n'; + continue; + } + } + + /* This line is not a shell command line. Don't worry about whitespace. + Get more space if we need it; we don't need to preserve the current + contents of the buffer. */ + + if (collapsed_length < linelen+1) + { + collapsed_length = linelen+1; + free (collapsed); + /* Don't need xrealloc: we don't need to preserve the content. */ + collapsed = xmalloc (collapsed_length); + } + strcpy (collapsed, line); + /* Collapse continuation lines. */ + collapse_continuations (collapsed); + remove_comments (collapsed); + + /* Get rid if starting space (including formfeed, vtab, etc.) */ + p = collapsed; + while (isspace ((unsigned char)*p)) + ++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; + + /* Variable assignment ends the previous rule. */ + record_waiting_files (); + + /* If we're ignoring then we're done now. */ + if (ignoring) + { + if (vmod.define_v) + in_ignored_define = 1; + continue; + } + + 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; + p2 = next_token (p2); + + /* If we're in an ignored define, skip this line (but maybe get out). */ + if (in_ignored_define) + { + /* See if this is an endef line (plus optional comment). */ + if (word1eq ("endef") && STOP_SET (*p2, MAP_COMMENT|MAP_NUL)) + in_ignored_define = 0; + + continue; + } + + /* Check for conditional state changes. */ + { + int i = conditional_line (p, wlen, fstart); + if (i != -2) + { + if (i == -1) + O (fatal, fstart, _("invalid syntax in conditional")); + + ignoring = i; + continue; + } + } + + /* Nothing to see here... move along. */ + if (ignoring) + continue; + + /* Manage the "export" keyword used outside of variable assignment + as well as "unexport". */ + if (word1eq ("export") || word1eq ("unexport")) + { + int exporting = *p == 'u' ? 0 : 1; + + /* Export/unexport ends the previous rule. */ + record_waiting_files (); + + /* (un)export by itself causes everything to be (un)exported. */ + if (*p2 == '\0') + export_all_variables = exporting; + else + { + unsigned int l; + const char *cp; + char *ap; + + /* Expand the line so we can use indirect and constructed + variable names in an (un)export command. */ + cp = ap = allocated_variable_expand (p2); + + for (p = find_next_token (&cp, &l); p != 0; + p = find_next_token (&cp, &l)) + { + struct variable *v = lookup_variable (p, l); + if (v == 0) + v = define_variable_global (p, l, "", o_file, 0, fstart); + v->export = exporting ? v_export : v_noexport; + } + + free (ap); + } + continue; + } + + /* Handle the special syntax for vpath. */ + if (word1eq ("vpath")) + { + const char *cp; + char *vpat; + unsigned int l; + + /* vpath ends the previous rule. */ + record_waiting_files (); + + cp = variable_expand (p2); + p = find_next_token (&cp, &l); + if (p != 0) + { + vpat = xstrndup (p, l); + p = find_next_token (&cp, &l); + /* No searchpath means remove all previous + selective VPATH's with the same pattern. */ + } + else + /* No pattern means remove all previous selective VPATH's. */ + vpat = 0; + construct_vpath_list (vpat, p); + free (vpat); + + continue; + } + + /* Handle include and variants. */ + if (word1eq ("include") || word1eq ("-include") || word1eq ("sinclude")) + { + /* We have found an 'include' line specifying a nested + makefile to be read at this point. */ + struct conditionals *save; + struct conditionals new_conditionals; + struct nameseq *files; + /* "-include" (vs "include") says no error if the file does not + exist. "sinclude" is an alias for this from SGI. */ + int noerror = (p[0] != 'i'); + + /* Include ends the previous rule. */ + record_waiting_files (); + + p = allocated_variable_expand (p2); + + /* If no filenames, it's a no-op. */ + if (*p == '\0') + { + free (p); + continue; + } + + /* Parse the list of file names. Don't expand archive references! */ + p2 = p; + files = PARSE_FILE_SEQ (&p2, struct nameseq, MAP_NUL, NULL, + PARSEFS_NOAR); + free (p); + + /* Save the state of conditionals and start + the included makefile with a clean slate. */ + save = install_conditionals (&new_conditionals); + + /* Record the rules that are waiting so they will determine + the default goal before those in the included makefile. */ + record_waiting_files (); + + /* Read each included makefile. */ + while (files != 0) + { + struct nameseq *next = files->next; + const char *name = files->name; + int r; + + free_ns (files); + files = next; + + r = eval_makefile (name, + (RM_INCLUDED | RM_NO_TILDE + | (noerror ? RM_DONTCARE : 0) + | (set_default ? 0 : RM_NO_DEFAULT_GOAL))); + if (!r && !noerror) + { + const char *err = strerror (errno); + OSS (error, fstart, "%s: %s", name, err); + } + } + + /* 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 dep *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_dep (); + deps->next = read_files; + read_files = deps; + deps->file = lookup_file (name); + if (deps->file == 0) + deps->file = enter_file (name); + deps->file->loaded = 1; + } + + continue; + } + + /* This line starts with a tab but was not caught above because there + was no preceding target, and the line might have been usable as a + variable definition. But now we know it is definitely lossage. */ + if (line[0] == cmd_prefix) + O (fatal, fstart, _("recipe commences before first target")); + + /* This line describes some target files. This is complicated by + the existence of target-specific variables, because we can't + expand the entire line until we know if we have one or not. So + we expand the line word by word until we find the first ':', + then check to see if it's a target-specific variable. + + In this algorithm, 'lb_next' will point to the beginning of the + unexpanded parts of the input buffer, while 'p2' points to the + parts of the expanded buffer we haven't searched yet. */ + + { + enum make_word_type wtype; + char *cmdleft, *semip, *lb_next; + unsigned int plen = 0; + char *colonp; + const char *end, *beg; /* Helpers for whitespace stripping. */ + + /* Record the previous rule. */ + + record_waiting_files (); + tgts_started = fstart->lineno; + + /* Search the line for an unquoted ; that is not after an + unquoted #. */ + cmdleft = find_char_unquote (line, MAP_SEMI|MAP_COMMENT|MAP_VARIABLE); + if (cmdleft != 0 && *cmdleft == '#') + { + /* We found a comment before a semicolon. */ + *cmdleft = '\0'; + cmdleft = 0; + } + else if (cmdleft != 0) + /* Found one. Cut the line short there before expanding it. */ + *(cmdleft++) = '\0'; + semip = cmdleft; + + collapse_continuations (line); + + /* We can't expand the entire line, since if it's a per-target + variable we don't want to expand it. So, walk from the + beginning, expanding as we go, and looking for "interesting" + chars. The first word is always expandable. */ + wtype = get_next_mword (line, NULL, &lb_next, &wlen); + switch (wtype) + { + case w_eol: + if (cmdleft != 0) + O (fatal, fstart, _("missing rule before recipe")); + /* This line contained something but turned out to be nothing + but whitespace (a comment?). */ + continue; + + case w_colon: + case w_dcolon: + /* We accept and ignore rules without targets for + compatibility with SunOS 4 make. */ + no_targets = 1; + continue; + + default: + break; + } + + p2 = variable_expand_string (NULL, lb_next, wlen); + + while (1) + { + lb_next += wlen; + if (cmdleft == 0) + { + /* Look for a semicolon in the expanded line. */ + cmdleft = find_char_unquote (p2, MAP_SEMI); + + if (cmdleft != 0) + { + unsigned long p2_off = p2 - variable_buffer; + unsigned long cmd_off = cmdleft - variable_buffer; + char *pend = p2 + strlen (p2); + + /* Append any remnants of lb, then cut the line short + at the semicolon. */ + *cmdleft = '\0'; + + /* One school of thought says that you shouldn't expand + here, but merely copy, since now you're beyond a ";" + and into a command script. However, the old parser + expanded the whole line, so we continue that for + backwards-compatibility. Also, it wouldn't be + entirely consistent, since we do an unconditional + expand below once we know we don't have a + target-specific variable. */ + (void)variable_expand_string (pend, lb_next, (long)-1); + lb_next += strlen (lb_next); + p2 = variable_buffer + p2_off; + cmdleft = variable_buffer + cmd_off + 1; + } + } + + colonp = find_char_unquote (p2, MAP_COLON); +#ifdef HAVE_DOS_PATHS + /* The drive spec brain-damage strikes again... */ + /* Note that the only separators of targets in this context + are whitespace and a left paren. If others are possible, + they should be added to the string in the call to index. */ + while (colonp && (colonp[1] == '/' || colonp[1] == '\\') && + colonp > p2 && isalpha ((unsigned char)colonp[-1]) && + (colonp == p2 + 1 || strchr (" \t(", colonp[-2]) != 0)) + colonp = find_char_unquote (colonp + 1, MAP_COLON); +#endif + if (colonp != 0) + break; + + wtype = get_next_mword (lb_next, NULL, &lb_next, &wlen); + if (wtype == w_eol) + break; + + p2 += strlen (p2); + *(p2++) = ' '; + p2 = variable_expand_string (p2, lb_next, wlen); + /* We don't need to worry about cmdleft here, because if it was + found in the variable_buffer the entire buffer has already + been expanded... we'll never get here. */ + } + + p2 = next_token (variable_buffer); + + /* If the word we're looking at is EOL, see if there's _anything_ + on the line. If not, a variable expanded to nothing, so ignore + it. If so, we can't parse this line so punt. */ + if (wtype == w_eol) + { + if (*p2 == '\0') + continue; + + /* There's no need to be ivory-tower about this: check for + one of the most common bugs found in makefiles... */ + if (cmd_prefix == '\t' && strneq (line, " ", 8)) + O (fatal, fstart, _("missing separator (did you mean TAB instead of 8 spaces?)")); + else + O (fatal, fstart, _("missing separator")); + } + + /* Make the colon the end-of-string so we know where to stop + looking for targets. Start there again once we're done. */ + *colonp = '\0'; + filenames = PARSE_SIMPLE_SEQ (&p2, struct nameseq); + *colonp = ':'; + p2 = colonp; + + if (!filenames) + { + /* We accept and ignore rules without targets for + compatibility with SunOS 4 make. */ + no_targets = 1; + continue; + } + /* This should never be possible; we handled it above. */ + assert (*p2 != '\0'); + ++p2; + + /* Is this a one-colon or two-colon entry? */ + two_colon = *p2 == ':'; + if (two_colon) + p2++; + + /* Test to see if it's a target-specific variable. Copy the rest + of the buffer over, possibly temporarily (we'll expand it later + if it's not a target-specific variable). PLEN saves the length + of the unparsed section of p2, for later. */ + if (*lb_next != '\0') + { + unsigned int l = p2 - variable_buffer; + plen = strlen (p2); + variable_buffer_output (p2+plen, lb_next, strlen (lb_next)+1); + p2 = variable_buffer + l; + } + + p2 = parse_var_assignment (p2, &vmod); + if (vmod.assign_v) + { + /* If there was a semicolon found, add it back, plus anything + after it. */ + if (semip) + { + unsigned int l = p2 - variable_buffer; + *(--semip) = ';'; + collapse_continuations (semip); + variable_buffer_output (p2 + strlen (p2), + semip, strlen (semip)+1); + p2 = variable_buffer + l; + } + record_target_var (filenames, p2, + vmod.override_v ? o_override : o_file, + &vmod, fstart); + filenames = 0; + continue; + } + + /* This is a normal target, _not_ a target-specific variable. + Unquote any = in the dependency list. */ + find_char_unquote (lb_next, MAP_EQUALS); + + /* Remember the command prefix for this target. */ + prefix = cmd_prefix; + + /* We have some targets, so don't ignore the following commands. */ + no_targets = 0; + + /* Expand the dependencies, etc. */ + if (*lb_next != '\0') + { + unsigned int l = p2 - variable_buffer; + (void) variable_expand_string (p2 + plen, lb_next, (long)-1); + p2 = variable_buffer + l; + + /* Look for a semicolon in the expanded line. */ + if (cmdleft == 0) + { + cmdleft = find_char_unquote (p2, MAP_SEMI); + if (cmdleft != 0) + *(cmdleft++) = '\0'; + } + } + + /* Is this a static pattern rule: 'target: %targ: %dep; ...'? */ + p = strchr (p2, ':'); + while (p != 0 && p[-1] == '\\') + { + char *q = &p[-1]; + int backslash = 0; + while (*q-- == '\\') + backslash = !backslash; + if (backslash) + p = strchr (p + 1, ':'); + else + break; + } +#ifdef _AMIGA + /* Here, the situation is quite complicated. Let's have a look + at a couple of targets: + + install: dev:make + + dev:make: make + + dev:make:: xyz + + The rule is that it's only a target, if there are TWO :'s + OR a space around the :. + */ + if (p && !(isspace ((unsigned char)p[1]) || !p[1] + || isspace ((unsigned char)p[-1]))) + p = 0; +#endif +#ifdef HAVE_DOS_PATHS + { + int check_again; + do { + check_again = 0; + /* For DOS-style paths, skip a "C:\..." or a "C:/..." */ + if (p != 0 && (p[1] == '\\' || p[1] == '/') && + isalpha ((unsigned char)p[-1]) && + (p == p2 + 1 || strchr (" \t:(", p[-2]) != 0)) { + p = strchr (p + 1, ':'); + check_again = 1; + } + } while (check_again); + } +#endif + if (p != 0) + { + struct nameseq *target; + target = PARSE_FILE_SEQ (&p2, struct nameseq, MAP_COLON, NULL, + PARSEFS_NOGLOB); + ++p2; + if (target == 0) + O (fatal, fstart, _("missing target pattern")); + else if (target->next != 0) + O (fatal, fstart, _("multiple target patterns")); + pattern_percent = find_percent_cached (&target->name); + pattern = target->name; + if (pattern_percent == 0) + O (fatal, fstart, _("target pattern contains no '%%'")); + free_ns (target); + } + else + pattern = 0; + + /* Strip leading and trailing whitespaces. */ + beg = p2; + end = beg + strlen (beg) - 1; + strip_whitespace (&beg, &end); + + /* Put all the prerequisites here; they'll be parsed later. */ + if (beg <= end && *beg != '\0') + depstr = xstrndup (beg, end - beg + 1); + else + depstr = 0; + + commands_idx = 0; + if (cmdleft != 0) + { + /* Semicolon means rest of line is a command. */ + unsigned int l = strlen (cmdleft); + + cmds_started = fstart->lineno; + + /* Add this command line to the buffer. */ + if (l + 2 > commands_len) + { + commands_len = (l + 2) * 2; + commands = xrealloc (commands, commands_len); + } + memcpy (commands, cmdleft, l); + commands_idx += l; + commands[commands_idx++] = '\n'; + } + + /* Determine if this target should be made default. We used to do + this in record_files() but because of the delayed target recording + and because preprocessor directives are legal in target's commands + it is too late. Consider this fragment for example: + + foo: + + ifeq ($(.DEFAULT_GOAL),foo) + ... + endif + + Because the target is not recorded until after ifeq directive is + evaluated the .DEFAULT_GOAL does not contain foo yet as one + would expect. Because of this we have to move the logic here. */ + + if (set_default && default_goal_var->value[0] == '\0') + { + struct dep *d; + struct nameseq *t = filenames; + + for (; t != 0; t = t->next) + { + int reject = 0; + const char *name = t->name; + + /* We have nothing to do if this is an implicit rule. */ + if (strchr (name, '%') != 0) + break; + + /* See if this target's name does not start with a '.', + unless it contains a slash. */ + if (*name == '.' && strchr (name, '/') == 0 +#ifdef HAVE_DOS_PATHS + && strchr (name, '\\') == 0 +#endif + ) + continue; + + + /* If this file is a suffix, don't let it be + the default goal file. */ + for (d = suffix_file->deps; d != 0; d = d->next) + { + register struct dep *d2; + if (*dep_name (d) != '.' && streq (name, dep_name (d))) + { + reject = 1; + break; + } + for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next) + { + unsigned int l = strlen (dep_name (d2)); + if (!strneq (name, dep_name (d2), l)) + continue; + if (streq (name + l, dep_name (d))) + { + reject = 1; + break; + } + } + + if (reject) + break; + } + + if (!reject) + { + define_variable_global (".DEFAULT_GOAL", 13, t->name, + o_file, 0, NILF); + break; + } + } + } + + continue; + } + + /* We get here except in the case that we just read a rule line. + Record now the last rule we read, so following spurious + commands are properly diagnosed. */ + record_waiting_files (); + } + +#undef word1eq + + if (conditionals->if_cmds) + O (fatal, fstart, _("missing 'endif'")); + + /* At eof, record the last rule. */ + record_waiting_files (); + + free (collapsed); + free (commands); +} + + +/* Remove comments from LINE. + This is done by copying the text at LINE onto itself. */ + +static void +remove_comments (char *line) +{ + char *comment; + + comment = find_char_unquote (line, MAP_COMMENT); + + if (comment != 0) + /* Cut off the line at the #. */ + *comment = '\0'; +} + +/* Execute a 'undefine' directive. + The undefine line has already been read, and NAME is the name of + the variable to be undefined. */ + +static void +do_undefine (char *name, enum variable_origin origin, struct ebuffer *ebuf) +{ + char *p, *var; + + /* Expand the variable name and find the beginning (NAME) and end. */ + var = allocated_variable_expand (name); + name = next_token (var); + if (*name == '\0') + O (fatal, &ebuf->floc, _("empty variable name")); + p = name + strlen (name) - 1; + while (p > name && isblank ((unsigned char)*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; + gmk_floc defstart; + int nlevels = 1; + unsigned int length = 100; + char *definition = xmalloc (length); + unsigned int idx = 0; + char *p, *n; + + defstart = ebuf->floc; + + p = parse_variable_definition (name, &var); + if (p == NULL) + /* No assignment token, so assume recursive. */ + var.flavor = f_recursive; + else + { + if (var.value[0] != '\0') + O (error, &defstart, _("extraneous text after 'define' directive")); + + /* Chop the string before the assignment token to get the name. */ + var.name[var.length] = '\0'; + } + + /* Expand the variable name and find the beginning (NAME) and end. */ + n = allocated_variable_expand (name); + name = next_token (n); + if (name[0] == '\0') + O (fatal, &defstart, _("empty variable name")); + p = name + strlen (name) - 1; + while (p > name && isblank ((unsigned char)*p)) + --p; + p[1] = '\0'; + + /* Now read the value of the variable. */ + while (1) + { + unsigned int len; + char *line; + long nlines = readline (ebuf); + + /* If there is nothing left to be eval'd, there's no 'endef'!! */ + if (nlines < 0) + O (fatal, &defstart, _("missing 'endef', unterminated 'define'")); + + ebuf->floc.lineno += nlines; + line = ebuf->buffer; + + collapse_continuations (line); + + /* If the line doesn't begin with a tab, test to see if it introduces + another define, or ends one. Stop if we find an 'endef' */ + if (line[0] != cmd_prefix) + { + p = next_token (line); + len = strlen (p); + + /* If this is another 'define', increment the level count. */ + if ((len == 6 || (len > 6 && isblank ((unsigned char)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 ((unsigned char)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, int len, const gmk_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 = next_token (line + len); + +#define EXTRATEXT() OS (error, flocp, _("extraneous text after '%s' directive"), cmdname) +#define EXTRACMD() OS (fatal, flocp, _("extraneous '%s'"), cmdname) + + /* An 'endif' cannot contain extra text, and reduces the if-depth by 1 */ + if (cmdtype == c_endif) + { + if (*line != '\0') + EXTRATEXT (); + + if (!conditionals->if_cmds) + EXTRACMD (); + + --conditionals->if_cmds; + + goto DONE; + } + + /* An 'else' statement can either be simple, or it can have another + conditional after it. */ + if (cmdtype == c_else) + { + const char *p; + + if (!conditionals->if_cmds) + EXTRACMD (); + + o = conditionals->if_cmds - 1; + + if (conditionals->seen_else[o]) + O (fatal, flocp, _("only one 'else' per conditional")); + + /* Change the state of ignorance. */ + switch (conditionals->ignoring[o]) + { + case 0: + /* We've just been interpreting. Never do it again. */ + conditionals->ignoring[o] = 2; + break; + case 1: + /* We've never interpreted yet. Maybe this time! */ + conditionals->ignoring[o] = 0; + break; + } + + /* It's a simple 'else'. */ + if (*line == '\0') + { + conditionals->seen_else[o] = 1; + goto DONE; + } + + /* The 'else' has extra text. That text must be another conditional + and cannot be an 'else' or 'endif'. */ + + /* Find the length of the next word. */ + for (p = line+1; ! STOP_SET (*p, MAP_SPACE|MAP_NUL); ++p) + ; + len = p - line; + + /* If it's 'else' or 'endif' or an illegal conditional, fail. */ + if (word1eq ("else") || word1eq ("endif") + || conditional_line (line, len, flocp) < 0) + EXTRATEXT (); + else + { + /* conditional_line() created a new level of conditional. + Raise it back to this level. */ + if (conditionals->ignoring[o] < 2) + conditionals->ignoring[o] = conditionals->ignoring[o+1]; + --conditionals->if_cmds; + } + + goto DONE; + } + + if (conditionals->allocated == 0) + { + conditionals->allocated = 5; + conditionals->ignoring = xmalloc (conditionals->allocated); + conditionals->seen_else = xmalloc (conditionals->allocated); + } + + o = conditionals->if_cmds++; + if (conditionals->if_cmds > conditionals->allocated) + { + conditionals->allocated += 5; + conditionals->ignoring = xrealloc (conditionals->ignoring, + conditionals->allocated); + conditionals->seen_else = xrealloc (conditionals->seen_else, + conditionals->allocated); + } + + /* Record that we have seen an 'if...' but no 'else' so far. */ + conditionals->seen_else[o] = 0; + + /* Search through the stack to see if we're already ignoring. */ + for (i = 0; i < o; ++i) + if (conditionals->ignoring[i]) + { + /* We are already ignoring, so just push a level to match the next + "else" or "endif", and keep ignoring. We don't want to expand + variables in the condition. */ + conditionals->ignoring[o] = 1; + return 1; + } + + if (cmdtype == c_ifdef || cmdtype == c_ifndef) + { + char *var; + struct variable *v; + char *p; + + /* Expand the thing we're looking up, so we can use indirect and + constructed variable names. */ + var = allocated_variable_expand (line); + + /* Make sure there's only one variable name to test. */ + p = end_of_token (var); + i = p - var; + p = next_token (p); + if (*p != '\0') + return -1; + + var[i] = '\0'; + v = lookup_variable (var, i); + + conditionals->ignoring[o] = + ((v != 0 && *v->value != '\0') == (cmdtype == c_ifndef)); + + free (var); + } + else + { + /* "ifeq" or "ifneq". */ + char *s1, *s2; + unsigned int l; + char termin = *line == '(' ? ',' : *line; + + if (termin != ',' && termin != '"' && termin != '\'') + return -1; + + s1 = ++line; + /* Find the end of the first string. */ + if (termin == ',') + { + int count = 0; + for (; *line != '\0'; ++line) + if (*line == '(') + ++count; + else if (*line == ')') + --count; + else if (*line == ',' && count <= 0) + break; + } + else + while (*line != '\0' && *line != termin) + ++line; + + if (*line == '\0') + return -1; + + if (termin == ',') + { + /* Strip blanks after the first string. */ + char *p = line++; + while (isblank ((unsigned char)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. */ + line = 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'; + line = 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 gmk_floc *flocp) +{ + struct nameseq *nextf; + struct variable_set_list *global; + + global = current_variable_set_list; + + /* If the variable is an append version, store that but treat it as a + normal recursive variable. */ + + for (; filenames != 0; filenames = nextf) + { + struct variable *v; + const char *name = filenames->name; + const char *percent; + struct pattern_var *p; + + nextf = filenames->next; + free_ns (filenames); + + /* If it's a pattern target, then add it to the pattern-specific + variable list. */ + percent = find_percent_cached (&name); + if (percent) + { + /* Get a reference for this pattern-specific variable struct. */ + p = create_pattern_var (name, percent); + p->variable.fileinfo = *flocp; + /* I don't think this can fail since we already determined it was a + variable definition. */ + v = assign_variable_definition (&p->variable, defn); + assert (v != 0); + + v->origin = origin; + if (v->flavor == f_simple) + v->value = allocated_variable_expand (v->value); + else + v->value = xstrdup (v->value); + } + else + { + struct file *f; + + /* Get a file reference for this file, and initialize it. + We don't want to just call enter_file() because that allocates a + new entry if the file is a double-colon, which we don't want in + this situation. */ + f = lookup_file (name); + if (!f) + f = enter_file (strcache_add (name)); + else if (f->double_colon) + f = f->double_colon; + + initialize_file_variables (f, 1); + + current_variable_set_list = f->variables; + v = try_variable_definition (flocp, defn, origin, 1); + if (!v) + O (fatal, flocp, _("Malformed target-specific variable definition")); + current_variable_set_list = global; + } + + /* Set up the variable to be *-specific. */ + v->per_target = 1; + v->private_var = vmod->private_v; + v->export = vmod->export_v ? v_export : v_default; + + /* If it's not an override, check to see if there was a command-line + setting. If so, reset the value. */ + if (v->origin != o_override) + { + struct variable *gv; + int len = strlen (v->name); + + gv = lookup_variable (v->name, len); + if (gv && v != gv + && (gv->origin == o_env_override || gv->origin == o_command)) + { + free (v->value); + v->value = xstrdup (gv->value); + v->origin = gv->origin; + v->recursive = gv->recursive; + v->append = 0; + } + } + } +} + +/* Record a description line for files FILENAMES, + with dependencies DEPS, commands to execute described + by COMMANDS and COMMANDS_IDX, coming from FILENAME:COMMANDS_STARTED. + TWO_COLON is nonzero if a double colon was used. + If not nil, PATTERN is the '%' pattern to make this + a static pattern rule, and PATTERN_PERCENT is a pointer + to the '%' within it. + + The links of FILENAMES are freed, and so are any names in it + that are not incorporated into other data structures. */ + +static void +record_files (struct nameseq *filenames, const char *pattern, + const char *pattern_percent, char *depstr, + unsigned int cmds_started, char *commands, + unsigned int commands_idx, int two_colon, + char prefix, const gmk_floc *flocp) +{ + struct commands *cmds; + struct dep *deps; + const char *implicit_percent; + const char *name; + + /* If we've already snapped deps, that means we're in an eval being + resolved after the makefiles have been read in. We can't add more rules + at this time, since they won't get snapped and we'll get core dumps. + See Savannah bug # 12124. */ + if (snapped_deps) + O (fatal, flocp, _("prerequisites cannot be defined in recipes")); + + /* Determine if this is a pattern rule or not. */ + name = filenames->name; + implicit_percent = find_percent_cached (&name); + + /* If there's a recipe, set up a struct for it. */ + if (commands_idx > 0) + { + cmds = xmalloc (sizeof (struct commands)); + cmds->fileinfo.filenm = flocp->filenm; + cmds->fileinfo.lineno = cmds_started; + cmds->commands = xstrndup (commands, commands_idx); + cmds->command_lines = 0; + cmds->recipe_prefix = prefix; + } + else + cmds = 0; + + /* If there's a prereq string then parse it--unless it's eligible for 2nd + expansion: if so, snap_deps() will do it. */ + if (depstr == 0) + deps = 0; + else + { + depstr = unescape_char (depstr, ':'); + if (second_expansion && strchr (depstr, '$')) + { + deps = alloc_dep (); + deps->name = depstr; + deps->need_2nd_expansion = 1; + deps->staticpattern = pattern != 0; + } + else + { + deps = split_prereqs (depstr); + free (depstr); + + /* We'll enter static pattern prereqs later when we have the stem. + We don't want to enter pattern rules at all so that we don't + think that they ought to exist (make manual "Implicit Rule Search + Algorithm", item 5c). */ + if (! pattern && ! implicit_percent) + deps = enter_prereqs (deps, NULL); + } + } + + /* For implicit rules, _all_ the targets must have a pattern. That means we + can test the first one to see if we're working with an implicit rule; if + so we handle it specially. */ + + if (implicit_percent) + { + struct nameseq *nextf; + const char **targets, **target_pats; + unsigned int c; + + if (pattern != 0) + O (fatal, flocp, _("mixed implicit and static pattern rules")); + + /* Count the targets to create an array of target names. + We already have the first one. */ + nextf = filenames->next; + free_ns (filenames); + filenames = nextf; + + for (c = 1; nextf; ++c, nextf = nextf->next) + ; + targets = xmalloc (c * sizeof (const char *)); + target_pats = xmalloc (c * sizeof (const char *)); + + targets[0] = name; + target_pats[0] = implicit_percent; + + c = 1; + while (filenames) + { + name = filenames->name; + implicit_percent = find_percent_cached (&name); + + if (implicit_percent == 0) + O (fatal, flocp, _("mixed implicit and normal rules")); + + targets[c] = name; + target_pats[c] = implicit_percent; + ++c; + + nextf = filenames->next; + free_ns (filenames); + filenames = nextf; + } + + create_pattern_rule (targets, target_pats, c, two_colon, deps, cmds, 1); + + return; + } + + + /* Walk through each target and create it in the database. + We already set up the first target, above. */ + while (1) + { + struct nameseq *nextf = filenames->next; + struct file *f; + struct dep *this = 0; + + free_ns (filenames); + + /* Check for special targets. Do it here instead of, say, snap_deps() + so that we can immediately use the value. */ + if (streq (name, ".POSIX")) + { + posix_pedantic = 1; + define_variable_cname (".SHELLFLAGS", "-ec", o_default, 0); + /* These default values are based on IEEE Std 1003.1-2008. */ + define_variable_cname ("ARFLAGS", "-rv", o_default, 0); + define_variable_cname ("CC", "c99", o_default, 0); + define_variable_cname ("CFLAGS", "-O", o_default, 0); + define_variable_cname ("FC", "fort77", o_default, 0); + define_variable_cname ("FFLAGS", "-O 1", o_default, 0); + define_variable_cname ("SCCSGETFLAGS", "-s", o_default, 0); + } + else if (streq (name, ".SECONDEXPANSION")) + second_expansion = 1; +#if !defined (__MSDOS__) && !defined (__EMX__) + else if (streq (name, ".ONESHELL")) + one_shell = 1; +#endif + + /* If this is a static pattern rule: + 'targets: target%pattern: prereq%pattern; recipe', + make sure the pattern matches this target name. */ + if (pattern && !pattern_matches (pattern, pattern_percent, name)) + OS (error, flocp, + _("target '%s' doesn't match the target pattern"), name); + else if (deps) + /* If there are multiple targets, copy the chain DEPS for all but the + last one. It is not safe for the same deps to go in more than one + place in the database. */ + this = nextf != 0 ? copy_dep_chain (deps) : deps; + + /* Find or create an entry in the file database for this target. */ + if (!two_colon) + { + /* Single-colon. Combine this rule with the file's existing record, + if any. */ + f = enter_file (strcache_add (name)); + if (f->double_colon) + OS (fatal, flocp, + _("target file '%s' has both : and :: entries"), f->name); + + /* If CMDS == F->CMDS, this target was listed in this rule + more than once. Just give a warning since this is harmless. */ + if (cmds != 0 && cmds == f->cmds) + OS (error, flocp, + _("target '%s' given more than once in the same rule"), + f->name); + + /* Check for two single-colon entries both with commands. + Check is_target so that we don't lose on files such as .c.o + whose commands were preinitialized. */ + else if (cmds != 0 && f->cmds != 0 && f->is_target) + { + size_t l = strlen (f->name); + error (&cmds->fileinfo, l, + _("warning: overriding recipe for target '%s'"), + f->name); + error (&f->cmds->fileinfo, l, + _("warning: ignoring old recipe for target '%s'"), + f->name); + } + + /* Defining .DEFAULT with no deps or cmds clears it. */ + if (f == default_file && this == 0 && cmds == 0) + f->cmds = 0; + if (cmds != 0) + f->cmds = cmds; + + /* Defining .SUFFIXES with no dependencies clears out the list of + suffixes. */ + if (f == suffix_file && this == 0) + { + free_dep_chain (f->deps); + f->deps = 0; + } + } + else + { + /* Double-colon. Make a new record even if there already is one. */ + f = lookup_file (name); + + /* Check for both : and :: rules. Check is_target so we don't lose + on default suffix rules or makefiles. */ + if (f != 0 && f->is_target && !f->double_colon) + OS (fatal, flocp, + _("target file '%s' has both : and :: entries"), f->name); + + f = enter_file (strcache_add (name)); + /* If there was an existing entry and it was a double-colon entry, + enter_file will have returned a new one, making it the prev + pointer of the old one, and setting its double_colon pointer to + the first one. */ + if (f->double_colon == 0) + /* This is the first entry for this name, so we must set its + double_colon pointer to itself. */ + f->double_colon = f; + + f->cmds = cmds; + } + + f->is_target = 1; + + /* If this is a static pattern rule, set the stem to the part of its + name that matched the '%' in the pattern, so you can use $* in the + commands. If we didn't do it before, enter the prereqs now. */ + if (pattern) + { + static const char *percent = "%"; + char *buffer = variable_expand (""); + char *o = patsubst_expand_pat (buffer, name, pattern, percent, + pattern_percent+1, percent+1); + f->stem = strcache_add_len (buffer, o - buffer); + if (this) + { + if (! this->need_2nd_expansion) + this = enter_prereqs (this, f->stem); + else + this->stem = f->stem; + } + } + + /* Add the dependencies to this file entry. */ + if (this != 0) + { + /* Add the file's old deps and the new ones in THIS together. */ + if (f->deps == 0) + f->deps = this; + else if (cmds != 0) + { + struct dep *d = this; + + /* If this rule has commands, put these deps first. */ + while (d->next != 0) + d = d->next; + + d->next = f->deps; + f->deps = this; + } + else + { + struct dep *d = f->deps; + + /* A rule without commands: put its prereqs at the end. */ + while (d->next != 0) + d = d->next; + + d->next = this; + } + } + + name = f->name; + + /* All done! Set up for the next one. */ + if (nextf == 0) + break; + + filenames = nextf; + + /* Reduce escaped percents. If there are any unescaped it's an error */ + name = filenames->name; + if (find_percent_cached (&name)) + O (error, flocp, + _("*** mixed implicit and normal rules: deprecated syntax")); + } +} + +/* Search STRING for an unquoted STOPCHAR or blank (if BLANK is nonzero). + Backslashes quote STOPCHAR, blanks if BLANK is nonzero, and backslash. + Quoting backslashes are removed from STRING by compacting it into + itself. Returns a pointer to the first unquoted STOPCHAR if there is + one, or nil if there are none. STOPCHARs inside variable references are + ignored if IGNOREVARS is true. + + STOPCHAR _cannot_ be '$' if IGNOREVARS is true. */ + +static char * +find_char_unquote (char *string, int map) +{ + unsigned int string_len = 0; + char *p = string; + + /* Always stop on NUL. */ + map |= MAP_NUL; + + while (1) + { + while (! STOP_SET (*p, map)) + ++p; + + if (*p == '\0') + break; + + /* If we stopped due to a variable reference, skip over its contents. */ + if (STOP_SET (*p, MAP_VARIABLE)) + { + char openparen = p[1]; + + p += 2; + + /* Skip the contents of a non-quoted, multi-char variable ref. */ + if (openparen == '(' || openparen == '{') + { + unsigned int pcount = 1; + char closeparen = (openparen == '(' ? ')' : '}'); + + while (*p) + { + if (*p == openparen) + ++pcount; + else if (*p == closeparen) + if (--pcount == 0) + { + ++p; + break; + } + ++p; + } + } + + /* Skipped the variable reference: look for STOPCHARS again. */ + continue; + } + + if (p > string && p[-1] == '\\') + { + /* Search for more backslashes. */ + int i = -2; + while (&p[i] >= string && p[i] == '\\') + --i; + ++i; + /* Only compute the length if really needed. */ + if (string_len == 0) + string_len = strlen (string); + /* The number of backslashes is now -I. + Copy P over itself to swallow half of them. */ + memmove (&p[i], &p[i/2], (string_len - (p - string)) - (i/2) + 1); + p += i/2; + if (i % 2 == 0) + /* All the backslashes quoted each other; the STOPCHAR was + unquoted. */ + return p; + + /* The STOPCHAR was quoted by a backslash. Look for another. */ + } + else + /* No backslash in sight. */ + return p; + } + + /* Never hit a STOPCHAR or blank (with BLANK nonzero). */ + return 0; +} + +/* Unescape a character in a string. The string is compressed onto itself. */ + +static char * +unescape_char (char *string, int c) +{ + char *p = string; + char *s = string; + + while (*s != '\0') + { + if (*s == '\\') + { + char *e = s; + int l; + + /* We found a backslash. See if it's escaping our character. */ + while (*e == '\\') + ++e; + l = e - s; + + if (*e != c || l%2 == 0) + { + /* It's not; just take it all without unescaping. */ + memmove (p, s, l); + p += l; + } + else if (l > 1) + { + /* It is, and there's >1 backslash. Take half of them. */ + l /= 2; + memmove (p, s, l); + p += l; + } + s = e; + } + + *(p++) = *(s++); + } + + *p = '\0'; + return string; +} + +/* Search PATTERN for an unquoted % and handle quoting. */ + +char * +find_percent (char *pattern) +{ + return find_char_unquote (pattern, MAP_PERCENT); +} + +/* Search STRING for an unquoted % and handle quoting. Returns a pointer to + the % or NULL if no % was found. + This version is used with strings in the string cache: if there's a need to + modify the string a new version will be added to the string cache and + *STRING will be set to that. */ + +const char * +find_percent_cached (const char **string) +{ + const char *p = *string; + char *new = 0; + int slen = 0; + + /* If the first char is a % return now. This lets us avoid extra tests + inside the loop. */ + if (*p == '%') + return p; + + while (1) + { + while (! STOP_SET (*p, MAP_PERCENT|MAP_NUL)) + ++p; + + if (*p == '\0') + break; + + /* See if this % is escaped with a backslash; if not we're done. */ + if (p[-1] != '\\') + break; + + { + /* Search for more backslashes. */ + char *pv; + int i = -2; + + while (&p[i] >= *string && p[i] == '\\') + --i; + ++i; + + /* At this point we know we'll need to allocate a new string. + Make a copy if we haven't yet done so. */ + if (! new) + { + slen = strlen (*string); + new = alloca (slen + 1); + memcpy (new, *string, slen + 1); + p = new + (p - *string); + *string = new; + } + + /* At this point *string, p, and new all point into the same string. + Get a non-const version of p so we can modify new. */ + pv = new + (p - *string); + + /* The number of backslashes is now -I. + Copy P over itself to swallow half of them. */ + memmove (&pv[i], &pv[i/2], (slen - (pv - new)) - (i/2) + 1); + p += i/2; + + /* If the backslashes quoted each other; the % was unquoted. */ + if (i % 2 == 0) + break; + } + } + + /* If we had to change STRING, add it to the strcache. */ + if (new) + { + *string = strcache_add (*string); + p = *string + (p - new); + } + + /* If we didn't find a %, return NULL. Otherwise return a ptr to it. */ + return (*p == '\0') ? NULL : p; +} + +/* 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 unsigned long +readstring (struct ebuffer *ebuf) +{ + char *eol; + + /* If there is nothing left in this buffer, return 0. */ + if (ebuf->bufnext >= ebuf->bufstart + ebuf->size) + return -1; + + /* Set up a new starting point for the buffer, and find the end of the + next logical line (taking into account backslash/newline pairs). */ + + eol = ebuf->buffer = ebuf->bufnext; + + while (1) + { + int backslash = 0; + const char *bol = eol; + const char *p; + + /* Find the next newline. At EOS, stop. */ + p = eol = strchr (eol , '\n'); + if (!eol) + { + ebuf->bufnext = ebuf->bufstart + ebuf->size + 1; + return 0; + } + + /* Found a newline; if it's escaped continue; else we're done. */ + while (p > bol && *(--p) == '\\') + backslash = !backslash; + if (!backslash) + break; + ++eol; + } + + /* Overwrite the newline char. */ + *eol = '\0'; + ebuf->bufnext = eol+1; + + return 0; +} + +static long +readline (struct ebuffer *ebuf) +{ + char *p; + char *end; + char *start; + long nlines = 0; + + /* The behaviors between string and stream buffers are different enough to + warrant different functions. Do the Right Thing. */ + + if (!ebuf->fp) + return readstring (ebuf); + + /* When reading from a file, we always start over at the beginning of the + buffer for each new line. */ + + p = start = ebuf->bufstart; + end = p + ebuf->size; + *p = '\0'; + + while (fgets (p, end - p, ebuf->fp) != 0) + { + char *p2; + unsigned long len; + int backslash; + + len = strlen (p); + if (len == 0) + { + /* This only happens when the first thing on the line is a '\0'. + It is a pretty hopeless case, but (wonder of wonders) Athena + lossage strikes again! (xmkmf puts NULs in its makefiles.) + There is nothing really to be done; we synthesize a newline so + the following line doesn't appear to be part of this line. */ + O (error, &ebuf->floc, + _("warning: NUL character seen; rest of line ignored")); + p[0] = '\n'; + len = 1; + } + + /* Jump past the text we just read. */ + p += len; + + /* If the last char isn't a newline, the whole line didn't fit into the + buffer. Get some more buffer and try again. */ + if (p[-1] != '\n') + goto more_buffer; + + /* We got a newline, so add one to the count of lines. */ + ++nlines; + +#if !defined(WINDOWS32) && !defined(__MSDOS__) && !defined(__EMX__) + /* Check to see if the line was really ended with CRLF; if so ignore + the CR. */ + if ((p - start) > 1 && p[-2] == '\r') + { + --p; + memmove (p-1, p, strlen (p) + 1); + } +#endif + + backslash = 0; + for (p2 = p - 2; p2 >= start; --p2) + { + if (*p2 != '\\') + break; + backslash = !backslash; + } + + if (!backslash) + { + p[-1] = '\0'; + break; + } + + /* It was a backslash/newline combo. If we have more space, read + another line. */ + if (end - p >= 80) + continue; + + /* We need more space at the end of our buffer, so realloc it. + Make sure to preserve the current offset of p. */ + more_buffer: + { + unsigned long off = p - start; + ebuf->size *= 2; + start = ebuf->buffer = ebuf->bufstart = xrealloc (start, ebuf->size); + p = start + off; + end = start + ebuf->size; + *p = '\0'; + } + } + + if (ferror (ebuf->fp)) + pfatal_with_name (ebuf->floc.filenm); + + /* If we found some lines, return how many. + If we didn't, but we did find _something_, that indicates we read the last + line of a file with no final newline; return 1. + If we read nothing, we're at EOF; return -1. */ + + return nlines ? nlines : p == ebuf->bufstart ? -1 : 1; +} + +/* Parse the next "makefile word" from the input buffer, and return info + about it. + + A "makefile word" is one of: + + w_bogus Should never happen + w_eol End of input + w_static A static word; cannot be expanded + w_variable A word containing one or more variables/functions + w_colon A colon + w_dcolon A double-colon + w_semicolon A semicolon + w_varassign A variable assignment operator (=, :=, ::=, +=, ?=, or !=) + + Note that this function is only used when reading certain parts of the + makefile. Don't use it where special rules hold sway (RHS of a variable, + in a command list, etc.) */ + +static enum make_word_type +get_next_mword (char *buffer, char *delim, char **startp, unsigned int *length) +{ + enum make_word_type wtype = w_bogus; + char *p = buffer, *beg; + char c; + + /* Skip any leading whitespace. */ + while (isblank ((unsigned char)*p)) + ++p; + + beg = p; + c = *(p++); + switch (c) + { + case '\0': + wtype = w_eol; + break; + + case ';': + wtype = w_semicolon; + break; + + case '=': + wtype = w_varassign; + break; + + case ':': + wtype = w_colon; + switch (*p) + { + case ':': + ++p; + if (p[1] != '=') + wtype = w_dcolon; + else + { + wtype = w_varassign; + ++p; + } + break; + + case '=': + ++p; + wtype = w_varassign; + break; + } + break; + + case '+': + case '?': + case '!': + if (*p == '=') + { + ++p; + wtype = w_varassign; + break; + } + + default: + if (delim && strchr (delim, c)) + wtype = w_static; + break; + } + + /* Did we find something? If so, return now. */ + if (wtype != w_bogus) + goto done; + + /* This is some non-operator word. A word consists of the longest + string of characters that doesn't contain whitespace, one of [:=#], + or [?+!]=, or one of the chars in the DELIM string. */ + + /* We start out assuming a static word; if we see a variable we'll + adjust our assumptions then. */ + wtype = w_static; + + /* We already found the first value of "c", above. */ + while (1) + { + char closeparen; + int count; + + switch (c) + { + case '\0': + case ' ': + case '\t': + case '=': + goto done_word; + + case ':': +#ifdef HAVE_DOS_PATHS + /* A word CAN include a colon in its drive spec. The drive + spec is allowed either at the beginning of a word, or as part + of the archive member name, like in "libfoo.a(d:/foo/bar.o)". */ + if (!(p - beg >= 2 + && (*p == '/' || *p == '\\') && isalpha ((unsigned char)p[-2]) + && (p - beg == 2 || p[-3] == '('))) +#endif + goto done_word; + + case '$': + c = *(p++); + if (c == '$') + break; + + /* This is a variable reference, so note that it's expandable. + Then read it to the matching close paren. */ + wtype = w_variable; + + if (c == '(') + closeparen = ')'; + else if (c == '{') + closeparen = '}'; + else + /* This is a single-letter variable reference. */ + break; + + for (count=0; *p != '\0'; ++p) + { + if (*p == c) + ++count; + else if (*p == closeparen && --count < 0) + { + ++p; + break; + } + } + break; + + case '?': + case '+': + if (*p == '=') + goto done_word; + break; + + case '\\': + switch (*p) + { + case ':': + case ';': + case '=': + case '\\': + ++p; + break; + } + break; + + default: + if (delim && strchr (delim, c)) + goto done_word; + break; + } + + c = *(p++); + } + done_word: + --p; + + done: + if (startp) + *startp = beg; + if (length) + *length = p - beg; + return wtype; +} + +/* Construct the list of include directories + from the arguments and the default list. */ + +void +construct_include_path (const char **arg_dirs) +{ +#ifdef VAXC /* just don't ask ... */ + stat_t stbuf; +#else + struct stat stbuf; +#endif + const char **dirs; + const char **cpp; + unsigned int idx; + + /* Compute the number of pointers we need in the table. */ + idx = sizeof (default_include_directories) / sizeof (const char *); + if (arg_dirs) + for (cpp = arg_dirs; *cpp != 0; ++cpp) + ++idx; + +#ifdef __MSDOS__ + /* Add one for $DJDIR. */ + ++idx; +#endif + + dirs = xmalloc (idx * sizeof (const char *)); + + idx = 0; + max_incl_len = 0; + + /* First consider any dirs specified with -I switches. + Ignore any that don't exist. Remember the maximum string length. */ + + if (arg_dirs) + while (*arg_dirs != 0) + { + const char *dir = *(arg_dirs++); + char *expanded = 0; + int e; + + if (dir[0] == '~') + { + expanded = tilde_expand (dir); + if (expanded != 0) + dir = expanded; + } + + EINTRLOOP (e, stat (dir, &stbuf)); + if (e == 0 && S_ISDIR (stbuf.st_mode)) + { + unsigned int len = strlen (dir); + /* If dir name is written with trailing slashes, discard them. */ + while (len > 1 && dir[len - 1] == '/') + --len; + if (len > max_incl_len) + max_incl_len = len; + dirs[idx++] = strcache_add_len (dir, len); + } + + free (expanded); + } + + /* Now add the standard default dirs at the end. */ + +#ifdef __MSDOS__ + { + /* The environment variable $DJDIR holds the root of the DJGPP directory + tree; add ${DJDIR}/include. */ + struct variable *djdir = lookup_variable ("DJDIR", 5); + + if (djdir) + { + unsigned int len = strlen (djdir->value) + 8; + char *defdir = alloca (len + 1); + + strcat (strcpy (defdir, djdir->value), "/include"); + dirs[idx++] = strcache_add (defdir); + + if (len > max_incl_len) + max_incl_len = len; + } + } +#endif + + for (cpp = default_include_directories; *cpp != 0; ++cpp) + { + int e; + + EINTRLOOP (e, stat (*cpp, &stbuf)); + if (e == 0 && S_ISDIR (stbuf.st_mode)) + { + unsigned int len = strlen (*cpp); + /* If dir name is written with trailing slashes, discard them. */ + while (len > 1 && (*cpp)[len - 1] == '/') + --len; + if (len > max_incl_len) + max_incl_len = len; + dirs[idx++] = strcache_add_len (*cpp, len); + } + } + + dirs[idx] = 0; + + /* Now add each dir to the .INCLUDE_DIRS variable. */ + + for (cpp = dirs; *cpp != 0; ++cpp) + do_variable_definition (NILF, ".INCLUDE_DIRS", *cpp, + o_default, f_append, 0); + + include_directories = dirs; +} + +/* 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') + { + extern char *getenv (); + 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') + { + extern char *getlogin (); + 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 STOPCHAR. + + SIZE is how big to construct chain elements. + This is useful if we want them actually to be other structures + that have room for additional info. + + PREFIX, if non-null, is added to the beginning of each filename. + + FLAGS allows one or more of the following bitflags to be set: + PARSEFS_NOSTRIP - Do no strip './'s off the beginning + PARSEFS_NOAR - Do not check filenames for archive references + PARSEFS_NOGLOB - Do not expand globbing characters + PARSEFS_EXISTS - Only return globbed files that actually exist + (cannot also set NOGLOB) + PARSEFS_NOCACHE - Do not add filenames to the strcache (caller frees) + */ + +void * +parse_file_seq (char **stringp, unsigned int size, int stopmap, + const char *prefix, int flags) +{ + extern void dir_setup_glob (glob_t *glob); + + /* tmp points to tmpbuf after the prefix, if any. + tp is the end of the buffer. */ + static char *tmpbuf = NULL; + + int cachep = NONE_SET (flags, PARSEFS_NOCACHE); + + struct nameseq *new = 0; + struct nameseq **newp = &new; +#define NEWELT(_n) do { \ + const char *__n = (_n); \ + *newp = xcalloc (size); \ + (*newp)->name = (cachep ? strcache_add (__n) : xstrdup (__n)); \ + newp = &(*newp)->next; \ + } while(0) + + char *p; + glob_t gl; + char *tp; + + /* Always stop on NUL. */ + stopmap |= MAP_NUL; + + if (size < sizeof (struct nameseq)) + size = sizeof (struct nameseq); + + if (NONE_SET (flags, PARSEFS_NOGLOB)) + dir_setup_glob (&gl); + + /* Get enough temporary space to construct the largest possible target. */ + { + static int tmpbuf_len = 0; + int l = strlen (*stringp) + 1; + if (l > tmpbuf_len) + { + tmpbuf = xrealloc (tmpbuf, l); + tmpbuf_len = l; + } + } + tp = tmpbuf; + + /* Parse STRING. P will always point to the end of the parsed content. */ + p = *stringp; + while (1) + { + const char *name; + const char **nlist = 0; + char *tildep = 0; + int globme = 1; +#ifndef NO_ARCHIVES + char *arname = 0; + char *memname = 0; +#endif + char *s; + int nlen; + int i; + + /* Skip whitespace; at the end of the string or STOPCHAR we're done. */ + p = next_token (p); + if (STOP_SET (*p, stopmap)) + break; + + /* There are names left, so find the end of the next name. + Throughout this iteration S points to the start. */ + s = p; + p = find_char_unquote (p, stopmap|MAP_VMSCOMMA|MAP_BLANK); +#ifdef VMS + /* convert comma separated list to space separated */ + if (p && *p == ',') + *p =' '; +#endif +#ifdef _AMIGA + if (p && STOP_SET (*p, stopmap & MAP_COLON) + && !(isspace ((unsigned char)p[1]) || !p[1] + || isspace ((unsigned char)p[-1]))) + p = find_char_unquote (p+1, stopmap|MAP_VMSCOMMA|MAP_BLANK); +#endif +#ifdef HAVE_DOS_PATHS + /* For DOS paths, skip a "C:\..." or a "C:/..." until we find the + first colon which isn't followed by a slash or a backslash. + Note that tokens separated by spaces should be treated as separate + tokens since make doesn't allow path names with spaces */ + if (stopmap | MAP_COLON) + while (p != 0 && !isspace ((unsigned char)*p) && + (p[1] == '\\' || p[1] == '/') && isalpha ((unsigned char)p[-1])) + p = find_char_unquote (p + 1, stopmap|MAP_VMSCOMMA|MAP_BLANK); +#endif + if (p == 0) + p = s + strlen (s); + + /* Strip leading "this directory" references. */ + if (NONE_SET (flags, PARSEFS_NOSTRIP)) +#ifdef VMS + /* Skip leading '[]'s. */ + while (p - s > 2 && s[0] == '[' && s[1] == ']') +#else + /* Skip leading './'s. */ + while (p - s > 2 && s[0] == '.' && s[1] == '/') +#endif + { + /* 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(VMS) + continue; +#elif 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; + e = next_token (e); + /* Find the end of this word. We don't want to unquote and + we don't care about quoting since we're looking for the + last char in the word. */ + while (! STOP_SET (*e, stopmap|MAP_BLANK|MAP_VMSCOMMA)) + ++e; + /* If we didn't move, we're done now. */ + if (e == o) + break; + if (e[-1] == ')') + { + /* Found the end, so this is the first element in an + open archive group. It looks like "lib(mem". + Reset TP past the open paren. */ + nlen -= (n + 1) - tp; + tp = n + 1; + + /* We can stop looking now. */ + break; + } + } + while (*e != '\0'); + + /* If we have just "lib(", part of something like "lib( a b)", + go to the next item. */ + if (! nlen) + continue; + } + } + + /* If we are inside an archive group, make sure it has an end. */ + if (tp > tmpbuf) + { + if (tp[nlen-1] == ')') + { + /* This is the natural end; reset TP. */ + tp = tmpbuf; + + /* This is just ")", something like "lib(a b )": skip it. */ + if (nlen == 1) + continue; + } + else + { + /* Not the end, so add a "fake" end. */ + tp[nlen++] = ')'; + tp[nlen] = '\0'; + } + } +#endif + + /* If we're not globbing we're done: add it to the end of the chain. + Go to the next item in the string. */ + if (ANY_SET (flags, PARSEFS_NOGLOB)) + { + NEWELT (concat (2, prefix, tmpbuf)); + continue; + } + + /* If we get here we know we're doing glob expansion. + TP is a string in tmpbuf. NLEN is no longer used. + We may need to do more work: after this NAME will be set. */ + name = tmpbuf; + + /* Expand tilde if applicable. */ + if (tmpbuf[0] == '~') + { + tildep = tilde_expand (tmpbuf); + if (tildep != 0) + name = tildep; + } + +#ifndef NO_ARCHIVES + /* If NAME is an archive member reference replace it with the archive + file name, and save the member name in MEMNAME. We will glob on the + archive name and then reattach MEMNAME later. */ + if (NONE_SET (flags, PARSEFS_NOAR) && ar_name (name)) + { + ar_parse_name (name, &arname, &memname); + name = arname; + } +#endif /* !NO_ARCHIVES */ + + /* glob() is expensive: don't call it unless we need to. */ + if (NONE_SET (flags, PARSEFS_EXISTS) && strpbrk (name, "?*[") == NULL) + { + globme = 0; + i = 1; + nlist = &name; + } + else + switch (glob (name, GLOB_NOSORT|GLOB_ALTDIRFUNC, NULL, &gl)) + { + case GLOB_NOSPACE: + OUT_OF_MEM(); + + case 0: + /* Success. */ + i = gl.gl_pathc; + nlist = (const char **)gl.gl_pathv; + break; + + case GLOB_NOMATCH: + /* If we want only existing items, skip this one. */ + if (ANY_SET (flags, PARSEFS_EXISTS)) + { + i = 0; + break; + } + /* FALLTHROUGH */ + + default: + /* By default keep this name. */ + i = 1; + nlist = &name; + break; + } + + /* For each matched element, add it to the list. */ + while (i-- > 0) +#ifndef NO_ARCHIVES + if (memname != 0) + { + /* Try to glob on MEMNAME within the archive. */ + struct nameseq *found = ar_glob (nlist[i], memname, size); + if (! found) + /* No matches. Use MEMNAME as-is. */ + NEWELT (concat (5, prefix, nlist[i], "(", memname, ")")); + else + { + /* We got a chain of items. Attach them. */ + if (*newp) + (*newp)->next = found; + else + *newp = found; + + /* Find and set the new end. Massage names if necessary. */ + while (1) + { + if (! cachep) + found->name = xstrdup (concat (2, prefix, name)); + else if (prefix) + found->name = strcache_add (concat (2, prefix, name)); + + if (found->next == 0) + break; + + found = found->next; + } + newp = &found->next; + } + } + else +#endif /* !NO_ARCHIVES */ + NEWELT (concat (2, prefix, nlist[i])); + + if (globme) + globfree (&gl); + +#ifndef NO_ARCHIVES + free (arname); +#endif + + free (tildep); + } + + *stringp = p; + return new; +} diff --git a/remake.c b/remake.c new file mode 100644 index 0000000..299a2aa --- /dev/null +++ b/remake.c @@ -0,0 +1,1703 @@ +/* Basic dependency engine for GNU Make. +Copyright (C) 1988-2014 Free 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 + +extern int try_implicit_rule (struct file *file, unsigned int depth); + + +/* 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; + +/* Current value for pruning the scan of the goal chain (toggle 0/1). */ +static unsigned int considered; + +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 dep *goals) +{ + int t = touch_flag, q = question_flag, n = just_print_flag; + enum update_status status = us_none; + +#define MTIME(file) (rebuilding_makefiles ? file_mtime_no_search (file) \ + : file_mtime (file)) + + /* Duplicate the chain so we can remove things from it. */ + + goals = copy_dep_chain (goals); + + { + /* Clear the 'changed' flag of each goal in the chain. + We will use the flag below to notice when any commands + have actually been run for a target. When no commands + have been run, we give an "up to date" diagnostic. */ + + struct dep *g; + for (g = goals; g != 0; g = g->next) + g->changed = 0; + } + + /* All files start with the considered bit 0, so the global value is 1. */ + considered = 1; + + /* Update all the goals until they are all finished. */ + + while (goals != 0) + { + register struct dep *g, *lastgoal; + + /* Start jobs that are waiting for the load to go down. */ + + start_waiting_jobs (); + + /* Wait for a child to die. */ + + reap_children (1, 0); + + lastgoal = 0; + g = goals; + while (g != 0) + { + /* Iterate over all double-colon entries for this file. */ + struct file *file; + int stop = 0, any_not_updated = 0; + + 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 = g->dontcare; + + check_renamed (file); + if (rebuilding_makefiles) + { + if (file->cmd_target) + { + touch_flag = t; + question_flag = q; + just_print_flag = n; + } + else + touch_flag = question_flag = just_print_flag = 0; + } + + /* Save the old value of 'commands_started' so we can compare + later. It will be incremented when any commands are + actually run. */ + ocommands_started = commands_started; + + fail = update_file (file, rebuilding_makefiles ? 1 : 0); + check_renamed (file); + + /* Set the goal's 'changed' flag if any commands were started + by calling update_file above. We check this flag below to + decide when to give an "up to date" diagnostic. */ + if (commands_started > ocommands_started) + g->changed = 1; + + stop = 0; + if ((fail || file->updated) && status < us_question) + { + /* We updated this goal. Update STATUS and decide whether + to stop. */ + if (file->update_status) + { + /* Updating failed, or -q triggered. The STATUS value + tells our caller which. */ + status = file->update_status; + /* If -q just triggered, stop immediately. It doesn't + matter how much more we run, since we already know + the answer to return. */ + stop = (question_flag && !keep_going_flag + && !rebuilding_makefiles); + } + else + { + FILE_TIMESTAMP mtime = MTIME (file); + check_renamed (file); + + if (file->updated && g->changed && + mtime != file->mtime_before_update) + { + /* Updating was done. If this is a makefile and + just_print_flag or question_flag is set (meaning + -n or -q was given and this file was specified + as a command-line target), don't change STATUS. + If STATUS is changed, we will get re-exec'd, and + enter an infinite loop. */ + if (!rebuilding_makefiles + || (!just_print_flag && !question_flag)) + status = us_success; + if (rebuilding_makefiles && file->dontcare) + /* This is a default makefile; stop remaking. */ + stop = 1; + } + } + } + + /* Keep track if any double-colon entry is not finished. + When they are all finished, the goal is finished. */ + any_not_updated |= !file->updated; + + file->dontcare = 0; + + if (stop) + break; + } + + /* Reset FILE since it is null at the end of the loop. */ + file = g->file; + + if (stop || !any_not_updated) + { + /* If we have found nothing whatever to do for the goal, + print a message saying nothing needs doing. */ + + if (!rebuilding_makefiles + /* If the update_status is success, we updated successfully + or not at all. G->changed will have been set above if + any commands were actually started for this goal. */ + && file->update_status == us_success && !g->changed + /* Never give a message under -s or -q. */ + && !silent_flag && !question_flag) + OS (message, 1, ((file->phony || file->cmds == 0) + ? _("Nothing to be done for '%s'.") + : _("'%s' is up to date.")), + file->name); + + /* This goal is finished. Remove it from the chain. */ + if (lastgoal == 0) + goals = g->next; + else + lastgoal->next = g->next; + + /* Free the storage. */ + free (g); + + g = lastgoal == 0 ? goals : lastgoal->next; + + if (stop) + break; + } + else + { + lastgoal = g; + g = g->next; + } + } + + /* If we reached the end of the dependency graph toggle the considered + flag for the next pass. */ + if (g == 0) + considered = !considered; + } + + if (rebuilding_makefiles) + { + touch_flag = t; + question_flag = q; + just_print_flag = n; + } + + return status; +} + +/* 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 : 0; + } + } + + /* 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 the other :: rules for this + file until this rule is finished. */ + status = us_success; + break; + } + + if (new > status) + status = new; + } + + /* Process the remaining rules in the double colon chain so they're marked + considered. Start their prerequisites, too. */ + if (file->double_colon) + for (; f != 0 ; f = f->prev) + { + struct dep *d; + + f->considered = considered; + + for (d = f->deps; d != 0; d = d->next) + { + enum update_status new = update_file (d->file, depth + 1); + if (new > status) + new = status; + } + } + + 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) + { + /* Didn't find any dependencies to complain about. */ + if (file->parent) + { + size_t l = strlen (file->name) + strlen (file->parent->name) + 4; + + if (!keep_going_flag) + fatal (NILF, l, + _("%sNo rule to make target '%s', needed by '%s'%s"), + "", file->name, file->parent->name, ""); + + error (NILF, l, _("%sNo rule to make target '%s', needed by '%s'%s"), + "*** ", file->name, file->parent->name, "."); + } + else + { + size_t l = strlen (file->name) + 4; + + if (!keep_going_flag) + fatal (NILF, l, + _("%sNo rule to make target '%s'%s"), "", file->name, ""); + + error (NILF, l, + _("%sNo rule to make target '%s'%s"), "*** ", file->name, "."); + } + + file->no_diag = 0; + } +} + +/* Consider a single 'struct file' and update it as appropriate. + Return 0 on success, or non-0 on failure. */ + +static enum update_status +update_file_1 (struct file *file, unsigned int depth) +{ + enum update_status dep_status = us_success; + FILE_TIMESTAMP this_mtime; + int noexist, must_make, deps_changed; + struct file *ofile; + struct dep *d, *ad; + struct dep amake; + int running = 0; + + DBF (DB_VERBOSE, _("Considering target file '%s'.\n")); + + if (file->updated) + { + if (file->update_status > us_none) + { + DBF (DB_VERBOSE, + _("Recently tried and failed to update file '%s'.\n")); + + /* If the file we tried to make is marked no_diag then no message + was printed about it when it failed during the makefile rebuild. + If we're trying to build it again in the normal rebuild, print a + message now. */ + if (file->no_diag && !file->dontcare) + complain (file); + + return file->update_status; + } + + DBF (DB_VERBOSE, _("File '%s' was considered already.\n")); + return 0; + } + + switch (file->command_state) + { + case cs_not_started: + case cs_deps_running: + break; + case cs_running: + DBF (DB_VERBOSE, _("Still updating file '%s'.\n")); + return 0; + case cs_finished: + DBF (DB_VERBOSE, _("Finished updating file '%s'.\n")); + return file->update_status; + default: + abort (); + } + + /* Determine whether the diagnostics will be issued should this update + fail. */ + file->no_diag = file->dontcare; + + ++depth; + + /* Notice recursive update of the same file. */ + start_updating (file); + + /* We might change file if we find a different one via vpath; + remember this one to turn off updating. */ + ofile = file; + + /* Looking at the file's modtime beforehand allows the possibility + that its name may be changed by a VPATH search, and thus it may + not need an implicit rule. If this were not done, the file + might get implicit commands that apply to its initial name, only + to have that name replaced with another found by VPATH search. */ + + this_mtime = file_mtime (file); + check_renamed (file); + noexist = this_mtime == NONEXISTENT_MTIME; + if (noexist) + DBF (DB_BASIC, _("File '%s' does not exist.\n")); + else if (ORDINARY_MTIME_MIN <= this_mtime && this_mtime <= ORDINARY_MTIME_MAX + && file->low_resolution_time) + { + /* Avoid spurious rebuilds due to low resolution time stamps. */ + int ns = FILE_TIMESTAMP_NS (this_mtime); + if (ns != 0) + OS (error, NILF, + _("*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"), + file->name); + this_mtime += FILE_TIMESTAMPS_PER_S - 1 - ns; + } + + must_make = noexist; + + /* If file was specified as a target with no commands, + come up with some default commands. */ + + if (!file->phony && file->cmds == 0 && !file->tried_implicit) + { + if (try_implicit_rule (file, depth)) + DBF (DB_IMPLICIT, _("Found an implicit rule for '%s'.\n")); + else + DBF (DB_IMPLICIT, _("No implicit rule found for '%s'.\n")); + file->tried_implicit = 1; + } + if (file->cmds == 0 && !file->is_target + && default_file != 0 && default_file->cmds != 0) + { + DBF (DB_IMPLICIT, _("Using default recipe for '%s'.\n")); + file->cmds = default_file->cmds; + } + + /* Update all non-intermediate files we depend on, if necessary, and see + whether any of them is more recent than this file. We need to walk our + deps, AND the deps of any also_make targets to ensure everything happens + in the correct order. */ + + amake.file = file; + amake.next = file->also_make; + ad = &amake; + while (ad) + { + struct dep *lastd = 0; + + /* Find the deps we're scanning */ + d = ad->file->deps; + ad = ad->next; + + while (d) + { + enum update_status new; + FILE_TIMESTAMP mtime; + int maybe_make; + int dontcare = 0; + + check_renamed (d->file); + + mtime = file_mtime (d->file); + check_renamed (d->file); + + if (is_updating (d->file)) + { + OSS (error, NILF, _("Circular %s <- %s dependency dropped."), + file->name, d->file->name); + /* We cannot free D here because our the caller will still have + a reference to it when we were called recursively via + check_dep below. */ + if (lastd == 0) + file->deps = d->next; + else + lastd->next = d->next; + d = d->next; + continue; + } + + d->file->parent = file; + maybe_make = must_make; + + /* Inherit dontcare flag from our parent. */ + if (rebuilding_makefiles) + { + dontcare = d->file->dontcare; + d->file->dontcare = file->dontcare; + } + + new = check_dep (d->file, depth, this_mtime, &maybe_make); + if (new > dep_status) + dep_status = new; + + /* Restore original dontcare flag. */ + if (rebuilding_makefiles) + d->file->dontcare = dontcare; + + if (! d->ignore_mtime) + must_make = maybe_make; + + check_renamed (d->file); + + { + register struct file *f = d->file; + if (f->double_colon) + f = f->double_colon; + do + { + running |= (f->command_state == cs_running + || f->command_state == cs_deps_running); + f = f->prev; + } + while (f != 0); + } + + if (dep_status && !keep_going_flag) + break; + + if (!running) + /* The prereq is considered changed if the timestamp has changed while + it was built, OR it doesn't exist. */ + d->changed = ((file_mtime (d->file) != mtime) + || (mtime == NONEXISTENT_MTIME)); + + lastd = d; + d = d->next; + } + } + + /* Now we know whether this target needs updating. + If it does, update all the intermediate files we depend on. */ + + if (must_make || always_make_flag) + { + for (d = file->deps; d != 0; d = d->next) + if (d->file->intermediate) + { + enum update_status new; + int dontcare = 0; + + FILE_TIMESTAMP mtime = file_mtime (d->file); + check_renamed (d->file); + d->file->parent = file; + + /* Inherit dontcare flag from our parent. */ + if (rebuilding_makefiles) + { + dontcare = d->file->dontcare; + d->file->dontcare = file->dontcare; + } + + /* We may have already considered this file, when we didn't know + we'd need to update it. Force update_file() to consider it and + not prune it. */ + d->file->considered = !considered; + + new = update_file (d->file, depth); + if (new > dep_status) + dep_status = new; + + /* Restore original dontcare flag. */ + if (rebuilding_makefiles) + d->file->dontcare = dontcare; + + check_renamed (d->file); + + { + register struct file *f = d->file; + if (f->double_colon) + f = f->double_colon; + do + { + running |= (f->command_state == cs_running + || f->command_state == cs_deps_running); + f = f->prev; + } + while (f != 0); + } + + if (dep_status && !keep_going_flag) + break; + + if (!running) + d->changed = ((file->phony && file->cmds != 0) + || file_mtime (d->file) != mtime); + } + } + + finish_updating (file); + finish_updating (ofile); + + DBF (DB_VERBOSE, _("Finished prerequisites of target file '%s'.\n")); + + if (running) + { + set_command_state (file, cs_deps_running); + --depth; + DBF (DB_VERBOSE, _("The prerequisites of '%s' are being made.\n")); + return 0; + } + + /* If any dependency failed, give up now. */ + + if (dep_status) + { + /* I'm not sure if we can't just assign dep_status... */ + file->update_status = dep_status == us_none ? us_failed : dep_status; + notice_finished_file (file); + + --depth; + + DBF (DB_VERBOSE, _("Giving up on target file '%s'.\n")); + + if (depth == 0 && keep_going_flag + && !just_print_flag && !question_flag) + OS (error, NILF, + _("Target '%s' not remade because of errors."), file->name); + + return dep_status; + } + + if (file->command_state == cs_deps_running) + /* The commands for some deps were running on the last iteration, but + they have finished now. Reset the command_state to not_started to + simplify later bookkeeping. It is important that we do this only + when the prior state was cs_deps_running, because that prior state + was definitely propagated to FILE's also_make's by set_command_state + (called above), but in another state an also_make may have + independently changed to finished state, and we would confuse that + file's bookkeeping (updated, but not_started is bogus state). */ + set_command_state (file, cs_not_started); + + /* Now record which prerequisites are more + recent than this file, so we can define $?. */ + + deps_changed = 0; + for (d = file->deps; d != 0; d = d->next) + { + FILE_TIMESTAMP d_mtime = file_mtime (d->file); + check_renamed (d->file); + + if (! d->ignore_mtime) + { +#if 1 + /* %%% In version 4, remove this code completely to + implement not remaking deps if their deps are newer + than their parents. */ + if (d_mtime == NONEXISTENT_MTIME && !d->file->intermediate) + /* We must remake if this dep does not + exist and is not intermediate. */ + must_make = 1; +#endif + + /* Set DEPS_CHANGED if this dep actually changed. */ + deps_changed |= d->changed; + } + + /* Set D->changed if either this dep actually changed, + or its dependent, FILE, is older or does not exist. */ + d->changed |= noexist || d_mtime > this_mtime; + + if (!noexist && ISDB (DB_BASIC|DB_VERBOSE)) + { + const char *fmt = 0; + + if (d->ignore_mtime) + { + if (ISDB (DB_VERBOSE)) + fmt = _("Prerequisite '%s' is order-only for target '%s'.\n"); + } + else if (d_mtime == NONEXISTENT_MTIME) + { + if (ISDB (DB_BASIC)) + fmt = _("Prerequisite '%s' of target '%s' does not exist.\n"); + } + else if (d->changed) + { + if (ISDB (DB_BASIC)) + fmt = _("Prerequisite '%s' is newer than target '%s'.\n"); + } + else if (ISDB (DB_VERBOSE)) + fmt = _("Prerequisite '%s' is older than target '%s'.\n"); + + if (fmt) + { + print_spaces (depth); + printf (fmt, dep_name (d), file->name); + fflush (stdout); + } + } + } + + /* Here depth returns to the value it had when we were called. */ + depth--; + + if (file->double_colon && file->deps == 0) + { + must_make = 1; + DBF (DB_BASIC, + _("Target '%s' is double-colon and has no prerequisites.\n")); + } + else if (!noexist && file->is_target && !deps_changed && file->cmds == 0 + && !always_make_flag) + { + must_make = 0; + DBF (DB_VERBOSE, + _("No recipe for '%s' and no prerequisites actually changed.\n")); + } + else if (!must_make && file->cmds != 0 && always_make_flag) + { + must_make = 1; + DBF (DB_VERBOSE, _("Making '%s' due to always-make flag.\n")); + } + + if (!must_make) + { + if (ISDB (DB_VERBOSE)) + { + print_spaces (depth); + printf (_("No need to remake target '%s'"), file->name); + if (!streq (file->name, file->hname)) + printf (_("; using VPATH name '%s'"), file->hname); + puts ("."); + fflush (stdout); + } + + notice_finished_file (file); + + /* Since we don't need to remake the file, convert it to use the + VPATH filename if we found one. hfile will be either the + local name if no VPATH or the VPATH name if one was found. */ + + while (file) + { + file->name = file->hname; + file = file->prev; + } + + return 0; + } + + DBF (DB_BASIC, _("Must remake target '%s'.\n")); + + /* It needs to be remade. If it's VPATH and not reset via GPATH, toss the + VPATH. */ + if (!streq (file->name, file->hname)) + { + DB (DB_BASIC, (_(" Ignoring VPATH name '%s'.\n"), file->hname)); + file->ignore_vpath = 1; + } + + /* Now, take appropriate actions to remake the file. */ + remake_file (file); + + if (file->command_state != cs_finished) + { + DBF (DB_VERBOSE, _("Recipe of '%s' is being run.\n")); + return 0; + } + + switch (file->update_status) + { + case us_failed: + DBF (DB_BASIC, _("Failed to remake target file '%s'.\n")); + break; + case us_success: + DBF (DB_BASIC, _("Successfully remade target file '%s'.\n")); + break; + case us_question: + DBF (DB_BASIC, _("Target file '%s' needs to be remade under -q.\n")); + break; + case us_none: + break; + } + + file->updated = 1; + return file->update_status; +} + +/* 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 = !considered; + + 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 (!silent_flag) + OS (message, 0, "touch %s", file->name); + + /* Print-only (-n) takes precedence over touch (-t). */ + if (just_print_flag) + return us_success; + +#ifndef NO_ARCHIVES + if (ar_name (file->name)) + return ar_touch (file->name) ? us_failed : us_success; + else +#endif + { + int fd = 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. */ + if (read (fd, &buf, 1) < 0) + TOUCH_ERROR ("touch: read: "); + if (lseek (fd, 0L, 0) < 0L) + TOUCH_ERROR ("touch: lseek: "); + if (write (fd, &buf, 1) < 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); + 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; + + /* File's mtime is not known; must get it from the system. */ + +#ifndef NO_ARCHIVES + if (ar_name (file->name)) + { + /* This file is an archive-member reference. */ + + char *arname, *memname; + struct file *arfile; + time_t member_date; + + /* Find the archive's name. */ + ar_parse_name (file->name, &arname, &memname); + + /* Find the modification time of the archive itself. + Also allow for its name to be changed via VPATH search. */ + arfile = lookup_file (arname); + if (arfile == 0) + arfile = enter_file (strcache_add (arname)); + mtime = f_mtime (arfile, search); + check_renamed (arfile); + if (search && strcmp (arfile->hname, arname)) + { + /* The archive's name has changed. + Change the archive-member reference accordingly. */ + + char *name; + unsigned int arlen, memlen; + + arlen = strlen (arfile->hname); + memlen = strlen (memname); + + name = alloca (arlen + 1 + memlen + 2); + memcpy (name, arfile->hname, arlen); + name[arlen] = '('; + memcpy (name + arlen + 1, memname, memlen); + name[arlen + 1 + memlen] = ')'; + name[arlen + 1 + memlen + 1] = '\0'; + + /* If the archive was found with GPATH, make the change permanent; + otherwise defer it until later. */ + if (arfile->name == arfile->hname) + rename_file (file, strcache_add (name)); + else + rehash_file (file, strcache_add (name)); + check_renamed (file); + } + + free (arname); + + file->low_resolution_time = 1; + + if (mtime == NONEXISTENT_MTIME) + /* The archive doesn't exist, so its members don't exist either. */ + return NONEXISTENT_MTIME; + + member_date = ar_member_date (file->hname); + mtime = (member_date == (time_t) -1 + ? NONEXISTENT_MTIME + : file_timestamp_cons (file->hname, member_date, 0)); + } + else +#endif + { + mtime = name_mtime (file->name); + + if (mtime == NONEXISTENT_MTIME && search && !file->ignore_vpath) + { + /* If name_mtime failed, search VPATH. */ + const char *name = vpath_search (file->name, &mtime, NULL, NULL); + if (name + /* Last resort, is it a library (-lxxx)? */ + || (file->name[0] == '-' && file->name[1] == 'l' + && (name = library_search (file->name, &mtime)) != 0)) + { + 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. */ + if (gpath_search (name, strlen (name) - strlen (file->name) - 1)) + { + rename_file (file, name); + check_renamed (file); + return file_mtime (file); + } + + rehash_file (file, name); + check_renamed (file); + /* If the result of a vpath search is -o or -W, preserve it. + Otherwise, find the mtime of the resulting file. */ + if (mtime != OLD_MTIME && mtime != NEW_MTIME) + mtime = name_mtime (name); + } + } + } + + /* Files can have bogus timestamps that nothing newly made will be + "newer" than. Updating their dependents could just result in loops. + So notify the user of the anomaly with a warning. + + We only need to do this once, for now. */ + + if (!clock_skew_detected + && mtime != NONEXISTENT_MTIME && mtime != NEW_MTIME + && !file->updated) + { + static FILE_TIMESTAMP adjusted_now; + + FILE_TIMESTAMP adjusted_mtime = mtime; + +#if defined(WINDOWS32) || defined(__MSDOS__) + /* Experimentation has shown that FAT filesystems can set file times + up to 3 seconds into the future! Play it safe. */ + +#define FAT_ADJ_OFFSET (FILE_TIMESTAMP) 3 + + FILE_TIMESTAMP adjustment = FAT_ADJ_OFFSET << FILE_TIMESTAMP_LO_BITS; + if (ORDINARY_MTIME_MIN + adjustment <= adjusted_mtime) + adjusted_mtime -= adjustment; +#elif defined(__EMX__) + /* FAT filesystems round time to the nearest even second! + Allow for any file (NTFS or FAT) to perhaps suffer from this + brain damage. */ + FILE_TIMESTAMP adjustment = (((FILE_TIMESTAMP_S (adjusted_mtime) & 1) == 0 + && FILE_TIMESTAMP_NS (adjusted_mtime) == 0) + ? (FILE_TIMESTAMP) 1 << FILE_TIMESTAMP_LO_BITS + : 0); +#endif + + /* If the file's time appears to be in the future, update our + concept of the present and try once more. */ + if (adjusted_now < adjusted_mtime) + { + int resolution; + FILE_TIMESTAMP now = file_timestamp_now (&resolution); + adjusted_now = now + (resolution - 1); + if (adjusted_now < adjusted_mtime) + { +#ifdef NO_FLOAT + OS (error, NILF, + _("Warning: File '%s' has modification time in the future"), + file->name); +#else + double from_now = + (FILE_TIMESTAMP_S (mtime) - FILE_TIMESTAMP_S (now) + + ((FILE_TIMESTAMP_NS (mtime) - FILE_TIMESTAMP_NS (now)) + / 1e9)); + char from_now_string[100]; + + if (from_now >= 99 && from_now <= ULONG_MAX) + sprintf (from_now_string, "%lu", (unsigned long) from_now); + else + sprintf (from_now_string, "%.2g", from_now); + OSS (error, NILF, + _("Warning: File '%s' has modification time %s s in the future"), + file->name, from_now_string); +#endif + clock_skew_detected = 1; + } + } + } + + /* Store the mtime into all the entries for this file. */ + if (file->double_colon) + file = file->double_colon; + + 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; + + file->last_mtime = mtime; + file = file->prev; + } + while (file != 0); + + return mtime; +} + + +/* Return the mtime of the file or archive-member reference NAME. */ + +/* First, we check with stat(). If the file does not exist, then we return + NONEXISTENT_MTIME. If it does, and the symlink check flag is set, then + examine each indirection of the symlink and find the newest mtime. + This causes one duplicate stat() when -L is being used, but the code is + much cleaner. */ + +static FILE_TIMESTAMP +name_mtime (const char *name) +{ + FILE_TIMESTAMP mtime; + struct stat st; + int e; + + EINTRLOOP (e, stat (name, &st)); + if (e == 0) + mtime = FILE_TIMESTAMP_STAT_MODTIME (name, st); + else if (errno == ENOENT || errno == ENOTDIR) + mtime = NONEXISTENT_MTIME; + else + { + perror_with_name ("stat: ", name); + return NONEXISTENT_MTIME; + } + + /* If we get here we either found it, or it doesn't exist. + If it doesn't exist see if we can use a symlink mtime instead. */ + +#ifdef MAKE_SYMLINKS +#ifndef S_ISLNK +# define S_ISLNK(_m) (((_m)&S_IFMT)==S_IFLNK) +#endif + if (check_symlink_flag) + { + PATH_VAR (lpath); + + /* Check each symbolic link segment (if any). Find the latest mtime + amongst all of them (and the target file of course). + Note that we have already successfully dereferenced all the links + above. So, if we run into any error trying to lstat(), or + readlink(), or whatever, something bizarre-o happened. Just give up + and use whatever mtime we've already computed at that point. */ + strcpy (lpath, name); + while (1) + { + FILE_TIMESTAMP ltime; + PATH_VAR (lbuf); + long llen; + char *p; + + EINTRLOOP (e, lstat (lpath, &st)); + if (e) + { + /* Just take what we have so far. */ + if (errno != ENOENT && errno != ENOTDIR) + perror_with_name ("lstat: ", lpath); + break; + } + + /* If this is not a symlink, we're done (we started with the real + file's mtime so we don't need to test it again). */ + if (!S_ISLNK (st.st_mode)) + break; + + /* If this mtime is newer than what we had, keep the new one. */ + ltime = FILE_TIMESTAMP_STAT_MODTIME (lpath, st); + if (ltime > mtime) + mtime = ltime; + + /* Set up to check the file pointed to by this link. */ + EINTRLOOP (llen, readlink (lpath, lbuf, GET_PATH_MAX)); + if (llen < 0) + { + /* Eh? Just take what we have. */ + perror_with_name ("readlink: ", lpath); + break; + } + lbuf[llen] = '\0'; + + /* If the target is fully-qualified or the source is just a + filename, then the new path is the target. Otherwise it's the + source directory plus the target. */ + if (lbuf[0] == '/' || (p = strrchr (lpath, '/')) == NULL) + strcpy (lpath, lbuf); + else if ((p - lpath) + llen + 2 > GET_PATH_MAX) + /* Eh? Path too long! Again, just go with what we have. */ + break; + else + /* Create the next step in the symlink chain. */ + strcpy (p+1, lbuf); + } + } +#endif + + return mtime; +} + + +/* Search for a library file specified as -lLIBNAME, searching for a + suitable library file in the system library directories and the VPATH + directories. */ + +static const char * +library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr) +{ + static const char *dirs[] = + { +#ifndef _AMIGA + "/lib", + "/usr/lib", +#endif +#if defined(WINDOWS32) && !defined(LIBDIR) +/* + * This is completely up to the user at product install time. Just define + * a placeholder. + */ +#define LIBDIR "." +#endif + LIBDIR, /* Defined by configuration. */ + 0 + }; + + const char *file = 0; + char *libpatterns; + FILE_TIMESTAMP mtime; + + /* Loop variables for the libpatterns value. */ + char *p; + const char *p2; + unsigned int len; + unsigned int liblen; + + /* Information about the earliest (in the vpath sequence) match. */ + unsigned int best_vpath = 0, best_path = 0; + + const char **dp; + + libpatterns = xstrdup (variable_expand ("$(.LIBPATTERNS)")); + + /* Skip the '-l'. */ + lib += 2; + liblen = strlen (lib); + + /* Loop through all the patterns in .LIBPATTERNS, and search on each one. + To implement the linker-compatible behavior we have to search through + all entries in .LIBPATTERNS and choose the "earliest" one. */ + p2 = libpatterns; + while ((p = find_next_token (&p2, &len)) != 0) + { + static char *buf = NULL; + static unsigned int buflen = 0; + static int libdir_maxlen = -1; + static unsigned int std_dirs = 0; + char *libbuf = variable_expand (""); + + /* Expand the pattern using LIB as a replacement. */ + { + char c = p[len]; + char *p3, *p4; + + p[len] = '\0'; + p3 = find_percent (p); + if (!p3) + { + /* Give a warning if there is no pattern. */ + OS (error, NILF, + _(".LIBPATTERNS element '%s' is not a pattern"), p); + p[len] = c; + continue; + } + p4 = variable_buffer_output (libbuf, p, p3-p); + p4 = variable_buffer_output (p4, lib, liblen); + p4 = variable_buffer_output (p4, p3+1, len - (p3-p)); + p[len] = c; + } + + /* Look first for 'libNAME.a' in the current directory. */ + mtime = name_mtime (libbuf); + if (mtime != NONEXISTENT_MTIME) + { + if (mtime_ptr != 0) + *mtime_ptr = mtime; + file = strcache_add (libbuf); + /* This by definition will have the best index, so stop now. */ + break; + } + + /* Now try VPATH search on that. */ + + { + unsigned int vpath_index, path_index; + const char* f = vpath_search (libbuf, mtime_ptr ? &mtime : NULL, + &vpath_index, &path_index); + if (f) + { + /* If we have a better match, record it. */ + if (file == 0 || + vpath_index < best_vpath || + (vpath_index == best_vpath && path_index < best_path)) + { + file = f; + best_vpath = vpath_index; + best_path = path_index; + + if (mtime_ptr != 0) + *mtime_ptr = mtime; + } + } + } + + /* Now try the standard set of directories. */ + + if (!buflen) + { + for (dp = dirs; *dp != 0; ++dp) + { + int l = strlen (*dp); + if (l > libdir_maxlen) + libdir_maxlen = l; + std_dirs++; + } + buflen = strlen (libbuf); + buf = xmalloc (libdir_maxlen + buflen + 2); + } + else if (buflen < strlen (libbuf)) + { + buflen = strlen (libbuf); + buf = xrealloc (buf, libdir_maxlen + buflen + 2); + } + + { + /* Use the last std_dirs index for standard directories. This + was it will always be greater than the VPATH index. */ + unsigned int vpath_index = ~((unsigned int)0) - std_dirs; + + for (dp = dirs; *dp != 0; ++dp) + { + sprintf (buf, "%s/%s", *dp, libbuf); + mtime = name_mtime (buf); + if (mtime != NONEXISTENT_MTIME) + { + if (file == 0 || vpath_index < best_vpath) + { + file = strcache_add (buf); + best_vpath = vpath_index; + + if (mtime_ptr != 0) + *mtime_ptr = mtime; + } + } + + vpath_index++; + } + } + + } + + free (libpatterns); + return file; +} diff --git a/remote-cstms.c b/remote-cstms.c new file mode 100644 index 0000000..867ee8d --- /dev/null +++ b/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-2014 Free 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, int *id_ptr, int *used_stdin) +{ + char waybill[MAX_DATA_SIZE], msg[128]; + struct hostent *host; + struct timeval timeout; + struct sockaddr_in sin; + int len; + int retsock, retport, sock; + Rpc_Stat status; + int pid; + + /* Create the return socket. */ + retsock = Rpc_UdpCreate (True, 0); + if (retsock < 0) + { + O (error, NILF, "exporting: Couldn't create return socket."); + return 1; + } + + /* Get the return socket's port number. */ + len = sizeof (sin); + if (getsockname (retsock, (struct sockaddr *) &sin, &len) < 0) + { + (void) close (retsock); + perror_with_name ("exporting: ", "getsockname"); + return 1; + } + retport = sin.sin_port; + + /* Create the TCP socket for talking to the remote child. */ + sock = Rpc_TcpCreate (False, 0); + + /* Create a WayBill to give to the server. */ + len = Customs_MakeWayBill (&permit, normalized_cwd, argv[0], argv, + envp, retport, waybill); + + /* Modify the waybill as if the remote child had done 'child_access ()'. */ + { + WayBill *wb = (WayBill *) waybill; + wb->ruid = wb->euid; + wb->rgid = wb->egid; + } + + /* Send the request to the server, timing out in 20 seconds. */ + timeout.tv_usec = 0; + timeout.tv_sec = 20; + sin.sin_family = AF_INET; + sin.sin_port = htons (Customs_Port ()); + sin.sin_addr = permit.addr; + status = Rpc_Call (sock, &sin, (Rpc_Proc) CUSTOMS_IMPORT, + len, (Rpc_Opaque) waybill, + sizeof (msg), (Rpc_Opaque) msg, + 1, &timeout); + + host = gethostbyaddr ((char *)&permit.addr, sizeof(permit.addr), AF_INET); + + { + const char *hnm = host ? host->h_name : inet_ntoa (permit.addr); + size_t hlen = strlen (hnm); + + if (status != RPC_SUCCESS) + { + const char *err = Rpc_ErrorMessage (status); + (void) close (retsock); + (void) close (sock); + error (NILF, hlen + strlen (err), + "exporting to %s: %s", hnm, err); + return 1; + } + else if (msg[0] != 'O' || msg[1] != 'k' || msg[2] != '\0') + { + (void) close (retsock); + (void) close (sock); + error (NILF, hlen + strlen (msg), "exporting to %s: %s", hnm, msg); + return 1; + } + else + { + error (NILF, hlen + INTSTR_LENGTH, + "*** exported to %s (id %u)", hnm, permit.id); + } + + fflush (stdout); + fflush (stderr); + } + + pid = fork (); + if (pid < 0) + { + /* The fork failed! */ + perror_with_name ("fork", ""); + return 1; + } + else if (pid == 0) + { + /* Child side. Run 'export' to handle the connection. */ + static char sock_buf[20], retsock_buf[20], id_buf[20]; + static char *new_argv[6] = + { EXPORT_COMMAND, "-id", sock_buf, retsock_buf, id_buf, 0 }; + + /* Set up the arguments. */ + (void) sprintf (sock_buf, "%d", sock); + (void) sprintf (retsock_buf, "%d", retsock); + (void) sprintf (id_buf, "%x", permit.id); + + /* Get the right stdin. */ + if (stdin_fd != 0) + (void) dup2 (stdin_fd, 0); + + /* Unblock signals in the child. */ + unblock_sigs (); + + /* Run the command. */ + exec_command (new_argv, envp); + } + + /* Parent side. Return the 'export' process's ID. */ + (void) close (retsock); + (void) close (sock); + *is_remote = 0; + *id_ptr = pid; + *used_stdin = 1; + return 0; +} + +/* Get the status of a dead remote child. Block waiting for one to die + if BLOCK is nonzero. Set *EXIT_CODE_PTR to the exit status, *SIGNAL_PTR + to the termination signal or zero if it exited normally, and *COREDUMP_PTR + nonzero if it dumped core. Return the ID of the child that died, + 0 if we would have to block and !BLOCK, or < 0 if there were none. */ + +int +remote_status (int *exit_code_ptr, int *signal_ptr, int *coredump_ptr, + int block) +{ + return -1; +} + +/* Block asynchronous notification of remote child death. + If this notification is done by raising the child termination + signal, do not block that signal. */ +void +block_remote_children (void) +{ + return; +} + +/* Restore asynchronous notification of remote child death. + If this is done by raising the child termination signal, + do not unblock that signal. */ +void +unblock_remote_children (void) +{ + return; +} + +/* Send signal SIG to child ID. Return 0 if successful, -1 if not. */ +int +remote_kill (int id, int sig) +{ + return -1; +} diff --git a/remote-stub.c b/remote-stub.c new file mode 100644 index 0000000..aeb335c --- /dev/null +++ b/remote-stub.c @@ -0,0 +1,99 @@ +/* Template for the remote job exportation interface to GNU Make. +Copyright (C) 1988-2014 Free 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, int *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 (int id UNUSED, int sig UNUSED) +{ + return -1; +} diff --git a/rule.c b/rule.c new file mode 100644 index 0000000..9abf5b0 --- /dev/null +++ b/rule.c @@ -0,0 +1,533 @@ +/* Pattern and suffix rule internals for GNU Make. +Copyright (C) 1988-2014 Free 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. */ + +unsigned int max_pattern_dep_length; + +/* Pointer to structure for the file .SUFFIXES + whose dependencies are the suffixes to be searched. */ + +struct file *suffix_file; + +/* Maximum length of a suffix. */ + +unsigned int maxsuffix; + +/* Compute the maximum dependency length and maximum number of + dependencies of all implicit rules. Also sets the subdir + flag for a rule when appropriate, possibly removing the rule + completely when appropriate. */ + +void +count_implicit_rule_limits (void) +{ + char *name; + int namelen; + struct rule *rule; + + num_pattern_rules = max_pattern_targets = max_pattern_deps = 0; + max_pattern_dep_length = 0; + + name = 0; + namelen = 0; + rule = pattern_rules; + while (rule != 0) + { + unsigned int ndeps = 0; + struct dep *dep; + struct rule *next = rule->next; + + ++num_pattern_rules; + + if (rule->num > max_pattern_targets) + max_pattern_targets = rule->num; + + for (dep = rule->deps; dep != 0; dep = dep->next) + { + const char *dname = dep_name (dep); + unsigned int len = strlen (dname); + +#ifdef VMS + const char *p = strrchr (dname, ']'); + const char *p2; + if (p == 0) + p = strrchr (dname, ':'); + p2 = p != 0 ? strchr (dname, '%') : 0; +#else + const char *p = strrchr (dname, '/'); + const char *p2 = p != 0 ? strchr (dname, '%') : 0; +#endif + ndeps++; + + if (len > max_pattern_dep_length) + max_pattern_dep_length = len; + + if (p != 0 && p2 > p) + { + /* There is a slash before the % in the dep name. + Extract the directory name. */ + if (p == dname) + ++p; + if (p - dname > namelen) + { + namelen = p - dname; + name = xrealloc (name, namelen + 1); + } + memcpy (name, dname, p - dname); + name[p - dname] = '\0'; + + /* In the deps of an implicit rule the 'changed' flag + actually indicates that the dependency is in a + nonexistent subdirectory. */ + + dep->changed = !dir_file_exists_p (name, ""); + } + else + /* This dependency does not reside in a subdirectory. */ + dep->changed = 0; + } + + if (ndeps > max_pattern_deps) + max_pattern_deps = ndeps; + + rule = next; + } + + free (name); +} + +/* Create a pattern rule from a suffix rule. + TARGET is the target suffix; SOURCE is the source suffix. + CMDS are the commands. + If TARGET is nil, it means the target pattern should be '(%.o)'. + If SOURCE is nil, it means there should be no deps. */ + +static void +convert_suffix_rule (const char *target, const char *source, + struct commands *cmds) +{ + const char **names, **percents; + struct dep *deps; + + names = xmalloc (sizeof (const char *)); + percents = xmalloc (sizeof (const char *)); + + if (target == 0) + { + /* Special case: TARGET being nil means we are defining a '.X.a' suffix + rule; the target pattern is always '(%.o)'. */ +#ifdef VMS + *names = strcache_add_len ("(%.obj)", 7); +#else + *names = strcache_add_len ("(%.o)", 5); +#endif + *percents = *names + 1; + } + else + { + /* Construct the target name. */ + unsigned int len = strlen (target); + char *p = alloca (1 + len + 1); + p[0] = '%'; + memcpy (p + 1, target, len + 1); + *names = strcache_add_len (p, len + 1); + *percents = *names; + } + + if (source == 0) + deps = 0; + else + { + /* Construct the dependency name. */ + unsigned int len = strlen (source); + char *p = alloca (1 + len + 1); + p[0] = '%'; + memcpy (p + 1, source, len + 1); + deps = alloc_dep (); + deps->name = strcache_add_len (p, len + 1); + } + + create_pattern_rule (names, percents, 1, 0, deps, cmds, 0); +} + +/* Convert old-style suffix rules to pattern rules. + All rules for the suffixes on the .SUFFIXES list are converted and added to + the chain of pattern rules. */ + +void +convert_to_pattern (void) +{ + struct dep *d, *d2; + char *rulename; + + /* We will compute every potential suffix rule (.x.y) from the list of + suffixes in the .SUFFIXES target's dependencies and see if it exists. + First find the longest of the suffixes. */ + + maxsuffix = 0; + for (d = suffix_file->deps; d != 0; d = d->next) + { + unsigned int l = strlen (dep_name (d)); + if (l > maxsuffix) + maxsuffix = l; + } + + /* Space to construct the suffix rule target name. */ + rulename = alloca ((maxsuffix * 2) + 1); + + for (d = suffix_file->deps; d != 0; d = d->next) + { + unsigned int slen; + + /* Make a rule that is just the suffix, with no deps or commands. + This rule exists solely to disqualify match-anything rules. */ + convert_suffix_rule (dep_name (d), 0, 0); + + if (d->file->cmds != 0) + /* Record a pattern for this suffix's null-suffix rule. */ + convert_suffix_rule ("", dep_name (d), d->file->cmds); + + /* Add every other suffix to this one and see if it exists as a + two-suffix rule. */ + slen = strlen (dep_name (d)); + memcpy (rulename, dep_name (d), slen); + + for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next) + { + struct file *f; + unsigned int s2len; + + s2len = strlen (dep_name (d2)); + + /* Can't build something from itself. */ + if (slen == s2len && streq (dep_name (d), dep_name (d2))) + continue; + + memcpy (rulename + slen, dep_name (d2), s2len + 1); + f = lookup_file (rulename); + if (f == 0 || f->cmds == 0) + continue; + + if (s2len == 2 && rulename[slen] == '.' && rulename[slen + 1] == 'a') + /* A suffix rule '.X.a:' generates the pattern rule '(%.o): %.X'. + It also generates a normal '%.a: %.X' rule below. */ + convert_suffix_rule (NULL, /* Indicates '(%.o)'. */ + dep_name (d), + f->cmds); + + /* The suffix rule '.X.Y:' is converted + to the pattern rule '%.Y: %.X'. */ + convert_suffix_rule (dep_name (d2), dep_name (d), f->cmds); + } + } +} + + +/* Install the pattern rule RULE (whose fields have been filled in) at the end + of the list (so that any rules previously defined will take precedence). + If this rule duplicates a previous one (identical target and dependencies), + the old one is replaced if OVERRIDE is nonzero, otherwise this new one is + thrown out. When an old rule is replaced, the new one is put at the end of + the list. Return nonzero if RULE is used; zero if not. */ + +static int +new_pattern_rule (struct rule *rule, int override) +{ + struct rule *r, *lastrule; + unsigned int i, j; + + rule->in_use = 0; + rule->terminal = 0; + + rule->next = 0; + + /* Search for an identical rule. */ + lastrule = 0; + for (r = pattern_rules; r != 0; lastrule = r, r = r->next) + for (i = 0; i < rule->num; ++i) + { + for (j = 0; j < r->num; ++j) + if (!streq (rule->targets[i], r->targets[j])) + break; + /* If all the targets matched... */ + if (j == r->num) + { + struct dep *d, *d2; + for (d = rule->deps, d2 = r->deps; + d != 0 && d2 != 0; d = d->next, d2 = d2->next) + if (!streq (dep_name (d), dep_name (d2))) + break; + if (d == 0 && d2 == 0) + { + /* All the dependencies matched. */ + if (override) + { + /* Remove the old rule. */ + freerule (r, lastrule); + /* Install the new one. */ + if (pattern_rules == 0) + pattern_rules = rule; + else + last_pattern_rule->next = rule; + last_pattern_rule = rule; + + /* We got one. Stop looking. */ + goto matched; + } + else + { + /* The old rule stays intact. Destroy the new one. */ + freerule (rule, (struct rule *) 0); + return 0; + } + } + } + } + + matched:; + + if (r == 0) + { + /* There was no rule to replace. */ + if (pattern_rules == 0) + pattern_rules = rule; + else + last_pattern_rule->next = rule; + last_pattern_rule = rule; + } + + return 1; +} + + +/* Install an implicit pattern rule based on the three text strings + in the structure P points to. These strings come from one of + the arrays of default implicit pattern rules. + TERMINAL specifies what the 'terminal' field of the rule should be. */ + +void +install_pattern_rule (struct pspec *p, int terminal) +{ + struct rule *r; + const char *ptr; + + r = xmalloc (sizeof (struct rule)); + + r->num = 1; + r->targets = xmalloc (sizeof (const char *)); + r->suffixes = xmalloc (sizeof (const char *)); + r->lens = xmalloc (sizeof (unsigned int)); + + r->lens[0] = strlen (p->target); + r->targets[0] = p->target; + r->suffixes[0] = find_percent_cached (&r->targets[0]); + assert (r->suffixes[0] != NULL); + ++r->suffixes[0]; + + ptr = p->dep; + r->deps = PARSE_SIMPLE_SEQ ((char **)&ptr, struct dep); + + if (new_pattern_rule (r, 0)) + { + r->terminal = terminal; + r->cmds = xmalloc (sizeof (struct commands)); + r->cmds->fileinfo.filenm = 0; + r->cmds->fileinfo.lineno = 0; + /* 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 int n, int terminal, struct dep *deps, + struct commands *commands, int override) +{ + unsigned int i; + struct rule *r = xmalloc (sizeof (struct rule)); + + r->num = n; + r->cmds = commands; + r->deps = deps; + r->targets = targets; + r->suffixes = target_percents; + r->lens = xmalloc (n * sizeof (unsigned int)); + + for (i = 0; i < n; ++i) + { + r->lens[i] = strlen (targets[i]); + assert (r->suffixes[i] != NULL); + ++r->suffixes[i]; + } + + if (new_pattern_rule (r, override)) + r->terminal = terminal; +} + +/* Print the data base of rules. */ + +static void /* Useful to call from gdb. */ +print_rule (struct rule *r) +{ + unsigned int i; + + for (i = 0; i < r->num; ++i) + { + fputs (r->targets[i], stdout); + putchar ((i + 1 == r->num) ? ':' : ' '); + } + if (r->terminal) + putchar (':'); + + print_prereqs (r->deps); + + if (r->cmds != 0) + print_commands (r->cmds); +} + +void +print_rule_data_base (void) +{ + unsigned int rules, terminal; + struct rule *r; + + puts (_("\n# Implicit Rules")); + + rules = terminal = 0; + for (r = pattern_rules; r != 0; r = r->next) + { + ++rules; + + putchar ('\n'); + print_rule (r); + + if (r->terminal) + ++terminal; + } + + if (rules == 0) + puts (_("\n# No implicit rules.")); + else + { + printf (_("\n# %u implicit rules, %u"), rules, terminal); +#ifndef NO_FLOAT + printf (" (%.1f%%)", (double) terminal / (double) rules * 100.0); +#else + { + int f = (terminal * 1000 + 5) / rules; + printf (" (%d.%d%%)", f/10, f%10); + } +#endif + puts (_(" terminal.")); + } + + if (num_pattern_rules != rules) + { + /* This can happen if a fatal error was detected while reading the + makefiles and thus count_implicit_rule_limits wasn't called yet. */ + if (num_pattern_rules != 0) + ONN (fatal, NILF, _("BUG: num_pattern_rules is wrong! %u != %u"), + num_pattern_rules, rules); + } +} diff --git a/rule.h b/rule.h new file mode 100644 index 0000000..df9fba2 --- /dev/null +++ b/rule.h @@ -0,0 +1,57 @@ +/* Definitions for using pattern rules in GNU Make. +Copyright (C) 1988-2014 Free 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 unsigned int max_pattern_dep_length; + +extern struct file *suffix_file; +extern unsigned int maxsuffix; + + +void count_implicit_rule_limits (void); +void convert_to_pattern (void); +void install_pattern_rule (struct pspec *p, int terminal); +void create_pattern_rule (const char **targets, const char **target_percents, + unsigned int num, int terminal, struct dep *deps, + struct commands *commands, int override); diff --git a/signame.c b/signame.c new file mode 100644 index 0000000..7db2439 --- /dev/null +++ b/signame.c @@ -0,0 +1,254 @@ +/* Convert between signal names and numbers. +Copyright (C) 1990-2014 Free 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 char sig_initted = 0; + + if (!sig_initted) + sig_initted = signame_init (); +# endif +#endif + + if (sig > 0 && sig < NSIG) + return (char *) sys_siglist[sig]; + + sprintf (buf, "Signal %d", sig); + return buf; +} + +#endif /* HAVE_STRSIGNAL */ diff --git a/strcache.c b/strcache.c new file mode 100644 index 0000000..1ade5e7 --- /dev/null +++ b/strcache.c @@ -0,0 +1,291 @@ +/* Constant string caching for GNU Make. +Copyright (C) 2006-2014 Free 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) + +static sc_buflen_t 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 *new; + new = xmalloc (bufsize + CACHE_BUFFER_OFFSET); + new->end = 0; + new->count = 0; + new->bytesfree = bufsize; + + new->next = strcache; + strcache = new; + + ++total_buffers; + return new; +} + +static const char * +add_string (const char *str, unsigned int len) +{ + char *res; + struct strcache *sp; + struct strcache **spp = &strcache; + /* We need space for the nul char. */ + unsigned int sz = len + 1; + + /* If the string we want is too large to fit into a single buffer, then + no existing cache is large enough. Change the maximum size. */ + if (sz > bufsize) + bufsize = CACHE_BUFFER_SIZE ((((sz + 1) / CACHE_BUFFER_BASE) + 1) + * CACHE_BUFFER_BASE); + else + /* Find the first cache with enough free space. */ + for (; *spp != NULL; spp = &(*spp)->next) + if ((*spp)->bytesfree > sz) + break; + + /* If nothing is big enough, make a new cache. */ + sp = *spp; + if (sp == NULL) + { + sp = new_cache (); + spp = &sp; + } + + /* Add the string to this cache. */ + res = &sp->buffer[sp->end]; + memmove (res, str, len); + res[len] = '\0'; + sp->end += sz; + sp->bytesfree -= sz; + ++sp->count; + + /* If the amount free in this cache is less than the average string size, + consider it full and move it to the full list. */ + ++total_strings; + total_size += sz; + + if (sp->bytesfree < (total_size / total_strings) + 1) + { + *spp = (*spp)->next; + sp->next = fullcache; + fullcache = sp; + } + + return res; +} + + +/* 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, int len) +{ + /* Look up the string in the hash. If it's there, return it. */ + char *const *slot = (char *const *) hash_find_slot (&strings, str); + const char *key = *slot; + + /* Count the total number of add operations we performed. */ + ++total_adds; + + if (!HASH_VACANT (key)) + return key; + + /* Not there yet so add it to a buffer, then into the hash table. */ + key = add_string (str, len); + hash_insert_at (&strings, key, slot); + return key; +} + +/* Returns true if the string is in the cache; false if not. */ +int +strcache_iscached (const char *str) +{ + struct strcache *sp; + + for (sp = strcache; sp != 0; sp = sp->next) + if (str >= sp->buffer && str < sp->buffer + sp->end) + return 1; + for (sp = fullcache; sp != 0; sp = sp->next) + if (str >= sp->buffer && str < sp->buffer + sp->end) + return 1; + + return 0; +} + +/* If the string is already in the cache, return a pointer to the cached + version. If not, add it then return a pointer to the cached version. + Note we do NOT take control of the string passed in. */ +const char * +strcache_add (const char *str) +{ + return add_hash (str, strlen (str)); +} + +const char * +strcache_add_len (const char *str, unsigned int len) +{ + /* If we're not given a nul-terminated string we have to create one, because + the hashing functions expect it. */ + if (str[len] != '\0') + { + char *key = alloca (len + 1); + memcpy (key, str, len); + key[len] = '\0'; + str = key; + } + + return add_hash (str, len); +} + +int +strcache_setbufsize (unsigned int size) +{ + if (size > bufsize) + bufsize = size; + return bufsize; +} + +void +strcache_init (void) +{ + hash_init (&strings, 8000, str_hash_1, str_hash_2, str_hash_cmp); +} + + +/* Generate some stats output. */ + +void +strcache_print_stats (const char *prefix) +{ + const struct strcache *sp; + unsigned long numbuffs = 0, fullbuffs = 0; + unsigned long totfree = 0, maxfree = 0, minfree = bufsize; + + if (! strcache) + { + printf (_("\n%s No strcache buffers\n"), prefix); + return; + } + + /* Count the first buffer separately since it's not full. */ + for (sp = strcache->next; sp != NULL; sp = sp->next) + { + sc_buflen_t bf = sp->bytesfree; + + totfree += bf; + maxfree = (bf > maxfree ? bf : maxfree); + minfree = (bf < minfree ? bf : minfree); + + ++numbuffs; + } + for (sp = fullcache; sp != NULL; sp = sp->next) + { + sc_buflen_t bf = sp->bytesfree; + + totfree += bf; + maxfree = (bf > maxfree ? bf : maxfree); + minfree = (bf < minfree ? bf : minfree); + + ++numbuffs; + ++fullbuffs; + } + + /* Make sure we didn't lose any buffers. */ + assert (total_buffers == numbuffs + 1); + + printf (_("\n%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu B\n"), + prefix, numbuffs + 1, fullbuffs, total_strings, total_size, + (total_size / total_strings)); + + printf (_("%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"), + prefix, bufsize, strcache->end, strcache->count, + (strcache->end / strcache->count)); + + if (numbuffs) + { + unsigned long sz = total_size - bufsize; + unsigned long cnt = total_strings - strcache->count; + sc_buflen_t avgfree = totfree / numbuffs; + + printf (_("%s other used: total = %lu B / count = %lu / avg = %lu B\n"), + prefix, sz, cnt, sz / cnt); + + printf (_("%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"), + prefix, totfree, maxfree, minfree, avgfree); + } + + printf (_("\n%s strcache performance: lookups = %lu / hit rate = %lu%%\n"), + prefix, total_adds, (long unsigned)(100.0 * (total_adds - total_strings) / total_adds)); + fputs (_("# hash-table stats:\n# "), stdout); + hash_print_stats (&strings, stdout); +} diff --git a/subproc.bat b/subproc.bat new file mode 100644 index 0000000..e3b8d3c --- /dev/null +++ b/subproc.bat @@ -0,0 +1,23 @@ +@echo off +rem Copyright (C) 1996-2014 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 . + +cd w32\subproc +set MAKE=%2 +set MAKEFILE=%1 +if x%2 == x set MAKE=nmake +%MAKE% /f %MAKEFILE% +cd ..\.. diff --git a/tests/COPYING b/tests/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/tests/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/tests/ChangeLog.1 b/tests/ChangeLog.1 new file mode 100644 index 0000000..9abe731 --- /dev/null +++ b/tests/ChangeLog.1 @@ -0,0 +1,1429 @@ +2013-10-09 Paul Smith + + * scripts/features/patspecific_vars: Typo fixes. + +2013-10-05 Paul Smith + + * test_driver.pl (run_all_tests): Rewrite to be more clear. + * scripts/features/jobserver: Avoid using $ENV{HOME} as it doesn't + exist everywhere. + * scripts/features/default_names: End with 1; + + * scripts/features/loadapi: Use new calling signatures. Verify + the NOEXPAND flag works. Test with all valid function name + characters. + +2013-09-29 Paul Smith + + * scripts/variables/SHELL: Solaris /bin/sh can't handle options in + multiple words; skip that test. + * scripts/targets/ONESHELL: Ditto. + + * scripts/variables/GNUMAKEFLAGS: Verify that GNUMAKEFLAGS is + cleared and options are not duplicated. + +2013-09-23 Paul Smith + + * scripts/options/print-directory: Rename dash-w to + print-directory to avoid conflicts with dash-W on case-insensitive + filesystems. + +2013-09-22 Paul Smith + + * scripts/features/se_implicit: Verify that order-only tokens + inside second expansion are parsed correctly. + Test for Savannah bug #31155. + + * run_make_tests.pl (set_more_defaults): If we can't find + gnumake.h based on the make program we might be running from a + remote build directory. Parse the Makefile for the right path. + + Fix some test issues on Solaris. + + * scripts/features/archives: Determine what output ar gives when + adding and replacing objects and compare with that. + * scripts/features/escape: Solaris /bin/sh doesn't properly handle + backslashes inside single quotes, so don't rely on it. + * scripts/features/output-sync: false(1) gives different exit + codes on different systems; use "exit 1" instead. + * scripts/features/parallelism: Increase the timeout for slower systems. + +2013-09-21 Paul Smith + + * scripts/features/archives: Some versions of ar (MacOSX) generate + different output when creating archives. Run it and verify the + real output. + * scripts/features/default_names: MacOSX is, like Windows, + case-preserving / case-insensitive. Redo the test to avoid + checking for "UNIX". + * test_driver.pl (attach_default_output): Don't dup stdout into + stderr. Reported by Denis Excoffier + + * scripts/features/se_explicit: Fix a test that behaves + differently with/without archive capability enabled. + * scripts/features/output-sync: Don't test output-sync if it's not + enabled. We also skip it if parallelism is not enabled, although + strictly speaking some of the output-sync tests are valid even + without parallelism. + * scripts/features/jobserver: Move some tests that require the + jobserver from features/parallelism to a separate suite. Only run + this if jobserver mode is enabled. + + * scripts/features/output-sync: Test shell functions writing to + stderr in recipes: ensure it's captured via output-sync. Test + output generated while reading makefiles and make sure it's + captured via output-sync. Make sure that fatal errors dump the + output so it's not lost. + + * scripts/options/dash-w: Add a test for -w flag. + +2013-09-15 Paul Smith + + * scripts/misc/fopen-fail: Check for failure on infinite recursion. + * run_make_tests.pl (run_make_test): Allow the answer string to be + undef, which means that we shouldn't compare it at all. Only the + exit code matters in this case. + * test_driver.pl (compare_output): Ditto. + Test for Savannah bug #27374. + + * scripts/features/parallelism: Test broken jobserver on recursion. + Test for Savannah bug #39934. + + * scripts/options/eval: Verify --eval during restart. + Test for Savannah bug #39203. + +2013-09-14 Paul Smith + + * scripts/features/output-sync: Verify -Orecurse properly. + +2013-09-12 Paul Smith + + * scripts/features/output-sync: Modify for output sync behavior. + * scripts/variables/MAKE_RESTARTS: Ditto. + * scripts/variables/MAKEFLAGS: Remove mode for --trace. + * scripts/variables/GNUMAKEFLAGS: Ditto. + +2013-07-22 Paul Smith + + * scripts/features/rule_glob: Add tests for wildcards in rules. + Test for Savannah bug #39310. + +2013-07-09 Paul Smith + + * scripts/features/se_implicit: Add a test for SE rules depending + on other SE rules to be built. + +2013-05-26 Paul Smith + + * scripts/features/archives: Test for Savannah bug #38442. + + * scripts/misc/bs-nl: Test for Savannah bug #39035. + Add a test for Savannah bug #38945. + +2013-05-22 Paul Smith + + * scripts/options/dash-n: Fix results after MAKEFLAGS fixes. + * scripts/variables/MAKEFLAGS: Ditto. + * scripts/variables/GNUMAKEFLAGS: Ditto. + +2013-05-14 Paul Smith + + * scripts/features/loadapi: Add plugin_is_GPL_compatible symbol. + * scripts/features/load: Ditto. + +2013-05-13 Paul Smith + + * scripts/features/output-sync (output_sync_set): Update for new + --trace behavior. + +2013-05-05 Paul Smith + + * scripts/features/output-sync (output_sync_set): Remove + extraneous enter/leave lines, which are no longer printed. + Add tests for syncing command line printing. + (output_sync_set): Rename options: "job"->"line"; "make"->"recurse" + +2013-05-04 Paul Smith + + * scripts/features/loadapi: Use the new alloc functions. + + * scripts/features/output-sync (output_sync_set): New test for + ordered recursive output for -Ojob / -Otarget. + +2013-05-03 Eli Zaretskii + + * scripts/features/load: Fix signatures of testload_gmk_setup and + explicit_setup, to bring them in line with the documentation. + +2013-04-28 Paul Smith + + * scripts/features/output-sync (output_sync_set): Add tests for + the per-job syntax mode. + (output_sync_set): Test improved error message location. + +2013-04-15 Paul Smith + + * scripts/features/output-sync (output_sync_set): New arg syntax. + +2013-04-14 Paul Smith + + * scripts/features/output-sync: Rewrite to be more reliable. + + * test_driver.pl (_run_command): Don't set SIGALRM until after we + start the child. Print errors to the top-level output, which will + be stderr. + (attach_default_output): Use a list of file handles as the stack. + (detach_default_output): Ditto. + + * scripts/features/output-sync: Add a test for output-sync. + +2013-02-25 Paul Smith + + * run_make_tests.pl (valid_option): Support the -srcdir flag. + (set_more_defaults): Set up $srcdir if it's not set yet. + + * scripts/functions/guile: Verify gmk-eval doesn't expand twice. + * scripts/features/load: Rework to test just the load capability. + * scripts/features/loadapi: New set of tests for the load API. + +2013-01-19 Paul Smith + + * scripts/features/load: Test loaded files with and without "./" + prefix. Add tests for automatically rebuilding loaded files if + they are out of date or non-existent. + +2013-01-13 Paul Smith + + * scripts/features/archives: Add a check targets that have parens, + but are not archives. See Savannah bug #37878. + + * scripts/options/dash-n: Verify -n is preserved after recursive / + re-exec. See Savannah bug #38051. + +2013-01-12 Paul Smith + + * scripts/features/parallelism: Change rule so it doesn't depend + on invocation order, etc. + +2012-10-29 Paul Smith + + * scripts/features/load: New test suite for the "load" directive. + +2012-09-09 Paul Smith + + * scripts/functions/file: Get errors in the C locale, not the + current locale. Fixes Savannah bug #35764. + + * scripts/features/escape: Check that backslashes before + non-special characters are not removed. + + * scripts/features/utf8: New test for UTF-8 support. + See Savannah bug #36529. + + * scripts/targets/POSIX: Add tests for default macro values as + specified by IEEE Std 1003.1-2008. See Savannah bug #37069. + +2012-03-04 Paul Smith + + * scripts/features/se_explicit: Test $(x:%=%) format in secondary + expansion prerequisite lists. See Savannah bug #16545. + + * scripts/features/escape: Test escaped ":" in prerequisite lists. + See Savannah bug #12126. + + * scripts/variables/private: Test appending private variables in + pattern-specific target rules. See Savannah bug #35468. + +2012-03-03 Paul Smith + + * scripts/variables/SHELL: Ensure .SHELLFLAGS works with options + separated by whitespace. + + * scripts/targets/ONESHELL: Try .ONESHELL in combination with + whitespace-separated options in .SHELLFLAGS. See Savannah bug #35397. + + * scripts/functions/filter-out: Add filter tests and test escape + operations. See Savannah bug #35410. + + * guile.supp: Suppress valgrind errors from Guile + * run_make_tests.pl: Use the Guile suppression file. + + * scripts/misc/bs-nl: Check for POSIX and non-POSIX + backslash/newline handling. Addresses Savannah bug #16670. + +2012-01-29 Paul Smith + + * scripts/variables/flavors: Add tests for ::= + * scripts/variables/define: Ditto + + * scripts/functions/file: Test the new $(file ...) function. + +2012-01-12 Paul Smith + + * scripts/functions/guile: New regression tests for Guile support. + +2011-12-10 Paul Smith + + * scripts/targets/SECONDARY: Add prereq statements to ensure rules + are printed in the right order for test #9 + +2011-11-14 Paul Smith + + * scripts/features/double_colon: Check double-colon with escaped + filenames. See Savannah bug #33399. + +2011-09-18 Paul Smith + + * scripts/features/parallelism: On re-exec make sure we preserve + the value of MAKEFLAGS when necessary. See Savannah bug #33873. + + * scripts/features/vpath3: Verify handling of -lfoo libraries + found via vpath vs. the standard directory search. + See Savannah bug #32511. + +2011-09-12 Paul Smith + + * scripts/functions/call: Verify that using export in a $(call ...) + context creates a global variable. See Savannah bug #32498. + +2011-09-02 Paul Smith + + * scripts/options/dash-n: Verify that in "-n -t", the -n takes + priority. Patch from Michael Witten . + +2011-08-29 Paul Smith + + * scripts/features/varnesting: Test resetting of variables while + expanding them. See Savannah patch #7534 + +2011-06-12 Paul Smith + + * scripts/features/archives: Check archives with whitespace at the + beginning, end, and extra in the middle. + Another test for Savannah bug #30612. + +2011-05-07 Paul Smith + + * scripts/variables/private: Ensure we skip private variables when + appending. Test for Savannah bug #32872. + + * scripts/functions/wildcard: Verify wildcard used to test for + file existence/non-existence. + +2011-05-02 Paul Smith + + * scripts/functions/sort: Add a test for Savannah bug #33125. + +2011-04-17 David A. Wheeler + + * scripts/features/shell_assignment: Regression for "!=" feature + +2010-11-06 Paul Smith + + * scripts/features/targetvars: Fix known-good output for BS/NL changes. + * scripts/functions/call: Ditto. + * scripts/variables/special: Ditto. + + * scripts/misc/bs-nl: New test suite for backslash/newline testing. + +2010-08-29 Paul Smith + + * scripts/features/errors: Add new error message to output text. + * scripts/variables/SHELL: Ditto. + * scripts/targets/POSIX: Ditto. + * scripts/options/dash-k: Ditto. + * scripts/features/vpathplus: Ditto. + * scripts/features/patternrules: Ditto. + * scripts/features/parallelism: Ditto. + +2010-08-13 Paul Smith + + * scripts/features/archives: New regression tests for archive + support. Test for fix to Savannah bug #30612. + + * run_make_tests.pl (set_more_defaults): Set a %FEATURES hash to + the features available in $(.FEATURES). + +2010-08-10 Paul Smith + + * scripts/features/reinvoke: Ensure command line variable settings + are preserved across make re-exec. Tests Savannah bug #30723. + +2010-07-28 Paul Smith + + * scripts/targets/POSIX: Compatibility issues with Solaris (and + Tru64?); "false" returns different exit codes, and set -x shows + output with extra whitespace. Run the commands by hand first to + find out what the real shell would do, then compare what make does. + * scripts/variables/SHELL: Ditto. + +2010-07-12 Paul Smith + + * test_driver.pl: Add a new $perl_name containing the path to Perl. + * run_make_tests.pl (run_make_test): Replace the special string + #PERL# in a makefile etc. with the path the Perl executable so + makefiles can use it. + + * scripts/targets/ONESHELL: Add a new set of regression tests for + the .ONESHELL feature. + +2010-07-06 Paul Smith + + * scripts/variables/SHELL: Test the new .SHELLFLAGS variable. + + * scripts/targets/POSIX: New file. Test the .POSIX special target. + Verify that enabling .POSIX changes the shell flags to set -e. + +2010-07-01 Paul Smith + + * scripts/features/recursion: Add a space to separate command-line + args. Fixes Savannah bug #29968. + +2009-11-12 Boris Kolpackov + + * scripts/features/vpath3: Test for the new library search + behavior. + +2009-10-06 Boris Kolpackov + + * scripts/features/se_explicit: Enable the test for now fixed + Savannah bug 25780. + +2009-10-06 Boris Kolpackov + + * scripts/variables/undefine: Tests for the new undefine feature. + +2009-10-03 Paul Smith + + * scripts/features/parallelism: Test for open Savannah bug #26846. + + * scripts/variables/MAKE: Rewrite for new run_make_test() format. + + * scripts/variables/MAKEFLAGS: Created. + Add test for Savannah bug #2216 (still open). + + * scripts/features/include: Test for Savannah bug #102 (still open). + +2009-09-30 Boris Kolpackov + + * scripts/features/include: Add diagnostics issuing tests for + cases where targets have been updated and failed with the + dontcare flag. Savannah bugs #15110, #25493, #12686, #17740. + +2009-09-28 Paul Smith + + * scripts/functions/shell: Add regression test for Savannah bug + #20513 (still open). + + * scripts/features/se_explicit: Add regression tests for Savannah + bug #25780 (still open). + + * run_make_tests.pl (valid_option): Add a new flag, -all([-_]?tests)? + that runs tests we know will fail. This allows us to add + regression tests to the test suite for bugs that haven't been + fixed yet. + +2009-09-28 Boris Kolpackov + + * scripts/features/patspecific_vars: Add a test for the shortest + stem first order. + + * scripts/features/patternrules: Add a test for the shortest stem + first order. + +2009-09-24 Paul Smith + + * scripts/features/se_implicit: Add a test for order-only + secondary expansion prerequisites. + +2009-09-23 Paul Smith + + * scripts/features/patternrules: Test that we can remove pattern + rules, both single and multiple prerequisites. Savannah bug #18622. + + * scripts/features/echoing: Rework for run_make_test(). + +2009-06-14 Paul Smith + + * scripts/features/vpath: Verify we don't get bogus circular + dependency warnings if we choose a different file via vpath during + update. Savannah bug #13529. + +2009-06-13 Paul Smith + + * scripts/variables/MAKEFILES: Verify that MAKEFILES included + files (and files included by them) don't set the default goal. + Savannah bug #13401. + + * scripts/functions/wildcard: Test that wildcards with + non-existent glob matchers return empty. + +2009-06-09 Paul Smith + + * scripts/options/dash-B: Test the $? works correctly with -B. + Savannah bug #17825. + + * scripts/features/patternrules: Test that dependencies of + "also_make" targets are created properly. Savannah bug #19108. + + * test_driver.pl (compare_output): Create a "run" file for failed + tests containing the command that was run. + (get_runfile): New function. + + * run_make_tests.pl (valid_option): Enhanced support for valgrind: + allow memcheck and massif tools. + + * scripts/features/patternrules: Have to comment out a line in the + first test due to backing out a change that broke the implicit + rule search algorithm. Savannah bug #17752. + * scripts/misc/general4: Remove a test that is redundant with + patternrules. + + * scripts/features/parallelism: Add a test for re-exec with + jobserver master override. Savannah bug #18124. + +2009-06-08 Paul Smith + + * scripts/features/targetvars: Add a test for continued target + vars after a semicolon. Savannah bug #17521. + +2009-06-07 Paul Smith + + * scripts/features/se_explicit: Make sure we catch defining + prereqs during snap_deps(). Savannah bug #24622. + + * scripts/variables/automatic: Check prereq ordering when the + target with the recipe has no prereqs. Savannah bug #21198. + + * scripts/variables/LIBPATTERNS: Add a new set of test for + $(.LIBPATTERNS) (previously untested!) + +2009-06-04 Paul Smith + + * scripts/variables/SHELL: The export target-specific SHELL test + has an incorrect known-good-value. + + * scripts/misc/general4: Check for whitespace (ffeed, vtab, etc.) + + * scripts/features/se_explicit: Add tests for Savannah bug #24588. + +2009-05-31 Paul Smith + + * scripts/variables/DEFAULT_GOAL: Add tests for Savannah bug #25697. + + * scripts/features/targetvars: Add tests of overrides for Savannah + bug #26207. + * scripts/features/patspecific_vars: Ditto. + + * scripts/features/patternrules: Add a test for Savannah bug #26593. + +2009-05-30 Paul Smith + + * scripts/variables/flavors: Update with new variable flavor tests. + * scripts/variables/define: Create a new set of tests for + define/endef and move those aspects of the flavors suite here. + +2009-05-25 Paul Smith + + * scripts/features/targetvars: Ditto. + + * scripts/features/export: Test new variable parsing abilities. + +2009-02-23 Ramon Garcia + + * scripts/variables/private: Create a new suite of tests for 'private'. + +2007-11-04 Paul Smith + + * scripts/functions/eval: Update error message for command -> recipe. + + * test_driver.pl (compare_output): Allow the answer to be a regex, + if surrounded by '/'. + * scripts/misc/close_stdout: Use a regex for the answer, since + sometimes the error will have a description and sometimes it won't. + +2007-09-10 Paul Smith + + * scripts/variables/special: Add tests for .RECIPEPREFIX variable. + +2007-08-15 Paul Smith + + These test cases were contributed by + Icarus Sparry and J. David Bryan for + Savannah bugs #3330 and #15919. + + * scripts/targets/SECONDARY: Add tests for Savannah bugs 3330 and + 15919. + + * scripts/features/parallelism: Add tests for wrong answer/hang + combining INTERMEDIATE, order-only prereqs, and parallelism. + See Savannah bugs 3330 and 15919. + +2007-07-13 Paul Smith + + Install a timeout so tests can never loop infinitely. + Original idea and patch for a single-test version provided by + Icarus Sparry + + * test_driver.pl (_run_command): New function: this is called by + other functions to actually run a command. Before we run it, + install a SIGALRM handler and set up a timer to go off in the + future (default is 5s; this can be overridden by individual tests). + (run_command): Call it. + (run_command_with_output): Call it. + + * run_make_tests.pl (run_make_with_options): Override the default + timeout if the caller requests it. + (run_make_test): Pass any timeout override to run_make_with_options. + + * scripts/features/parallelism: Increase the timeout for long tests. + * scripts/options/dash-l: Ditto. + +2006-10-01 Paul Smith + + * run_make_tests.pl (set_more_defaults): Remove setting of LANG in + ENV here. This doesn't always work. + * test_driver.pl (toplevel): Set LC_ALL to 'C' in the make + environment. Fixes Savannah bug #16698. + +2006-09-30 Paul Smith + + * scripts/variables/automatic: Add back the test for bug #8154. + +2006-04-01 Paul D. Smith + + * scripts/functions/realpath: Don't run tests with multiple + initial slashes on Windows: those paths mean something different. + +2006-03-19 Paul D. Smith + + * scripts/features/parallelism: Test that the jobserver is + properly managed when we have to re-exec the master instance of + make. + +2006-03-17 Boris Kolpackov + + * scripts/features/statipattrules: Add tests for bug #16053. + +2006-03-09 Paul Smith + + * scripts/features/escape: Use "pre:" not "p:" to avoid conflicts + with DOS drive letters. Fixes Savannah bug #15947. + + * test_driver.pl (run_each_test): Set the status properly even + when a test fails to execute. Fixes Savannah bug #15942. + + * scripts/functions/foreach: Use a different environment variable + other than PATH to avoid differences with Windows platforms. + Fixes Savannah bug #15938. + +2006-03-05 Paul D. Smith + + * run_make_tests.pl (set_more_defaults): Add CYGWIN_NT as a port + type W32. Fixed Savannah bug #15937. + + * scripts/features/default_names: Don't call error() when the test + fails. Fixes Savannah bug #15941. + +2006-02-17 Paul D. Smith + + * scripts/features/targetvars: Test a complex construction which + guarantees that we have to merge variable lists of different + sizes. Tests for Savannah bug #15757. + +2006-02-15 Paul D. Smith + + * scripts/functions/error: Make sure filename/lineno information + is related to where the error is expanded, not where it's set. + * scripts/functions/warning: Ditto. + * scripts/functions/foreach: Check for different error conditions. + * scripts/functions/word: Ditto. + * scripts/variables/negative: Test some variable reference failure + conditions. + * scripts/options/warn-undefined-variables: Test the + --warn-undefined-variables flag. + +2006-02-09 Paul D. Smith + + * run_make_tests.pl (set_more_defaults): Update valgrind support + for newer versions. + * test_driver.pl (toplevel): Skip all hidden files/directories (ones + beginning with "."). + + * scripts/functions/andor: Tests for $(and ...) and $(or ...) + functions. + +2006-02-08 Boris Kolpackov + + * scripts/features/parallelism: Add a test for bug #15641. + +2006-02-06 Paul D. Smith + + * scripts/options/dash-W: Add a test for bug #15341. + +2006-01-03 Paul D. Smith + + * scripts/variables/automatic: Add a test for bug #8154. + + * README: Update to reflect the current state of the test suite. + +2005-12-12 Paul D. Smith + + * scripts/features/parallelism, scripts/functions/wildcard, + scripts/targets/FORCE, scripts/targets/PHONY, + scripts/targets/SILENT: Use the default setting for + $delete_command. Fixes bug #15085. + + * run_make_tests.pl (get_this_pwd) [VMS]: Use -no_ask with delete_file. + +2005-12-11 Paul D. Smith + + * scripts/misc/general4: Test implicit rules with '$' in the + prereq list & prereq patterns. + * scripts/features/se_implicit: Add in .SECONDEXPANSION settings. + +2005-12-09 Boris Kolpackov + + * scripts/features/patternrules: Add a test for bug #13022. + +2005-12-07 Boris Kolpackov + + * scripts/features/double_colon: Add a test for bug #14334. + +2005-11-17 Boris Kolpackov + + * scripts/functions/flavor: Add a test for the flavor function. + +2005-11-14 Boris Kolpackov + + * scripts/variables/INCLUDE_DIRS: Add a test for the .INCLUDE_DIRS + special variable. + +2005-10-24 Paul D. Smith + + * scripts/misc/general4: Test '$$' in prerequisites list. + * scripts/features/statipattrules: Rewrite to use run_make_test(). + Add various static pattern info. + * scripts/features/se_statpat: Enable .SECONDEXPANSION target. + * scripts/features/se_explicit: Add tests for handling '$$' in + prerequisite lists with and without setting .SECONDEXPANSION. + * scripts/features/order_only: Convert to run_make_test(). + * run_make_tests.pl (set_more_defaults): If we can't get the value + of $(MAKE) from make, then fatal immediately. + +2005-08-31 Paul D. Smith + + * run_make_tests.pl (get_this_pwd): Require the POSIX module (in + an eval to trap errors) and if it exists, use POSIX::getcwd to + find the working directory. If it doesn't exist, go back to the + previous methods. This tries to be more accurate on Windows + systems. + +2005-08-29 Paul D. Smith + + * scripts/functions/abspath: Add some text to the error messages + to get a better idea of what's wrong. Make warnings instead of + errors. + + * scripts/features/patspecific_vars: Don't use "test", which is + UNIX specific. Print the values and let the test script match + them. + +2005-08-25 Paul Smith + + * scripts/variables/SHELL: Use a /./ prefix instead of //: the + former works better with non-UNIX environments. Fixes Savannah + bug #14129. + +2005-08-13 Boris Kolpackov + + * scripts/functions/wildcard: Wrap calls to $(wildcard) with + $(sort) so that the resulting order is no longer filesystem- + dependent. + +2005-08-10 Boris Kolpackov + + * scripts/features/statipattrules: Add a test for Savannah bug #13881. + +2005-08-07 Paul D. Smith + + * scripts/features/parallelism: Add a test for a bug reported by + Michael Matz (matz@suse.de) in which make exits without waiting + for all its children in some situations during parallel builds. + +2005-07-08 Paul D. Smith + + * test_driver.pl: Reset the environment to a clean value every + time before we invoke make. I'm suspicious that the environment + isn't handled the same way in Windows as it is in UNIX, and some + variables are leaking out beyond the tests they are intended for. + Create an %extraENV hash tests can set to add more env. vars. + * tests/scripts/features/export: Change to use %extraENV. + * tests/scripts/functions/eval: Ditto. + * tests/scripts/functions/origin: Ditto. + * tests/scripts/options/dash-e: Ditto. + * tests/scripts/variables/SHELL: Ditto. + +2005-06-27 Paul D. Smith + + * scripts/options/dash-W: Use 'echo >>' instead of touch to update + files. + * scripts/features/reinvoke: Rewrite to be safer on systems with + subsecond timestamps. + * scripts/features/patternrules: False exits with different error + codes on different systems (for example, Linux => 1, Solaris => 255). + + * scripts/options/dash-W: Set the timestamp to foo.x in the future, + to be sure it will be considered updated when it's remade. + +2005-06-26 Paul D. Smith + + * scripts/functions/shell: New test suite for the shell function. + +2005-06-25 Paul D. Smith + + * scripts/features/include: Test include/-include/sinclude with no + arguments. Tests fix for Savannah bug #1761. + + * scripts/misc/general3: Implement comprehensive testing of + backslash-newline behavior in command scripts: various types of + quoting, fast path / slow path, etc. + Tests fix for Savannah bug #1332. + + * scripts/options/symlinks: Test symlinks to non-existent files. + Tests fix for Savannah bug #13280. + + * scripts/misc/general3: Test semicolons in variable references. + Tests fix for Savannah bug #1454. + + * scripts/variables/MAKE_RESTARTS: New file: test the + MAKE_RESTARTS variable. + * scripts/options/dash-B: Test re-exec doesn't loop infinitely. + Tests fix for Savannah bug #7566. + * scripts/options/dash-W: New file: test the -W flag, including + re-exec infinite looping. + +2005-06-12 Paul D. Smith + + * scripts/misc/close_stdout: Add a test for Savannah bug #1328. + This test only works on systems that have /dev/full (e.g., Linux). + +2005-06-09 Paul D. Smith + + * scripts/functions/foreach: Add a test for Savannah bug #11913. + +2005-05-31 Boris Kolpackov + + * scripts/features/include: Add a test for Savannah bug #13216. + * scripts/features/patternrules: Add a test for Savannah bug #13218. + +2005-05-13 Paul D. Smith + + * scripts/features/conditionals: Add tests for the new if... else + if... endif syntax. + +2005-05-03 Paul D. Smith + + * scripts/variables/DEFAULT_GOAL: Rename DEFAULT_TARGET to + DEFAULT_GOAL. + +2005-05-02 Paul D. Smith + + * scripts/features/parallelism: Add a test for exporting recursive + variables containing $(shell) calls. Rewrite this script to use + run_make_test() everywhere. + +2005-04-07 Paul D. Smith + + * scripts/targets/SECONDARY: Add a test for Savannah bug #12331. + +2005-03-15 Boris Kolpackov + + * scripts/variables/automatic: Add a test for Savannah bug #12320. + +2005-03-10 Boris Kolpackov + + * scripts/features/patternrules: Add a test for Savannah bug #12267. + +2005-03-09 Boris Kolpackov + + * scripts/variables/DEFAULT_TARGET: Add a test for Savannah + bug #12266. + +2005-03-04 Boris Kolpackov + + * scripts/features/patternrules: Add a test for Savannah bug #12202. + +2005-03-03 Boris Kolpackov + + * scripts/features/se_implicit: Add a test for stem + termination bug. Add a test for stem triple-expansion bug. + + * scripts/features/se_statpat: Add a test for stem + triple-expansion bug. + + * scripts/features/statipattrules: Change test #4 to reflect + new way empty prerequisite list is handled. + + +2005-03-01 Boris Kolpackov + + * scripts/features/statipattrules: Add a test for + Savannah bug #12180. + +2005-02-28 Paul D. Smith + + * scripts/options/dash-q: Add a test for Savannah bug # 7144. + + * scripts/options/symlinks: New file to test checking of symlink + timestamps. Can't use filename dash-L because it conflicts with + dash-l on case-insensitive filesystems. + + * scripts/variables/MAKEFILE_LIST, scripts/variables/MFILE_LIST: + Rename MAKEFILE_LIST test to MFILE_LIST, for systems that need 8.3 + unique filenames. + +2005-02-28 Boris Kolpackov + + * scripts/variables/DEFAULT_TARGET: Test the .DEFAULT_TARGET + special variable. + +2005-02-27 Boris Kolpackov + + * scripts/features/se_explicit: Test the second expansion in + explicit rules. + * scripts/features/se_implicit: Test the second expansion in + implicit rules. + * scripts/features/se_statpat: Test the second expansion in + static pattern rules. + * scripts/variables/automatic: Fix to work with the second + expansion. + + * scripts/misc/general4: Add a test for bug #12091. + +2005-02-27 Paul D. Smith + + * scripts/functions/eval: Check that eval of targets within + command scripts fails. See Savannah bug # 12124. + +2005-02-26 Paul D. Smith + + * test_driver.pl (compare_output): If a basic comparison of the + log and answer doesn't match, try harder: change all backslashes + to slashes and all CRLF to LF. This helps on DOS/Windows systems. + +2005-02-09 Paul D. Smith + + * scripts/features/recursion: Test command line variable settings: + only one instance of a given variable should be provided. + +2004-11-30 Boris Kolpackov + + * tests/scripts/functions/abspath: New file: test `abspath' + built-in function. + + * tests/scripts/functions/realpath: New file: test `realpath' + built-in function. + +2004-11-28 Paul D. Smith + + * scripts/options/dash-C [WINDOWS32]: Add a test for bug #10252; + this doesn't really test anything useful in UNIX but... + + * scripts/variables/SHELL: New file: test proper handling of SHELL + according to POSIX rules. Fixes bug #1276. + +2004-10-21 Boris Kolpackov + + * scripts/functions/word: Test $(firstword ) and $(lastword ). + +2004-10-05 Boris Kolpackov + + * scripts/features/patspecific_vars: Test simple/recursive + variable expansion. + +2004-09-28 Boris Kolpackov + + * scripts/features/include: Test dontcare flag inheritance + when rebuilding makefiles. + +2004-09-27 Boris Kolpackov + + * scripts/features/patspecific_vars: Test exported variables. + +2004-09-22 Paul D. Smith + + * run_make_tests.pl (run_make_test): Don't add newlines to the + makestring or answer if they are completely empty. + + * scripts/features/patternrules: Rename from implicit_prereq_eval. + + * scripts/test_template: Rework the template. + +2004-09-21 Boris Kolpackov + + * run_make_tests.pl: Change `#!/usr/local/bin/perl' to be + `#!/usr/bin/env perl'. + + * scripts/features/implicit_prereq_eval: Test implicit rule + prerequisite evaluation code. + +2004-09-21 Paul D. Smith + + * run_make_tests.pl (run_make_test): Enhance to allow the make + string to be undef: in that case it reuses the previous make + string. Allows multiple tests on the same makefile. + + * scripts/variables/flavors: Add some tests for prefix characters + interacting with define/endef variables. + +2004-09-20 Paul D. Smith + + * scripts/functions/substitution: Rewrite to use run_make_test() + interface, and add test for substitution failures reported by + Markus Mauhart . + +2004-03-22 Paul D. Smith + + * test_driver.pl (run_each_test, toplevel, compare_output): Change + to track both the testing categories _AND_ the number of + individual tests, and report both sets of numbers. + +2004-02-21 Paul D. Smith + + * scripts/functions/origin: Set our own environment variable + rather than relying on $HOME. + +2004-01-21 Paul D. Smith + + * scripts/features/conditionals: Test arguments to ifn?def which + contain whitespace (such as a function that is evaluated). Bug + #7257. + +2004-01-07 Paul D. Smith + + * scripts/features/order_only: Test order-only prerequisites in + pattern rules (patch #2349). + +2003-11-02 Paul D. Smith + + * scripts/functions/if: Test if on conditionals with trailing + whitespace--bug #5798. + + * scripts/functions/eval: Test eval in a non-file context--bug #6195. + +2003-04-19 Paul D. Smith + + * scripts/features/patspecific_vars: Test multiple patterns + matching the same target--Bug #1405. + +2003-04-09 Paul D. Smith + + * run_make_tests.pl (set_more_defaults): A new $port_type of + 'OS/2' for (surprise!) OS/2. Also choose a wait time of 2 seconds + for OS/2. + +2003-03-28 Paul D. Smith + + * scripts/targets/SECONDARY: Test the "global" .SECONDARY (with + not prerequisites)--Bug #2515. + +2003-01-30 Paul D. Smith + + * scripts/features/targetvars: Test very long target-specific + variable definition lines (longer than the default make buffer + length). Tests patch # 1022. + + * scripts/functions/eval: Test very recursive $(eval ...) calls + with simple variable expansion (bug #2238). + + * scripts/functions/word: Test error handling for word and + wordlist functions (bug #2407). + +2003-01-22 Paul D. Smith + + * scripts/functions/call: Test recursive argument masking (bug + #1744). + +2002-10-25 Paul D. Smith + + * scripts/functions/eval: Test using $(eval ...) inside + conditionals (Bug #1516). + +2002-10-14 Paul D. Smith + + * scripts/options/dash-t: Add a test for handling -t on targets + with no commands (Bug #1418). + +2002-10-13 Paul D. Smith + + * scripts/features/targetvars: Add a test for exporting + target-specific vars (Bug #1391). + +2002-10-05 Paul D. Smith + + * scripts/variables/automatic: Add tests for $$(@), $${@}, $${@D}, + and $${@F}. + +2002-09-23 Paul D. Smith + + * scripts/features/escape: Test handling of escaped comment + characters in targets and prerequisites. + +2002-09-18 Paul D. Smith + + * scripts/features/export: Test export/unexport of multiple + variables in a single command. + +2002-09-17 Paul D. Smith + + * scripts/features/targetvars: Tests for Bug #940: test + target-specific and pattern-specific variables in conjunction with + double-colon targets. + +2002-09-10 Paul D. Smith + + * test_driver.pl (compare_output): Match the new format for time + skew error messages. + + * scripts/features/export: Created. Add tests for export/unexport + capabilities, including exporting/unexporting expanded variables. + + * scripts/features/conditionals: Add a test for expanded variables + in ifdef conditionals. + +2002-09-04 Paul D. Smith + + * scripts/features/reinvoke: Change touch/sleep combos to utouch + invocations. + * scripts/features/vpathgpath: Ditto. + * scripts/features/vpathplus: Ditto. + * scripts/options/dash-n: Ditto. + * scripts/targets/INTERMEDIATE: Ditto. + * scripts/targets/SECONDARY: Ditto. + + * scripts/options/dash-t: Added a test for the -t bug fixed by + Henning Makholm. This test was also contributed by Henning. + + * scripts/misc/general4: Add a test suite for obscure algorithmic + features of make. First test: make sure creation subdirectories + as prerequisites of targets works properly. + + * scripts/misc/version: Remove this bogus test. + +2002-08-07 Paul D. Smith + + * scripts/misc/general3: Add a test for makefiles that don't end + in newlines. + + * scripts/variables/special: Create tests for the special + variables (.VARIABLES and .TARGETS). Comment out .TARGETS test + for now as it's not yet supported. + +2002-08-01 Paul D. Smith + + * scripts/options/dash-B: Add a test for the new -B option. + +2002-07-11 Paul D. Smith + + * run_make_tests.pl (valid_option): Add support for Valgrind. Use + -valgrind option to the test suite. + (set_more_defaults): Set up the file descriptor to capture + Valgrind output. We have to unset its close-on-exec flag; we + hardcode the value for F_SETFD (2) rather than load it; hopefully + this will help us avoid breaking the Windows/DOS test suite. + +2002-07-10 Paul D. Smith + + * scripts/variables/automatic: Add some tests for $$@, $$(@D), and + $$(@F). + + * test_driver.pl (utouch): Create a new function that creates a + file with a specific timestamp offset. Use of this function will + let us avoid lots of annoying sleep() invocations in the tests + just to get proper timestamping, which will make the tests run a + lot faster. So far it's only used in the automatic test suite. + +2002-07-09 Paul D. Smith + + * scripts/variables/automatic: Create a test for automatic variables. + +2002-07-08 Paul D. Smith + + * scripts/features/order_only: Test new order-only prerequisites. + +2002-07-07 Paul D. Smith + + * scripts/functions/eval: Test new function. + * scripts/functions/value: Test new function. + * scripts/variables/MAKEFILE_LIST: Test new variable. + +2002-04-28 Paul D. Smith + + * scripts/functions/call: New test: transitive closure + implementation using $(call ...) to test variable recursion. + +2002-04-21 Paul D. Smith + + * test_driver.pl (compare_dir_tree): Ignore CVS and RCS + directories in the script directories. + +2001-05-02 Paul D. Smith + + * scripts/variables/flavors: Test define/endef scripts where only + one of the command lines is quiet. + +2000-06-22 Paul D. Smith + + * scripts/options/dash-q: New file; test the -q option. Includes + a test for PR/1780. + +2000-06-21 Paul D. Smith + + * scripts/features/targetvars: Added a test for PR/1709: allowing + semicolons in target-specific variable values. + +2000-06-19 Paul D. Smith + + * scripts/functions/addsuffix: Test for an empty final argument. + Actually this bug might have happened for any function, but this + one was handy. + +2000-06-17 Eli Zaretskii + + * scripts/options/general: If parallel jobs are not supported, + expect a warning message from Make. + +2000-06-15 Eli Zaretskii + + * scripts/options/general: Don't try -jN with N != 1 if parallel + jobs are not supported. + +2000-05-24 Paul D. Smith + + * scripts/options/general: Test general option processing (PR/1716). + +2000-04-11 Paul D. Smith + + * scripts/functions/strip: Test empty value to strip (PR/1689). + +2000-04-08 Eli Zaretskii + + * scripts/features/reinvoke: Sleep before updating the target + files in the first test, to ensure its time stamp really gets + newer; otherwise Make might re-exec more than once. + +2000-04-07 Eli Zaretskii + + * scripts/features/double_colon: Don't run the parallel tests if + parallel jobs aren't supported. + +2000-04-04 Paul D. Smith + + * scripts/functions/word: wordlist doesn't swap arguments anymore. + +2000-03-27 Paul D. Smith + + * scripts/features/statipattrules: Test that static pattern rules + whose prerequisite patterns resolve to empty strings throw an + error (instead of dumping core). Fixes PR/1670. + + * scripts/features/reinvoke: Make more robust by touching "b" + first, to ensure it's not newer than "a". + Reported by Marco Franzen . + * scripts/options/dash-n: Ditto. + + * scripts/functions/call: Whoops. The fix to PR/1527 caused + recursive invocations of $(call ...) to break. I can't come up + with any way to get both working at the same time, so I backed out + the fix to 1527 and added a test case for recursive calls. This + also tests the fix for PR/1610. + + * scripts/features/double_colon: Test that circular dependencies + in double-colon rule sets are detected correctly (PR/1671). + +2000-03-26 Paul D. Smith + + * scripts/targets/INTERMEDIATE: Test that make doesn't remove + .INTERMEDIATE files when given on the command line (PR/1669). + +2000-03-08 Paul D. Smith + + * scripts/options/dash-k: Add a test for error detection by + multiple targets depending on the same prerequisite with -k. + For PR/1634. + +2000-02-07 Paul D. Smith + + * scripts/features/escape: Add a test for backslash-escaped spaces + in a target name (PR/1586). + +2000-02-04 Paul D. Smith + + * scripts/features/patspecific_vars: Add a test for pattern-specific + target variables inherited from the parent target (PR/1407). + +2000-02-02 Paul D. Smith + + * run_make_tests.pl (set_more_defaults): Hard-code the LANG to C + to make sure sorting order, etc. is predictable. + Reported by Andreas Jaeger . + + * run_make_tests.pl (set_more_defaults): Set the $wtime variable + depending on the OS. Eli Zaretskii reports + this seems to need to be *4* on DOS/Windows, not just 2. Keep it + 1 for other systems. + * scripts/features/vpathplus (touchfiles): Use the $wtime value + instead of hardcoding 2. + * scripts/targets/SECONDARY: Ditto. + * scripts/targets/INTERMEDIATE: Ditto. + +2000-01-27 Paul D. Smith + + * test_driver.pl (toplevel): Don't try to run test scripts which + are really directories. + +2000-01-23 Paul D. Smith + + * scripts/features/include: Remove a check; the fix caused more + problems than the error, so I removed it and removed the test for + it. + +2000-01-11 Paul D. Smith + + * scripts/functions/call: Add a test for PR/1517 and PR/1527: make + sure $(call ...) doesn't eval its arguments and that you can + invoke foreach from it without looping forever. + +1999-12-15 Paul D. Smith + + * scripts/targets/INTERMEDIATE: Add a test for PR/1423: make sure + .INTERMEDIATE settings on files don't disable them as implicit + intermediate possibilities. + +1999-12-01 Paul D. Smith + + * scripts/features/double_colon: Add a test for PR/1476: Try + double-colon rules as non-goal targets and during parallel builds + to make sure they're handled serially. + +1999-11-17 Paul D. Smith + + * scripts/functions/if: Add a test for PR/1429: put some text + after an if-statement to make sure it works. + + * scripts/features/targetvars: Add a test for PR/1380: handling += + in target-specific variable definitions correctly. + +1999-10-15 Paul D. Smith + + * scripts/variables/MAKEFILES: This was really broken: it didn't + test anything at all, really. Rewrote it, plus added a test for + PR/1394. + +1999-10-13 Paul D. Smith + + * scripts/options/dash-n: Add a test for PR/1379: "-n doesn't + behave properly when used with recursive targets". + +1999-10-08 Paul D. Smith + + * scripts/features/targetvars: Add a check for PR/1378: + "Target-specific vars don't inherit correctly" + +1999-09-29 Paul D. Smith + + * test_driver.pl (get_osname): Change $fancy_file_names to + $short_filenames and reverse the logic. + (run_each_test): Change test of non-existent $port_host to use + $short_filenames--problem reported by Eli Zaretskii. + +1999-09-23 Paul D. Smith + + * scripts/features/parallelism: Add a check to ensure that the + jobserver works when we re-invoke. Also cleaned up the tests a + little, reducing the number of rules we use so the test won't need + as many "sleep" commands. + +1999-09-16 Paul D. Smith + + * scripts/features/reinvoke: Remove invocations of "touch" in + makefiles. See the comments on the touch function rewrite below. + Note that UNIX touch behaves the same way if the file already + exists: it sets the time to the _local_ time. We don't want + this. This is probably a good tip for makefile writers in + general, actually... where practical. + * scripts/options/dash-l: Ditto. + * scripts/options/dash-n: Ditto. + + * test_driver.pl (run_each_test): In retrospect, I don't like the + .lN/.bN/.dN postfix required by DOS. So, for non-DOS systems I + changed it back to use .log, .base, and .diff. + + * run_make_tests.pl (set_more_defaults): Move the check for the + make pathname to here from set_defaults (that's too early since it + happens before the command line processing). + Create a new variable $port_type, calculated from $osname, to + specify what kind of system we're running on. We should integrate + the VOS stuff here, too. + (valid_option): Comment out the workdir/-work stuff so people + won't be fooled into thinking it works... someone needs to fix + this, though! + + * scripts/functions/origin: Use $port_type instead of $osname. + * scripts/functions/foreach: Ditto. + * scripts/features/default_names: Ditto. + +1999-09-15 Paul D. Smith + + * test_driver.pl (touch): Rewrite this function. Previously it + used to use utime() to hard-set the time based on the current + local clock, or, if the file didn't exist, it merely created it. + This mirrors exactly what real UNIX touch does, but it fails badly + on networked filesystems where the FS server clock is skewed from + the local clock: normally modifying a file causes it to get a mod + time based on the _server's_ clock. Hard-setting it based on the + _local_ clock causes gratuitous errors and makes the tests + unreliable except on local filesystems. The new function will + simply modify the file, allowing the filesystem to set the mod + time as it sees fit. + + * scripts/features/parallelism: The second test output could + change depending on how fast some scripts completed; use "sleep" + to force the order we want. + + * test_driver.pl (toplevel): A bug in Perl 5.000 to Perl 5.004 + means that "%ENV = ();" doesn't do the right thing. This worked + in Perl 4 and was fixed in Perl 5.004_01, but use a loop to delete + the environment rather than require specific versions. + + * run_make_tests.pl (set_more_defaults): Don't use Perl 5 s/// + modifier "s", so the tests will run with Perl 4. + (set_more_defaults): Set $pure_log to empty if there's no -logfile + option in PURIFYOPTIONS. + (setup_for_test): Don't remove any logs unless $pure_log is set. + +1999-09-15 Eli Zaretskii + + * scripts/features/reinvoke: Put the SHELL definition in the right + test makefile. + +1999-09-15 Paul D. Smith + + ChangeLog file for the test suite created. + + +Copyright (C) 1992-2014 Free 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/tests/NEWS b/tests/NEWS new file mode 100644 index 0000000..584f4a4 --- /dev/null +++ b/tests/NEWS @@ -0,0 +1,178 @@ +Changes from 0.4.9 to 3.78 (Sep 6, 1999): + + Lots of new tests. Renamed to follow the GNU make scheme. Also + added some support for using Purify with make. + + Rob Tulloh contributed some changes to get the test suite running on + NT; I tweaked them a bit (hopefully I didn't break anything!) Note + that NT doesn't grok the self-exec funkiness that Unix shells use, + so instead I broke that out into a separate shell script + "run_make_tests" that invokes perl with the (renamed) script + run_make_tests.pl. + + Eli Zaretski contributed changes to get the test suite running on + DOS with DJGPP. I also meddled in these somewhat. + + If you're on DOS or NT you should run "perl.exe run_make_tests.pl ..." + If you're on Unix, you can continue to run "./run_make_tests ..." as + before. + +Changes from 0.4.8 to 0.4.9 (May 14, 1998): + + Release by Paul D. Smith ; I'm the one to + blame for problems in this version :). + + Add some perl to test_driver.pl to strip out GNU make clock skew + warning messages from the output before comparing it to the + known-good output. + + A new test for escaped :'s in filenames (someone on VMS found this + didn't work anymore in 3.77): scripts/features/escape. + +Changes from 0.4.7 to 0.4.8 (May 14, 1998): + + Release by Paul D. Smith ; I'm the one to + blame for problems in this version :). + + New tests for features to be included in GNU make 3.77. + +Changes from 0.4.6 to 0.4.7 (August 18, 1997): + + Release by Paul D. Smith ; I'm the one to + blame for problems in this version :). + + Reworked some tests to make sure they all work with both perl4 and perl5. + + Work around a bug in perl 5.004 which doesn't clean the environment + correctly in all cases (fixed in at least 5.004_02). + + Updated functions/strip to test for newline stripping. + + Keep a $PURIFYOPTIONS env variable if present. + +Changes from 0.4.5 to 0.4.6 (April 07, 1997): + + Release by Paul D. Smith ; I'm the one to + blame for problems in this version :). + + Updated to work with GNU make 3.76 (and pretests). + + Added new tests and updated existing ones. Note that the new tests + weren't tested with perl 4, however I think they should work. + + Ignore any tests whose filenames end in "~", so that Emacs backup + files aren't run. + +Changes from 0.4.4 to 0.4.5 (April 29, 1995): + + Updated to be compatible with perl 5.001 as well as 4.036. + + Note: the test suite still won't work on 14-char filesystems + (sorry, Kaveh), but I will get to it. + + Also, some tests and stuff still haven't made it in because I + haven't had time to write the test scripts for them. But they, + too, will get in eventually. Contributions of scripts (i.e., tests + that I can just drop in) are particularly welcome and will be + incorporated immediately. + +Changes from 0.4.3 to 0.4.4 (March 1995): + + Updated for changes in make 3.72.12, and to ignore CVS directories + (thanks go to Jim Meyering for the patches for this). + + Fixed uname call to not make a mess on BSD/OS 2.0 (whose uname -a + is very verbose). Let me know if this doesn't work correctly on + your system. + + Changed to display test name while it is running, not just when it + finishes. + + Note: the test suite still won't work on 14-char filesystems + (sorry, Kaveh), but I will get to it. + + Also, some tests and stuff still haven't made it in because I + haven't had time to write the test scripts for them. But they, + too, will get in eventually. + +Changes from 0.4 to 0.4.3 (October 1994): + + Fixed bugs (like dependencies on environment variables). + + Caught up with changes in make. + + The load_limit test should now silently ignore a failure due to + make not being able to read /dev/kmem. + + Reorganized tests into subdirs and renamed lots of things so that + those poor souls who still have to deal with 14-char filename + limits won't hate me any more. Thanks very much to Kaveh R. Ghazi + for helping me with the implementation and + testing of these changes, and for putting up with all my whining + about it... + + Added a $| = 1 so that systems that don't seem to automatically + flush their output for some reason will still print all the + output. I'd hate for someone to miss out on the smiley that + you're supposed to get when all the tests pass... :-) + +Changes from 0.3 to 0.4 (August 1993): + + Lost in the mists of time (and my hurry to get it out before I + left my job). + +Changes from 0.2 to 0.3 (9-30-92): + + Several tests fixed to match the fact that MAKELEVEL > 0 or -C now + imply -w. + + parallel_execution test fixed to not use double colon rules any + more since their behavior has changed. + + errors_in_commands test fixed to handle different error messages + and return codes from rm. + + Several tests fixed to handle -make_path with a relative path + and/or a name other than "make" for make. + + dash-e-option test fixed to use $PATH instead of $USER (since the + latter does not exist on some System V systems). This also + removes the dependency on getlogin (which fails under certain + weird conditions). + + test_driver_core changed so that you can give a test name like + scripts/errors_in_commands and it will be handled correctly (handy + if you have a shell with filename completion). + +Changes from 0.1 to 0.2 (5-4-92): + + README corrected to require perl 4.019, not 4.010. + + -make_path replaces -old. + + errors_in_commands test updated for change in format introduced in + make 3.62.6. + + test_driver_core now uses a better way of figuring what OS it is + running on (thanks to meyering@cs.utexas.edu (Jim Meyering) for + suggesting this, as well as discovering the hard way that the old + way (testing for /mnt) fails on his machine). + + Some new tests were added. + + +------------------------------------------------------------------------------- +Copyright (C) 1992-2014 Free 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/tests/README b/tests/README new file mode 100644 index 0000000..3b699ee --- /dev/null +++ b/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-2014 Free 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/tests/config-flags.pm b/tests/config-flags.pm new file mode 100644 index 0000000..903c468 --- /dev/null +++ b/tests/config-flags.pm @@ -0,0 +1,19 @@ +# This is a -*-perl-*- script +# +# Set variables that were defined by configure, in case we need them +# during the tests. + +%CONFIG_FLAGS = ( + AM_LDFLAGS => '-Wl,--export-dynamic', + AR => 'ar', + CC => 'gcc', + CFLAGS => '-g -O2', + CPP => 'gcc -E', + CPPFLAGS => '', + GUILE_CFLAGS => '-pthread -I/usr/include/guile/2.0 ', + GUILE_LIBS => '-lguile-2.0 -lgc ', + LDFLAGS => '', + LIBS => '-ldl ' +); + +1; diff --git a/tests/config-flags.pm.in b/tests/config-flags.pm.in new file mode 100644 index 0000000..29ba146 --- /dev/null +++ b/tests/config-flags.pm.in @@ -0,0 +1,19 @@ +# 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@' +); + +1; diff --git a/tests/config_flags_pm.com b/tests/config_flags_pm.com new file mode 100755 index 0000000..3f5adff --- /dev/null +++ b/tests/config_flags_pm.com @@ -0,0 +1,53 @@ +$! +$! config_flags_pm.com - Build config-flags.pm on VMS. +$! +$! Just good enough to run the self tests for now. +$! +$! Copyright (C) 2014 Free 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=([],[.glob]" +$! +$ 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 +$ 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/tests/guile.supp b/tests/guile.supp new file mode 100644 index 0000000..9e9b01b --- /dev/null +++ b/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/tests/mkshadow b/tests/mkshadow new file mode 100755 index 0000000..aa9b3bc --- /dev/null +++ b/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-2014 Free 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/tests/run_make_tests b/tests/run_make_tests new file mode 100755 index 0000000..b68b784 --- /dev/null +++ b/tests/run_make_tests @@ -0,0 +1,2 @@ +#!/bin/sh +exec perl $0.pl ${1+"$@"} diff --git a/tests/run_make_tests.com b/tests/run_make_tests.com new file mode 100755 index 0000000..2f17f7f --- /dev/null +++ b/tests/run_make_tests.com @@ -0,0 +1,272 @@ +$! Test_make.com +$! +$! This is a wrapper for the GNU make perl test programs on VMS. +$! +$! Parameter "-help" for description on how to use described below. +$! +$! Copyright (C) 2014 Free 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 . +$! +$! +$! Allow more than 8 paramters with using commas as a delimiter. +$! +$ params = "''p1',''p2',''p3',''p4',''p5',''p6',''p7',''p8'" +$! +$ test_flags = ",verbose,detail,keep,usage,help,debug," +$ test_flags_len = f$length(test_flags) +$ verbose_flag = "" +$ detail_flag = "" +$ keep_flag = "" +$ usage_flag = "" +$ help_flag = "" +$ debug_flag = "" +$! +$ ignored_options = "profile,make,srcdir,valgrind,memcheck,massif," +$ ignored_option_len = f$length(ignored_options) +$! +$ testname = "" +$ make :== $bin:make.exe" +$! +$ i = 0 +$param_loop: +$ param = f$element(i, ",", params) +$ i = i + 1 +$ if param .eqs. "" then goto param_loop +$ if param .eqs. "," then goto param_loop_end +$ param_len = f$length(param) +$ if f$locate("/", param) .lt. param_len +$ then +$ if testname .nes. "" +$ then +$ write sys$output "Only the last test name specified will be run!" +$ endif +$ testname = param +$ goto param_loop +$ endif +$ lc_param = f$edit(param,"LOWERCASE") - "-" +$ if f$locate(",''lc_param',", ignored_options) .lt. ignored_option_len +$ then +$ write sys$output "parameter ''param' is ignored on VMS for now." +$ goto param_loop +$ endif +$ if f$locate(",''lc_param',", test_flags) .lt. test_flags_len +$ then +$ 'lc_param'_flag = "-" + lc_param +$ goto param_loop +$ endif +$ write sys$output "parameter ''param' is not known to VMS." +$ goto param_loop +$! +$param_loop_end: +$! +$no_gnv = 1 +$no_perl = 1 +$! +$! Find GNV 2.1.3 + manditory updates +$! If properly updated, the GNV$GNU logical name is present. +$! Updated GNV utilities have a gnv$ prefix on them. +$ gnv_root = f$trnlnm("GNV$GNU", "LNM$SYSTEM_TABLE") +$ if gnv_root .nes. "" +$ then +$ no_gnv = 0 +$ ! Check for update ar utility. +$ new_ar = "gnv$gnu:[usr.bin]gnv$ar.exe" +$ if f$search(new_ar) .nes. "" +$ then +$ ! See if a new port of ar exists. +$ ar :== $'new_ar' +$ else +$ ! Fall back to legacy GNV AR wrapper. +$ old_ar = "gnv$gnu:[bin]ar.exe" +$ if f$search(old_ar) .nes. "" +$ then +$ ar :== $'old_ar' +$ else +$ no_gnv = 1 +$ endif +$ endif +$ ! Check for updated bash +$ if no_gnv .eq. 0 +$ then +$ new_bash = "gnv$gnu:[bin]gnv$bash.exe" +$ if f$search(new_bash) .nes. "" +$ then +$ bash :== $'new_bash' +$ sh :== $'new_bash' +$ else +$ no_gnv = 1 +$ endif +$ endif +$ ! Check for updated coreutils +$ if no_gnv .eq. 0 +$ then +$ new_cat = "gnv$gnu:[bin]gnv$cat.exe" +$ if f$search(new_cat) .nes. "" +$ then +$ cat :== $'new_cat' +$ cp :== $gnv$gnu:[bin]gnv$cp.exe +$ echo :== $gnv$gnu:[bin]gnv$echo.exe +$ false :== $gnv$gnu:[bin]gnv$false.exe +$ true :== $gnv$gnu:[bin]gnv$true.exe +$ touch :== $gnv$gnu:[bin]gnv$touch.exe +$ mkdir :== $gnv$gnu:[bin]gnv$mkdir.exe +$ rm :== $gnv$gnu:[bin]gnv$rm.exe +$ sleep :== $gnv$gnu:[bin]gnv$sleep.exe +$ else +$ no_gnv = 1 +$ endif +$ endif +$ ! Check for updated diff utility. +$ if no_gnv .eq. 0 +$ then +$ new_diff = "gnv$gnu:[usr.bin]gnv$diff.exe" +$ if f$search(new_diff) .nes. "" +$ then +$ ! See if a new port of diff exists. +$ diff :== $'new_diff' +$ else +$ ! Fall back to legacy GNV diff +$ old_diff = "gnv$gnu:[bin]diff.exe" +$ if f$search(old_diff) .nes. "" +$ then +$ diff :== $'old_diff' +$ else +$ no_gnv = 1 +$ endif +$ endif +$ endif +$ endif +$! +$if no_gnv +$then +$ write sys$output "Could not find an up to date GNV installed!" +$ help_flag = 1 +$endif +$! +$! Find perl 5.18.1 or later. +$! +$! look in perl_root:[000000]perl_setup.com +$ perl_root = f$trnlnm("perl_root") +$ ! This works with known perl installed from PCSI kits. +$ if perl_root .nes. "" +$ then +$ perl_ver = f$element(1, ".", perl_root) +$ if f$locate("-", perl_ver) .lt. f$length(perl_ver) +$ then +$ no_perl = 0 +$ endif +$ endif +$ if no_perl +$ then +$! look for sys$common:[perl-*]perl_setup.com +$ perl_setup = f$search("sys$common:[perl-*]perl_setup.com") +$ if perl_setup .eqs. "" +$ then +$ if gnv_root .nes. "" +$ then +$ gnv_device = f$parse(gnv_root,,,"DEVICE") +$ perl_templ = "[vms$common.perl-*]perl_setup.com" +$ perl_search = f$parse(perl_templ, gnv_device) +$ perl_setup = f$search(perl_search) +$ endif +$ endif +$ if perl_setup .nes. "" +$ then +$ @'perl_setup' +$ no_perl = 0 +$ endif +$ endif +$! +$ if no_perl +$ then +$ write sys$output "Could not find an up to date Perl installed!" +$ help_flag = "-help" +$ endif +$! +$! +$ if help_flag .nes. "" +$ then +$ type sys$input +$DECK +This is a test script wrapper for the run_make_tests.pl script. + +This wrapper makes sure that the DCL symbols and logical names needed to +run the perl script are in place. + +The test wrapper currently requires that the DCL symbols be global symbols. +Those symbols will be left behind after the procedure is run. + +The PERL_ROOT will be set to a compatible perl if such a perl is found and +is not the default PERL_ROOT:. This setting will persist after the test. + +This wrapper should be run with the default set to the base directory +of the make source. + +The HELP parameter will bring up this text and then run the help script +for the Perl wrapper. Not all options for the perl script have been +implemented, such as valgrind or specifying the make path or source path. + +Running the wrapper script requires: + Perl 5.18 or later. + PCSI kits available from http://sourceforge.net/projects/vmsperlkit/files/ + + GNV 2.1.3 or later. GNV 3.0.1 has not tested with this script. + Bash 4.2.47 or later. + Coreutils 8.21 or later. + http://sourceforge.net/projects/gnv/files/ + Read before installing: + http://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/ + As updates for other GNV components get posted, those updates should + be used. + +$EOD +$ endif +$! +$ if no_gnv .or. no_perl then exit 44 +$! +$! +$ make := $bin:make.exe +$ default = f$environment("DEFAULT") +$ this = f$environment("PROCEDURE") +$ on error then goto all_error +$ set default 'f$parse(this,,,"DEVICE")''f$parse(this,,,"DIRECTORY")' +$! +$! Need to make sure that the config-flags.pm exists. +$ if f$search("config-flags.pm") .eqs. "" +$ then +$ @config_flags_pm.com +$ endif +$ define/user bin 'default',gnv$gnu:[bin] +$ define/user decc$filename_unix_noversion enable +$ define/user decc$filename_unix_report enable +$ define/user decc$readdir_dropdotnotype enable +$ flags = "" +$ if verbose_flag .nes. "" then flags = verbose_flag +$ if detail_flag .nes. "" then flags = flags + " " + detail_flag +$ if keep_flag .nes. "" then flags = flags + " " + keep_flag +$ if usage_flag .nes. "" then flags = flags + " " + usage_flag +$ if help_flag .nes. "" then flags = flags + " " + help_flag +$ if debug_flag .nes. "" then flags = flags + " " + debug_flag +$ flags = f$edit(flags, "TRIM, COMPRESS") +$ if testname .nes. "" +$ then +$ perl run_make_tests.pl "''testname'" 'flags' +$ else +$ perl run_make_tests.pl 'flags' +$ endif +$all_error: +$ set default 'default' +$! diff --git a/tests/run_make_tests.pl b/tests/run_make_tests.pl new file mode 100644 index 0000000..9468fab --- /dev/null +++ b/tests/run_make_tests.pl @@ -0,0 +1,491 @@ +#!/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-2014 Free 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 . + +%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 = ''; + +$command_string = ''; + +$all_tests = 0; + +# 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; +} + +require "test_driver.pl"; +require "config-flags.pm"; + +# Some target systems might not have the POSIX module... +$has_POSIX = eval { require "POSIX.pm" }; + +#$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 "$srcdir/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) + +$old_makefile = 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#/$pwd/g; + return $_; +} + +sub run_make_test +{ + local ($makestring, $options, $answer, $err_code, $timeout) = @_; + + # 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 + || 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") || die "Failed to open $makefile: $!\n"; + print MAKEFILE $makestring; + close(MAKEFILE) || 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); + &compare_output($answer, &get_logfile(1)); + + $old_makefile = $makefile; + $makefile = undef; +} + +# The old-fashioned way... +sub run_make_with_options { + local ($filename,$options,$logname,$expected_code,$timeout) = @_; + local($code); + local($command) = $make_path; + + $expected_code = 0 unless defined($expected_code); + + # Reset to reflect this one test. + $test_passed = 1; + + if ($filename) { + $command .= " -f $filename"; + } + + if ($options) { + if ($^O eq 'VMS') { + # Try to make sure arguments are properly quoted. + # This does not handle all cases. + + # 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 .= " $options"; + } + + $command_string = "$command\n"; + + if ($valgrind) { + print VALGRIND "\n\nExecuting: $command\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; + + $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") + || die "Can't rename $log to $tn: $!\n"; + ++$purify_errors; + } else { + unlink($pure_log); + } + } + + if ($code != $expected_code) { + print "Error running $make_path (expected $expected_code; got $code): $command\n"; + $test_passed = 0; + $runf = &get_runfile; + &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_path"; + } + + 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 toool.", + "\tChange the default valgrind args with the VALGRIND_ARGS env var." + ); +} + +sub get_this_pwd { + $delete_command = 'rm -f'; + if ($has_POSIX) { + $__pwd = POSIX::getcwd(); + } elsif ($vos) { + $delete_command = "delete_file -no_ask"; + $__pwd = `++(current_dir)`; + } else { + # No idea... just try using pwd as a last resort. + chop ($__pwd = `pwd`); + } + + return $__pwd; +} + +sub set_defaults +{ + # $profile = 1; + $testee = "GNU make"; + $make_path = "make"; + $tmpfilesuffix = "mk"; + $pwd = &get_this_pwd; +} + +sub set_more_defaults +{ + local($string); + local($index); + + # find the type of the port. We do this up front to have a single + # point of change if it needs to be tweaked. + # + # This is probably not specific enough. + # + if ($osname =~ /Windows/i || $osname =~ /MINGW32/i || $osname =~ /CYGWIN_NT/i) { + $port_type = 'W32'; + } + # Bleah, the osname is so variable on DOS. This kind of bites. + # Well, as far as I can tell if we check for some text at the + # beginning of the line with either no spaces or a single space, then + # a D, then either "OS", "os", or "ev" and a space. That should + # match and be pretty specific. + elsif ($osname =~ /^([^ ]*|[^ ]* [^ ]*)D(OS|os|ev) /) { + $port_type = 'DOS'; + } + # Check for OS/2 + elsif ($osname =~ m%OS/2%) { + $port_type = 'OS/2'; + } + # 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'; + } + + # On DOS/Windows system the filesystem apparently can't track + # timestamps with second granularity (!!). Change the sleep time + # needed to force a file to be considered "old". + $wtime = $port_type eq 'UNIX' ? 1 : $port_type eq 'OS/2' ? 2 : 4; + + print "Port type: $port_type\n" if $debug; + print "Make path: $make_path\n" if $debug; + + # Find the full pathname of Make. For DOS systems this is more + # complicated, so we ask make itself. + if ($osname eq 'VMS') { + # On VMS pre-setup make to be found with simply 'make'. + $make_path = 'make'; + } else { + my $mk = `sh -c 'echo "all:;\@echo \\\$(MAKE)" | $make_path -f-'`; + chop $mk; + $mk or die "FATAL ERROR: Cannot determine the value of \$(MAKE):\n +'echo \"all:;\@echo \\\$(MAKE)\" | $make_path -f-' failed!\n"; + $make_path = $mk; + } + print "Make\t= '$make_path'\n" if $debug; + + my $redir2 = '2> /dev/null'; + $redir2 = '' if os_name eq 'VMS'; + $string = `$make_path -v -f /dev/null $redir2`; + + $string =~ /^(GNU Make [^,\n]*)/; + $testee_version = "$1\n"; + + my $redir = '2>&1'; + $redir = '' if os_name eq 'VMS'; + $string = `sh -c "$make_path -f /dev/null $redir"`; + if ($string =~ /(.*): \*\*\* No targets\. Stop\./) { + $make_name = $1; + } + else { + $make_path =~ /^(?:.*$pathsep)?(.+)$/; + $make_name = $1; + } + + # prepend pwd if this is a relative path (ie, does not + # start with a slash, but contains one). Thanks for the + # clue, Roland. + + if (index ($make_path, ":") != 1 && index ($make_path, "/") > 0) + { + $mkpath = "$pwd$pathsep$make_path"; + } + else + { + $mkpath = $make_path; + } + + # If srcdir wasn't provided on the command line, see if the + # location of the make program gives us a clue. Don't fail if not; + # we'll assume it's been installed into /usr/include or wherever. + if (! $srcdir) { + $make_path =~ /^(.*$pathsep)?/; + my $d = $1 || '../'; + -f "${d}gnumake.h" and $srcdir = $d; + } + + # Not with the make program, so see if we can get it out of the makefile + if (! $srcdir && open(MF, "< ../Makefile")) { + local $/ = undef; + $_ = ; + close(MF); + /^abs_srcdir\s*=\s*(.*?)\s*$/m; + -f "$1/gnumake.h" and $srcdir = $1; + } + + # 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 = `sh -c "$make_path -j 2 -f /dev/null $redir"`; + if ($string =~ /not supported/) { + $parallel_jobs = 0; + } + else { + $parallel_jobs = 1; + } + + %FEATURES = map { $_ => 1 } split /\s+/, `sh -c "echo '\\\$(info \\\$(.FEATURES))' | $make_path -f- 2>/dev/null"`; + + # Set up for valgrind, if requested. + + if ($valgrind) { + my $args = $valgrind_args; + open(VALGRIND, "> valgrind.out") + || die "Cannot open valgrind.out: $!\n"; + # -q --leak-check=yes + exists $ENV{VALGRIND_ARGS} and $args = $ENV{VALGRIND_ARGS}; + $make_path = "valgrind --log-fd=".fileno(VALGRIND)." $args $make_path"; + # F_SETFD is 2 + fcntl(VALGRIND, 2, 0) or die "fcntl(setfd) failed: $!\n"; + system("echo Starting on `date` 1>&".fileno(VALGRIND)); + print "Enabled valgrind support.\n"; + } +} + +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/tests/scripts/features/archives b/tests/scripts/features/archives new file mode 100644 index 0000000..b0acfec --- /dev/null +++ b/tests/scripts/features/archives @@ -0,0 +1,97 @@ +# -*-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; + +# Create some .o files to work with +utouch(-60, qw(a1.o a2.o a3.o)); + +my $ar = $CONFIG_FLAGS{AR}; + +# Some versions of ar print different things on creation. Find out. +my $created = `$ar rv libxx.a a1.o 2>&1`; + +# Some versions of ar print different things on add. Find out. +my $add = `$ar rv libxx.a a2.o 2>&1`; +$add =~ s/a2\.o/#OBJECT#/g; + +# Some versions of ar print different things on replacement. Find out. +my $repl = `$ar rv libxx.a a2.o 2>&1`; +$repl =~ s/a2\.o/#OBJECT#/g; + +unlink('libxx.a'); + +# Very simple +run_make_test('all: libxx.a(a1.o)', + '', "$ar rv libxx.a a1.o\n$created"); + +# Multiple .o's. Add a new one to the existing library +($_ = $add) =~ s/#OBJECT#/a2.o/g; +run_make_test('all: libxx.a(a1.o a2.o)', + '', "$ar rv libxx.a a2.o\n$_"); + +# Touch one of the .o's so it's rebuilt +utouch(-40, 'a1.o'); +($_ = $repl) =~ s/#OBJECT#/a1.o/g; +run_make_test(undef, '', "$ar rv libxx.a a1.o\n$_"); + +# Use wildcards +run_make_test('all: libxx.a(*.o)', + '', "#MAKE#: Nothing to be done for 'all'.\n"); + +# Touch one of the .o's so it's rebuilt +utouch(-30, 'a1.o'); +($_ = $repl) =~ s/#OBJECT#/a1.o/g; +run_make_test(undef, '', "$ar rv libxx.a a1.o\n$_"); + +# Use both wildcards and simple names +utouch(-50, 'a2.o'); +($_ = $add) =~ s/#OBJECT#/a3.o/g; +$_ .= "$ar rv libxx.a a2.o\n"; +($_ .= $repl) =~ s/#OBJECT#/a2.o/g; +run_make_test('all: libxx.a(a3.o *.o)', '', + "$ar rv libxx.a a3.o\n$_"); + +# Check whitespace handling +utouch(-40, 'a2.o'); +($_ = $repl) =~ s/#OBJECT#/a2.o/g; +run_make_test('all: libxx.a( a3.o *.o )', '', + "$ar rv libxx.a a2.o\n$_"); + +rmfiles(qw(a1.o a2.o a3.o libxx.a)); + +# Check non-archive targets +# See Savannah bug #37878 +run_make_test(q! +all: foo(bar).baz +foo(bar).baz: ; @echo '$@' +!, + '', "foo(bar).baz\n"); + +# Check renaming of archive targets. +# See Savannah bug #38442 + +mkdir('artest', 0777); +touch('foo.vhd'); + +run_make_test(q! +DIR = artest +vpath % $(DIR) +default: lib(foo) +(%): %.vhd ; @cd $(DIR) && touch $(*F) && $(AR) $(ARFLAGS) $@ $(*F) >/dev/null 2>&1 && rm $(*F) +.PHONY: default +!, + '', ""); + +run_make_test(undef, '', "#MAKE#: Nothing to be done for 'default'.\n"); + +unlink('foo.vhd'); +remove_directory_tree('artest'); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/comments b/tests/scripts/features/comments new file mode 100644 index 0000000..9257955 --- /dev/null +++ b/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/tests/scripts/features/conditionals b/tests/scripts/features/conditionals new file mode 100644 index 0000000..2ece60b --- /dev/null +++ b/tests/scripts/features/conditionals @@ -0,0 +1,146 @@ +# -*-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'); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/default_names b/tests/scripts/features/default_names new file mode 100644 index 0000000..2e83880 --- /dev/null +++ b/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/tests/scripts/features/double_colon b/tests/scripts/features/double_colon new file mode 100644 index 0000000..1097775 --- /dev/null +++ b/tests/scripts/features/double_colon @@ -0,0 +1,164 @@ +# -*-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: check for proper backslash handling +# Savannah bug #33399 + +run_make_test(' +a\ xb :: ; @echo one +a\ xb :: ; @echo two +', + '', "one\ntwo\n"); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/echoing b/tests/scripts/features/echoing new file mode 100644 index 0000000..40debf5 --- /dev/null +++ b/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\@$delete_command $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', "$delete_command $example\n"); + + +# TEST #4 +# ------- + +run_make_test(undef, '-s', "This makefile did not clean the dir... good\n"); + + +1; diff --git a/tests/scripts/features/errors b/tests/scripts/features/errors new file mode 100644 index 0000000..c0339cb --- /dev/null +++ b/tests/scripts/features/errors @@ -0,0 +1,95 @@ +# -*-perl-*- + +$description = "The following tests the -i option and the '-' in front of \n" + ."commands to test that make ignores errors in these commands\n" + ."and continues processing."; + +$details = "This test runs two makes. The first runs on a target with a \n" + ."command that has a '-' in front of it (and a command that is \n" + ."intended to fail) and then a delete command after that is \n" + ."intended to succeed. If make ignores the failure of the first\n" + ."command as it is supposed to, then the second command should \n" + ."delete a file and this is what we check for. The second make\n" + ."that is run in this test is identical except that the make \n" + ."command is given with the -i option instead of the '-' in \n" + ."front of the command. They should run the same. "; + +if ($vos) +{ + $rm_command = "delete_file"; +} +else +{ + $rm_command = "rm"; +} + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "clean:\n" + ."\t-$rm_command cleanit\n" + ."\t$rm_command foo\n" + ."clean2: \n" + ."\t$rm_command cleanit\n" + ."\t$rm_command foo\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&touch("foo"); + +unlink("cleanit"); +$cleanit_error = `sh -c "$rm_command cleanit 2>&1"`; +chomp $cleanit_error; +$delete_error_code = $? >> 8; + +# TEST #1 +# ------- + +$answer = "$rm_command cleanit +$cleanit_error +$makefile:2: recipe for target 'clean' failed +$make_name: [clean] Error $delete_error_code (ignored) +$rm_command foo\n"; + +&run_make_with_options($makefile,"",&get_logfile); + +# If make acted as planned, it should ignore the error from the first +# command in the target and execute the second which deletes the file "foo" +# This file, therefore, should not exist if the test PASSES. +if (-f "foo") { + $test_passed = 0; +} + +# The output for this on VOS is too hard to replicate, so we only check it +# on unix. +if (!$vos) +{ + &compare_output($answer,&get_logfile(1)); +} + + +&touch("foo"); + +# TEST #2 +# ------- + +$answer = "$rm_command cleanit +$cleanit_error +$makefile:5: recipe for target 'clean2' failed +$make_name: [clean2] Error $delete_error_code (ignored) +$rm_command foo\n"; + +&run_make_with_options($makefile,"clean2 -i",&get_logfile); + +if (-f "foo") { + $test_passed = 0; +} + +if (!$vos) { + &compare_output($answer,&get_logfile(1)); +} + +1; diff --git a/tests/scripts/features/escape b/tests/scripts/features/escape new file mode 100644 index 0000000..bf069df --- /dev/null +++ b/tests/scripts/features/escape @@ -0,0 +1,74 @@ +# -*-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(' +$(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, + 'path=pre:', + "#MAKEFILE#:2: *** target pattern contains no '%'. Stop.", + 512); + +# TEST 3: This one should work, since we escape the ":". + +run_make_test(undef, + "'path=pre\\:'", + 'touch (pre:foo)'); + +# TEST 4: This one should fail, since the escape char is escaped. + +run_make_test(undef, + "'path=pre\\\\:'", + "#MAKEFILE#:2: *** target pattern contains no '%'. Stop.", + 512); + +# 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"); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/export b/tests/scripts/features/export new file mode 100644 index 0000000..81bff0c --- /dev/null +++ b/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/tests/scripts/features/include b/tests/scripts/features/include new file mode 100644 index 0000000..ee014bd --- /dev/null +++ b/tests/scripts/features/include @@ -0,0 +1,179 @@ +# -*-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 that the diagnostics is issued even if the target has been +# tried before with the dontcare flag (include/-include case). +# +run_make_test(' +include bar +-include foo + +all: + +foo: baz +bar: baz +baz: end +', +'', +"#MAKEFILE#:2: bar: No such file or directory +#MAKE#: *** No rule to make target 'end', needed by 'baz'. Stop.\n", +512); + +if ($all_tests) { + # Test that include of a rebuild-able file doesn't show a warning + # Savannah bug #102 + run_make_test(q! +include foo +foo: ; @echo foo = bar > $@ +!, + '', "#MAKE#: 'foo' is up to date.\n"); + rmfiles('foo'); +} + +1; diff --git a/tests/scripts/features/jobserver b/tests/scripts/features/jobserver new file mode 100644 index 0000000..cedd4b3 --- /dev/null +++ b/tests/scripts/features/jobserver @@ -0,0 +1,61 @@ +# -*-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; +} + +# Don't put --jobserver-fds 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' > $@ +!, + '--no-print-directory -j2', "#MAKE#[1]: warning: -jN forced in submake: disabling jobserver mode.\nall\n"); + +unlink('inc.mk'); + +# Test recursion when make doesn't think it exists. +# See Savannah bug #39934 +# Or Red Hat bug https://bugzilla.redhat.com/show_bug.cgi?id=885474 + +open(MAKEFILE,"> Makefile2"); +print MAKEFILE ' +vpath %.c ../ +foo: +'; +close(MAKEFILE); + +run_make_test(q! +default: ; @ #MAKEPATH# -f Makefile2 +!, + '-j2 --no-print-directory', +"#MAKE#[1]: warning: jobserver unavailable: using -j1. Add '+' to parent make rule. +#MAKE#[1]: Nothing to be done for 'foo'."); + +rmfiles('Makefile2'); + +1; diff --git a/tests/scripts/features/load b/tests/scripts/features/load new file mode 100644 index 0000000..1f8cdc2 --- /dev/null +++ b/tests/scripts/features/load @@ -0,0 +1,110 @@ +# -*-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; + +# 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 +# CONFIG_FLAGS are loaded from config-flags.pm and set by configure + +my $sobuild = "$CONFIG_FLAGS{CC} ".($srcdir? "-I$srcdir":'')." $CONFIG_FLAGS{CPPFLAGS} $CONFIG_FLAGS{CFLAGS} -shared -fPIC $CONFIG_FLAGS{LDFLAGS} -o testload.so testload.c"; + +my $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) +!, + '', "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/tests/scripts/features/loadapi b/tests/scripts/features/loadapi new file mode 100644 index 0000000..8c824c0 --- /dev/null +++ b/tests/scripts/features/loadapi @@ -0,0 +1,116 @@ +# -*-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; + +# 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"; + +my $sobuild = "$CONFIG_FLAGS{CC} ".($srcdir? "-I$srcdir":'')." $CONFIG_FLAGS{CPPFLAGS} $CONFIG_FLAGS{CFLAGS} -shared -fPIC $CONFIG_FLAGS{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/tests/scripts/features/mult_rules b/tests/scripts/features/mult_rules new file mode 100644 index 0000000..e706e17 --- /dev/null +++ b/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/tests/scripts/features/order_only b/tests/scripts/features/order_only new file mode 100644 index 0000000..4ebdc2b --- /dev/null +++ b/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/tests/scripts/features/output-sync b/tests/scripts/features/output-sync new file mode 100644 index 0000000..a7534cb --- /dev/null +++ b/tests/scripts/features/output-sync @@ -0,0 +1,341 @@ +# -*-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; + + +if ($vos) { + $sleep_command = "sleep -seconds"; +} +else { + $sleep_command = "sleep"; +} + +# The following subdirectories with Makefiles are used in several +# of the following tests. The model is: +# foo/Makefile - has a "foo" target that waits for the bar target +# 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 "while [ ! -f ../mksync.$_[0] ]; do :; done; rm -f ../mksync.$_[0].wait; $sleep_command 1"; +} +sub output_sync_set { + return "date > ../mksync.$_[0]"; +} + +@syncfiles = qw(mksync.foo mksync.foo_start mksync.bar mksync.bar_start); + +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#MAKEFILE#:3: recipe for target 't1' failed\n#MAKE#: [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); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/override b/tests/scripts/features/override new file mode 100644 index 0000000..fff6c4e --- /dev/null +++ b/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/tests/scripts/features/parallelism b/tests/scripts/features/parallelism new file mode 100644 index 0000000..c702c26 --- /dev/null +++ b/tests/scripts/features/parallelism @@ -0,0 +1,216 @@ +# -*-perl-*- + +$description = "Test parallelism (-j) option."; + + +$details = "This test creates a makefile with two double-colon default +rules. The first rule has a series of sleep and echo commands +intended to run in series. The second and third have just an +echo statement. When make is called in this test, it is given +the -j option with a value of 4. This tells make that it may +start up to four jobs simultaneously. In this case, since the +first command is a sleep command, the output of the second +and third commands will appear before the first if indeed +make is running all of these commands in parallel."; + +if (!$parallel_jobs) { + return -1; +} + +if ($vos) { + $sleep_command = "sleep -seconds"; +} +else { + $sleep_command = "sleep"; +} + + +run_make_test(" +all : def_1 def_2 def_3 +def_1 : ; \@echo ONE; $sleep_command 3 ; echo TWO +def_2 : ; \@$sleep_command 2 ; echo THREE +def_3 : ; \@$sleep_command 1 ; echo FOUR", + '-j4', "ONE\nFOUR\nTHREE\nTWO"); + +# Test parallelism with included files. Here we sleep/echo while +# building the included files, to test that they are being built in +# parallel. +run_make_test(" +all: 1 2; \@echo success +-include 1.inc 2.inc +1.inc: ; \@echo ONE.inc; $sleep_command 2; echo TWO.inc; echo '1: ; \@echo ONE; $sleep_command 2; echo TWO' > \$\@ +2.inc: ; \@$sleep_command 1; echo THREE.inc; echo '2: ; \@$sleep_command 1; echo THREE' > \$\@", + "-j4", + "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n", 0, 7); + +rmfiles(qw(1.inc 2.inc)); + + +# Test parallelism with included files--this time recurse first and make +# sure the jobserver works. +run_make_test(" +recurse: ; \@\$(MAKE) --no-print-directory -f #MAKEFILE# INC=yes all +all: 1 2; \@echo success + +INC = no +ifeq (\$(INC),yes) +-include 1.inc 2.inc +endif + +1.inc: ; \@echo ONE.inc; $sleep_command 2; echo TWO.inc; echo '1: ; \@echo ONE; $sleep_command 2; echo TWO' > \$\@ +2.inc: ; \@$sleep_command 1; echo THREE.inc; echo '2: ; \@$sleep_command 1; echo THREE' > \$\@", + "-j4", + "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n", 0, 7); + +rmfiles(qw(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 = echo hi +second.CMD = $sleep_command 4; echo hi + +.PHONY: all first second +all: first second + +first second: ; \@echo \$\@; $sleep_command 1; echo \$\@", + '-j2', "first\nfirst\nsecond\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 + +fail.1 fail.2 fail.3: + \@$sleep_command \$(patsubst fail.%,%,\$\@) + \@echo Fail + \@exit 1 + +ok: + \@$sleep_command 4 + \@echo Ok done", + '-rR -j5', "Fail +#MAKEFILE#:6: recipe for target 'fail.1' failed +#MAKE#: *** [fail.1] Error 1 +#MAKE#: *** Waiting for unfinished jobs.... +Fail +#MAKEFILE#:6: recipe for target 'fail.2' failed +#MAKE#: *** [fail.2] Error 1 +Fail +#MAKEFILE#:6: recipe for target 'fail.3' failed +#MAKE#: *** [fail.3] Error 1 +Ok done", + 512); + + +# Test for Savannah bug #15641. +# +run_make_test(' +.PHONY: all +all:; @: + +-include foo.d + +foo.d: comp + @echo building $@ + +comp: mod_a.o mod_b.o; @: + +mod_a.o mod_b.o: + @exit 1 +', '-j2', ''); + + +# TEST #9 -- Savannah bugs 3330 and 15919 +# In earlier versions of make this will either give the wrong answer, or hang. + +utouch(-10, 'target'); +run_make_test('target: intermed ; touch $@ + +.INTERMEDIATE: intermed +intermed: | phony ; touch $@ + +.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:; @sleep 1; echo '$@ start'; sleep 2; echo '$@ end' +thing2:; @echo '$@ start'; sleep 2; echo '$@ end' +-include inc.mk +inc.mk: ; @touch $@ +!, + '', "thing2 start\nthing1 start\nthing2 end\nthing1 end\n"); + +delete $extraENV{MAKEFLAGS}; +rmfiles('inc.mk'); + +# 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'); + +# 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/tests/scripts/features/patspecific_vars b/tests/scripts/features/patspecific_vars new file mode 100644 index 0000000..a530bba --- /dev/null +++ b/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/tests/scripts/features/patternrules b/tests/scripts/features/patternrules new file mode 100644 index 0000000..0ff49a7 --- /dev/null +++ b/tests/scripts/features/patternrules @@ -0,0 +1,225 @@ +# -*-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", +"#MAKEFILE#:6: recipe for target '$dir/foo.bar' failed +#MAKE#: *** [$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(q! +BIN = xyz +COPY = $(BIN).cp +SRC = $(BIN).c +allbroken: $(COPY) $(BIN) ; @echo ok +$(SRC): ; @echo 'main(){}' > $@ +%.cp: % ; @cp $< $@ +% : %.c ; @cp $< $@ +clean: ; @rm -rf $(SRC) $(COPY) $(BIN) +!, + '', "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; + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/quoting b/tests/scripts/features/quoting new file mode 100644 index 0000000..916681c --- /dev/null +++ b/tests/scripts/features/quoting @@ -0,0 +1,32 @@ +# -*-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'; +SHELL = /bin/sh +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/tests/scripts/features/recursion b/tests/scripts/features/recursion new file mode 100644 index 0000000..fd5e351 --- /dev/null +++ b/tests/scripts/features/recursion @@ -0,0 +1,55 @@ +# -*-perl-*- +$description = "Test recursion."; + +$details = "DETAILS"; + +# Test some basic recursion. +run_make_test(' +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 +'); + +1; diff --git a/tests/scripts/features/reinvoke b/tests/scripts/features/reinvoke new file mode 100644 index 0000000..eb1a349 --- /dev/null +++ b/tests/scripts/features/reinvoke @@ -0,0 +1,80 @@ +# -*-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(' +SHELL = /bin/sh + +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; diff --git a/tests/scripts/features/rule_glob b/tests/scripts/features/rule_glob new file mode 100644 index 0000000..2d377e7 --- /dev/null +++ b/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/tests/scripts/features/se_explicit b/tests/scripts/features/se_explicit new file mode 100644 index 0000000..790017a --- /dev/null +++ b/tests/scripts/features/se_explicit @@ -0,0 +1,167 @@ +# -*-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"); + +1; diff --git a/tests/scripts/features/se_implicit b/tests/scripts/features/se_implicit new file mode 100644 index 0000000..ec09d8d --- /dev/null +++ b/tests/scripts/features/se_implicit @@ -0,0 +1,260 @@ +# -*-perl-*- +$description = "Test second expansion in ordinary 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"); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/se_statpat b/tests/scripts/features/se_statpat new file mode 100644 index 0000000..b1e59e1 --- /dev/null +++ b/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/tests/scripts/features/shell_assignment b/tests/scripts/features/shell_assignment new file mode 100644 index 0000000..686e4bd --- /dev/null +++ b/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/tests/scripts/features/statipattrules b/tests/scripts/features/statipattrules new file mode 100644 index 0000000..3f363de --- /dev/null +++ b/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/tests/scripts/features/targetvars b/tests/scripts/features/targetvars new file mode 100644 index 0000000..a9b8dbe --- /dev/null +++ b/tests/scripts/features/targetvars @@ -0,0 +1,273 @@ +# -*-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(' +SHELL = /bin/sh +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 #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; diff --git a/tests/scripts/features/utf8 b/tests/scripts/features/utf8 new file mode 100644 index 0000000..54bc471 --- /dev/null +++ b/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/tests/scripts/features/varnesting b/tests/scripts/features/varnesting new file mode 100644 index 0000000..d8f3ffb --- /dev/null +++ b/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/tests/scripts/features/vpath b/tests/scripts/features/vpath new file mode 100644 index 0000000..ec24165 --- /dev/null +++ b/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/tests/scripts/features/vpath2 b/tests/scripts/features/vpath2 new file mode 100644 index 0000000..7e970a7 --- /dev/null +++ b/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:$sourcedir\n"; +print MAKEFILE "vpath %.c foo\n"; +print MAKEFILE "vpath %.c $workdir\n"; +print MAKEFILE "vpath %.c $sourcedir\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/tests/scripts/features/vpath3 b/tests/scripts/features/vpath3 new file mode 100644 index 0000000..c6ede28 --- /dev/null +++ b/tests/scripts/features/vpath3 @@ -0,0 +1,35 @@ +# -*-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); + +run_make_test(' +vpath %.h b3 +vpath %.a a1 +vpath %.so b1 +vpath % a2 b2 +vpath % b3 +all: -l1 -lc -l2 -l3; @echo $^ +', + '', "a1${pathsep}lib1.a a1${pathsep}libc.a a2${pathsep}lib2.a lib3.a\n"); + +unlink(@files_to_touch); +for my $d (@dirs_to_make) { + rmdir($d); +} + +1; diff --git a/tests/scripts/features/vpathgpath b/tests/scripts/features/vpathgpath new file mode 100644 index 0000000..5e6217b --- /dev/null +++ b/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/tests/scripts/features/vpathplus b/tests/scripts/features/vpathplus new file mode 100644 index 0000000..361788c --- /dev/null +++ b/tests/scripts/features/vpathplus @@ -0,0 +1,129 @@ +# -*-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'; + +SHELL = /bin/sh + +.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 +$makefile:16: recipe for target 'notarget.b' failed +$make_name: *** [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"); + +$answer = "cat ${VP}inter.d > inter.c +cat inter.c > inter.b 2>/dev/null || exit 1 +cat inter.b > inter.a +rm inter.b inter.c +"; +&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; diff --git a/tests/scripts/functions/abspath b/tests/scripts/functions/abspath new file mode 100644 index 0000000..84c30ab --- /dev/null +++ b/tests/scripts/functions/abspath @@ -0,0 +1,81 @@ +# -*-perl-*- +$description = "Test the abspath functions."; + +$details = ""; + +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/tests/scripts/functions/addprefix b/tests/scripts/functions/addprefix new file mode 100644 index 0000000..1845552 --- /dev/null +++ b/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/tests/scripts/functions/addsuffix b/tests/scripts/functions/addsuffix new file mode 100644 index 0000000..da4fbb7 --- /dev/null +++ b/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/tests/scripts/functions/call b/tests/scripts/functions/call new file mode 100644 index 0000000..9db9da7 --- /dev/null +++ b/tests/scripts/functions/call @@ -0,0 +1,110 @@ +# -*-perl-*- +$description = "Test the call function.\n"; + +$details = "Try various uses of call and ensure they all give the correct +results.\n"; + +open(MAKEFILE, "> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<'EOMAKE'; +# 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)' + + + +EOMAKE + +# These won't work until/unless PR/1527 is resolved. +# echo '$(call my-foreach,a,x y z,$(a)$(a))'; \ +# echo '$(call my-if,,$(warning don't print this),ok)' +# +# $answer = "xx yy zz\nok\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile, "", &get_logfile); +$answer = "foo bar\ndefault file file\nb d f\n\n\nb\nbar foo baz\nfoo bar baz blarp quux \n"; +&compare_output($answer, &get_logfile(1)); + + +# TEST eclipsing of arguments when invoking sub-calls + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile2"); + +print MAKEFILE <<'EOF'; + +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) +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, "", &get_logfile); +$answer = "1 2 3 4 5 6 7 8 9\n1 2 3 4 5\n1 2 3\n1 2 3\n"; +&compare_output($answer,&get_logfile(1)); + +# 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; diff --git a/tests/scripts/functions/dir b/tests/scripts/functions/dir new file mode 100644 index 0000000..f48fb8c --- /dev/null +++ b/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/tests/scripts/functions/error b/tests/scripts/functions/error new file mode 100644 index 0000000..0d61177 --- /dev/null +++ b/tests/scripts/functions/error @@ -0,0 +1,73 @@ +# -*-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:16: *** 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; + + + + + + diff --git a/tests/scripts/functions/eval b/tests/scripts/functions/eval new file mode 100644 index 0000000..90513bd --- /dev/null +++ b/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/tests/scripts/functions/file b/tests/scripts/functions/file new file mode 100644 index 0000000..55eb58a --- /dev/null +++ b/tests/scripts/functions/file @@ -0,0 +1,118 @@ +# -*-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 +touch('file.out'); +chmod(0444, 'file.out'); + +# Find the error that will be printed +# This seems complicated, but we need the message from the C locale +my $loc = undef; +if ($has_POSIX) { + $loc = POSIX::setlocale(POSIX::LC_MESSAGES); + POSIX::setlocale(POSIX::LC_MESSAGES, 'C'); +} +my $e; +open(my $F, '>', 'file.out') and die "Opened read-only file!\n"; +$e = "$!"; +$loc and POSIX::setlocale(POSIX::LC_MESSAGES, $loc); + +run_make_test(q! +define A +a +b +endef +$(file > file.out,$(A)) +x:;@cat file.out +!, + '', "#MAKEFILE#:6: *** open: file.out: $e. 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'); + +1; diff --git a/tests/scripts/functions/filter-out b/tests/scripts/functions/filter-out new file mode 100644 index 0000000..1fe4819 --- /dev/null +++ b/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/tests/scripts/functions/findstring b/tests/scripts/functions/findstring new file mode 100644 index 0000000..48abede --- /dev/null +++ b/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/tests/scripts/functions/flavor b/tests/scripts/functions/flavor new file mode 100644 index 0000000..80d6be7 --- /dev/null +++ b/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/tests/scripts/functions/foreach b/tests/scripts/functions/foreach new file mode 100644 index 0000000..4d1a11d --- /dev/null +++ b/tests/scripts/functions/foreach @@ -0,0 +1,77 @@ +# -*-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'); + + +# TEST 2: 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 ) +y := $x + +all: ; @echo $y', + '', + "#MAKEFILE#:2: *** insufficient number of arguments (1) to function 'foreach'. Stop.", + 512); + +1; diff --git a/tests/scripts/functions/guile b/tests/scripts/functions/guile new file mode 100644 index 0000000..c63bec9 --- /dev/null +++ b/tests/scripts/functions/guile @@ -0,0 +1,99 @@ +# -*-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; + +# 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 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/tests/scripts/functions/if b/tests/scripts/functions/if new file mode 100644 index 0000000..8604e4f --- /dev/null +++ b/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/tests/scripts/functions/notdir b/tests/scripts/functions/notdir new file mode 100644 index 0000000..4ed8f9c --- /dev/null +++ b/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/tests/scripts/functions/origin b/tests/scripts/functions/origin new file mode 100644 index 0000000..f7b7eb8 --- /dev/null +++ b/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/tests/scripts/functions/realpath b/tests/scripts/functions/realpath new file mode 100644 index 0000000..9b503b4 --- /dev/null +++ b/tests/scripts/functions/realpath @@ -0,0 +1,82 @@ +# -*-perl-*- +$description = "Test the realpath functions."; + +$details = ""; + +run_make_test(' +ifneq ($(realpath .),$(CURDIR)) + $(error ) +endif + +ifneq ($(realpath ./),$(CURDIR)) + $(error ) +endif + +ifneq ($(realpath .///),$(CURDIR)) + $(error ) +endif + +ifneq ($(realpath /),/) + $(error ) +endif + +ifneq ($(realpath /.),/) + $(error ) +endif + +ifneq ($(realpath /./),/) + $(error ) +endif + +ifneq ($(realpath /.///),/) + $(error ) +endif + +ifneq ($(realpath /..),/) + $(error ) +endif + +ifneq ($(realpath /../),/) + $(error ) +endif + +ifneq ($(realpath /..///),/) + $(error ) +endif + +ifneq ($(realpath . /..),$(CURDIR) /) + $(error ) +endif + +.PHONY: all +all: ; @: +', + '', + ''); + +# On Windows platforms, "//" means something special. So, don't do these +# tests there. + +if ($port_type ne 'W32') { + run_make_test(' +ifneq ($(realpath ///),/) + $(error ) +endif + +ifneq ($(realpath ///.),/) + $(error ) +endif + +ifneq ($(realpath ///..),/) + $(error ) +endif + +.PHONY: all +all: ; @:', + '', + ''); +} + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/functions/shell b/tests/scripts/functions/shell new file mode 100644 index 0000000..723cd0e --- /dev/null +++ b/tests/scripts/functions/shell @@ -0,0 +1,32 @@ +# -*-perl-*- + +$description = 'Test the $(shell ...) function.'; + +$details = ''; + + +# Test shells inside rules. +run_make_test('.PHONY: all +all: ; @echo $(shell echo hi) +','','hi'); + + +# Test unescaped comment characters in shells. Savannah bug #20513 +if ($all_tests) { + run_make_test(q! +FOO := $(shell echo '#') +foo: ; echo '$(FOO)' +!, + '', "#\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'); + +1; diff --git a/tests/scripts/functions/sort b/tests/scripts/functions/sort new file mode 100644 index 0000000..b558910 --- /dev/null +++ b/tests/scripts/functions/sort @@ -0,0 +1,47 @@ +# -*-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", + '', "5\n"); + +1; diff --git a/tests/scripts/functions/strip b/tests/scripts/functions/strip new file mode 100644 index 0000000..8222433 --- /dev/null +++ b/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/tests/scripts/functions/substitution b/tests/scripts/functions/substitution new file mode 100644 index 0000000..0d2f6a2 --- /dev/null +++ b/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/tests/scripts/functions/suffix b/tests/scripts/functions/suffix new file mode 100644 index 0000000..0c4f919 --- /dev/null +++ b/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/tests/scripts/functions/value b/tests/scripts/functions/value new file mode 100644 index 0000000..8e1a6f0 --- /dev/null +++ b/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/tests/scripts/functions/warning b/tests/scripts/functions/warning new file mode 100644 index 0000000..cd452d4 --- /dev/null +++ b/tests/scripts/functions/warning @@ -0,0 +1,65 @@ +# -*-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:14: warning is definitely\nhi\nthere\n"; +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/functions/wildcard b/tests/scripts/functions/wildcard new file mode 100644 index 0000000..bcd84ad --- /dev/null +++ b/tests/scripts/functions/wildcard @@ -0,0 +1,103 @@ +# -*-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"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print 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/tests/scripts/misc/bs-nl b/tests/scripts/misc/bs-nl new file mode 100644 index 0000000..4fc3f63 --- /dev/null +++ b/tests/scripts/misc/bs-nl @@ -0,0 +1,129 @@ +# -*-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'); + +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'); + +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)); + + +1; diff --git a/tests/scripts/misc/close_stdout b/tests/scripts/misc/close_stdout new file mode 100644 index 0000000..18606c3 --- /dev/null +++ b/tests/scripts/misc/close_stdout @@ -0,0 +1,9 @@ +# -*-perl-*- + +$description = "Make sure make exits with an error if stdout is full."; + +if (-e '/dev/full') { + run_make_test('', '-v > /dev/full', '/^#MAKE#: write error/', 256); +} + +1; diff --git a/tests/scripts/misc/fopen-fail b/tests/scripts/misc/fopen-fail new file mode 100644 index 0000000..6580e51 --- /dev/null +++ b/tests/scripts/misc/fopen-fail @@ -0,0 +1,15 @@ +# -*-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. + +run_make_test(q! +include $(lastword $(MAKEFILE_LIST)) +!, + '', undef, 512); + +1; diff --git a/tests/scripts/misc/general1 b/tests/scripts/misc/general1 new file mode 100644 index 0000000..352fc6a --- /dev/null +++ b/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 +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' +", + '', '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(" +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'); + +1; diff --git a/tests/scripts/misc/general4 b/tests/scripts/misc/general4 new file mode 100644 index 0000000..6d42a16 --- /dev/null +++ b/tests/scripts/misc/general4 @@ -0,0 +1,82 @@ +# -*-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"); + +1; diff --git a/tests/scripts/misc/utf8 b/tests/scripts/misc/utf8 new file mode 100644 index 0000000..2adcd07 --- /dev/null +++ b/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/tests/scripts/options/dash-B b/tests/scripts/options/dash-B new file mode 100644 index 0000000..9c708b7 --- /dev/null +++ b/tests/scripts/options/dash-B @@ -0,0 +1,85 @@ +# -*-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= +#MAKEFILE#:4: foo.x: No such file or directory +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= +#MAKEFILE#:4: foo.x: No such file or directory +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; diff --git a/tests/scripts/options/dash-C b/tests/scripts/options/dash-C new file mode 100644 index 0000000..42d0a8b --- /dev/null +++ b/tests/scripts/options/dash-C @@ -0,0 +1,71 @@ +# -*-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 < $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 $@" +', + '', '#MAKEFILE#:3: foo.x: No such file or directory +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; diff --git a/tests/scripts/options/dash-e b/tests/scripts/options/dash-e new file mode 100644 index 0000000..17c3fc8 --- /dev/null +++ b/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/tests/scripts/options/dash-f b/tests/scripts/options/dash-f new file mode 100644 index 0000000..3aa4746 --- /dev/null +++ b/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/tests/scripts/options/dash-k b/tests/scripts/options/dash-k new file mode 100644 index 0000000..e784e0d --- /dev/null +++ b/tests/scripts/options/dash-k @@ -0,0 +1,115 @@ +# -*-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 +$makefile2:9: recipe for target 'foo.o' failed +$make_name: *** [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. + +run_make_test('all: ; @echo hi +include ifile +ifile: no-such-file; @false +', + '-k', + "#MAKEFILE#:2: ifile: No such file or directory +#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/tests/scripts/options/dash-l b/tests/scripts/options/dash-l new file mode 100644 index 0000000..0b0f196 --- /dev/null +++ b/tests/scripts/options/dash-l @@ -0,0 +1,56 @@ +# -*-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."; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<'EOF'; +SHELL = /bin/sh + +define test +if [ ! -f test-file ]; then \ + echo >> test-file; sleep 2; rm -f test-file; \ +else \ + echo $@ FAILED; \ +fi +endef + +all : ONE TWO THREE +ONE : ; @$(test) +TWO : ; @$(test) +THREE : ; @$(test) +EOF + + +# END of Contents of MAKEFILE + +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/tests/scripts/options/dash-n b/tests/scripts/options/dash-n new file mode 100644 index 0000000..dfed419 --- /dev/null +++ b/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 = "$make_path -f \"$submake\" bar\ntouch inc\necho n --no-print-directory\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('inc'); + +1; diff --git a/tests/scripts/options/dash-q b/tests/scripts/options/dash-q new file mode 100644 index 0000000..194588d --- /dev/null +++ b/tests/scripts/options/dash-q @@ -0,0 +1,77 @@ +# -*-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); + +1; diff --git a/tests/scripts/options/dash-t b/tests/scripts/options/dash-t new file mode 100644 index 0000000..ec27d7a --- /dev/null +++ b/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/tests/scripts/options/eval b/tests/scripts/options/eval new file mode 100644 index 0000000..0f82409 --- /dev/null +++ b/tests/scripts/options/eval @@ -0,0 +1,29 @@ +# -*-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! +BAR = bar +all: ; @echo all +recurse: ; @$(MAKE) -f #MAKEFILE# && echo recurse!, + '--eval=\$\(info\ eval\) FOO=\$\(BAR\)', "eval\nall"); + +# Make sure that --eval is handled correctly during recursion +run_make_test(undef, '--no-print-directory --eval=\$\(info\ eval\) recurse', + "eval\neval\nall\nrecurse"); + +# 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'); + +1; diff --git a/tests/scripts/options/general b/tests/scripts/options/general new file mode 100644 index 0000000..d35bb35 --- /dev/null +++ b/tests/scripts/options/general @@ -0,0 +1,35 @@ +# -*-perl-*- +$description = "Test generic option processing.\n"; + +open(MAKEFILE, "> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "foo 1foo: ; \@echo \$\@\n"; + +close(MAKEFILE); + +# TEST 0 + +&run_make_with_options($makefile, "-j 1foo", &get_logfile); +if (!$parallel_jobs) { + $answer = "$make_name: Parallel jobs (-j) are not supported on this platform.\n$make_name: Resetting to single job (-j1) mode.\n1foo\n"; +} +else { + $answer = "1foo\n"; +} + +# TEST 1 + +# This test prints the usage string; I don't really know a good way to +# test it. I guess I could invoke make with a known-bad option to see +# what the usage looks like, then compare it to what I get here... :( + +# If I were always on UNIX, I could invoke it with 2>/dev/null, then +# just check the error code. + +&run_make_with_options($makefile, "-j1foo 2>/dev/null", &get_logfile, 512); +$answer = ""; +&compare_output($answer, &get_logfile(1)); + +1; diff --git a/tests/scripts/options/print-directory b/tests/scripts/options/print-directory new file mode 100644 index 0000000..a05bbee --- /dev/null +++ b/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 +!, + "", "#MAKEFILE#:2: foo: No such file or directory\ntouch foo\n"); +unlink('foo'); + +# Test makefile rebuild with -w +run_make_test(q! +include foo +all: ;@: +foo: ; touch foo +!, + "-w", "#MAKE#: Entering directory '#PWD#'\n#MAKEFILE#:2: foo: No such file or directory\ntouch foo\n#MAKE#: Leaving directory '#PWD#'\n"); +unlink('foo'); + +1; diff --git a/tests/scripts/options/symlinks b/tests/scripts/options/symlinks new file mode 100644 index 0000000..a1bfce0 --- /dev/null +++ b/tests/scripts/options/symlinks @@ -0,0 +1,68 @@ +# -*-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 + -1; +} else { + + # Set up a symlink sym -> dep + # We'll make both dep and targ older than sym + $pwd =~ m%/([^/]+)$%; + $dirnm = $1; + &utouch(-10, 'dep'); + &utouch(-5, 'targ'); + symlink("../$dirnm/dep", 'sym'); + + # 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("../$dirname/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/tests/scripts/options/warn-undefined-variables b/tests/scripts/options/warn-undefined-variables new file mode 100644 index 0000000..ce15507 --- /dev/null +++ b/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/tests/scripts/targets/DEFAULT b/tests/scripts/targets/DEFAULT new file mode 100644 index 0000000..f3d5148 --- /dev/null +++ b/tests/scripts/targets/DEFAULT @@ -0,0 +1,53 @@ +$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"; + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "foo:\n"; +print MAKEFILE "\t\@echo Executing rule FOO\n\n"; +print MAKEFILE ".DEFAULT:\n"; +print MAKEFILE "\t\@\$(MAKE) -f $makefile2 \$\@ \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + + +open(MAKEFILE,"> $makefile2"); + +print MAKEFILE "bar:\n"; +print MAKEFILE "\t\@echo Executing rule BAR\n\n"; + +close(MAKEFILE); + +&run_make_with_options($makefile,'bar',&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "${make_name}[1]: Entering directory '$pwd'\n" + . "Executing rule BAR\n" + . "${make_name}[1]: Leaving directory '$pwd'\n"; + +# COMPARE RESULTS + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/targets/FORCE b/tests/scripts/targets/FORCE new file mode 100644 index 0000000..eb8f251 --- /dev/null +++ b/tests/scripts/targets/FORCE @@ -0,0 +1,40 @@ +# -*-perl-*- + +$description = "The following tests rules without Commands or Dependencies."; + +$details = "If the rule ...\n"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE ".IGNORE :\n"; +print MAKEFILE "clean: FORCE\n"; +print MAKEFILE "\t$delete_command clean\n"; +print MAKEFILE "FORCE:\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + + +# Create a file named "clean". This is the same name as the target clean +# and tricks the target into thinking that it is up to date. (Unless you +# use the .PHONY target. +&touch("clean"); + +$answer = "$delete_command clean\n"; +&run_make_with_options($makefile,"clean",&get_logfile); + +&compare_output($answer,&get_logfile(1)); + +1; + + + + + + + + + diff --git a/tests/scripts/targets/INTERMEDIATE b/tests/scripts/targets/INTERMEDIATE new file mode 100644 index 0000000..2b3021b --- /dev/null +++ b/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 bar.e foo.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 bar.e foo.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/tests/scripts/targets/ONESHELL b/tests/scripts/targets/ONESHELL new file mode 100644 index 0000000..87713da --- /dev/null +++ b/tests/scripts/targets/ONESHELL @@ -0,0 +1,88 @@ +# -*-perl-*- + +$description = "Test the behaviour of the .ONESHELL target."; + +$details = ""; + +# Some shells (*shakes fist at Solaris*) cannot handle multiple flags in +# separate arguments. +my $t = `/bin/sh -e -c true 2>/dev/null`; +my $multi_ok = $? == 0; + +# 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 + +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/tests/scripts/targets/PHONY b/tests/scripts/targets/PHONY new file mode 100644 index 0000000..c8e2110 --- /dev/null +++ b/tests/scripts/targets/PHONY @@ -0,0 +1,54 @@ +# -*-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"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE ".PHONY : clean \n"; +print MAKEFILE "all: \n"; +print MAKEFILE "\t\@echo This makefile did not clean the dir ... good\n"; +print MAKEFILE "clean: \n"; +print MAKEFILE "\t$delete_command $example clean\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&touch($example); + +# 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"); + +$answer = "$delete_command $example clean\n"; +&run_make_with_options($makefile,"clean",&get_logfile); + +if (-f $example) { + $test_passed = 0; +} + +&compare_output($answer,&get_logfile(1)); + +1; + + + + + + + + + diff --git a/tests/scripts/targets/POSIX b/tests/scripts/targets/POSIX new file mode 100644 index 0000000..a24e3bc --- /dev/null +++ b/tests/scripts/targets/POSIX @@ -0,0 +1,57 @@ +# -*-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 = `/bin/sh $flags '$script' 2>&1`; +my $err = $? >> 8; +run_make_test(qq! +.POSIX: +all: ; \@$script +!, + '', "#MAKEFILE#:3: recipe for target 'all' failed +#MAKE#: *** [all] Error $err\n", 512); + +# User settings must override .POSIX +$flags = '-xc'; +$out = `/bin/sh $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 => '-O', + FC => 'fort77', FFLAGS => '-O 1', + GET => 'get', GFLAGS => '', + 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/tests/scripts/targets/SECONDARY b/tests/scripts/targets/SECONDARY new file mode 100644 index 0000000..447c275 --- /dev/null +++ b/tests/scripts/targets/SECONDARY @@ -0,0 +1,190 @@ +#! -*-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 1.b 2.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/tests/scripts/targets/SILENT b/tests/scripts/targets/SILENT new file mode 100644 index 0000000..4bb0a0f --- /dev/null +++ b/tests/scripts/targets/SILENT @@ -0,0 +1,42 @@ +# -*-perl-*- + +$description = "The following tests the special target .SILENT. By simply\n" + ."mentioning this as a target, it tells make not to print\n" + ."commands before executing them."; + +$details = "This test is the same as the clean test except that it should\n" + ."not echo its command before deleting the specified file.\n"; + +$example = "EXAMPLE_FILE"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE ".SILENT : clean\n"; +print MAKEFILE "clean: \n"; +print MAKEFILE "\t$delete_command EXAMPLE_FILE\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&touch($example); + +$answer = ""; +&run_make_with_options($makefile,"clean",&get_logfile,0); +if (-f $example) { + $test_passed = 0; +} +&compare_output($answer,&get_logfile(1)); + +1; + + + + + + + + + diff --git a/tests/scripts/targets/clean b/tests/scripts/targets/clean new file mode 100644 index 0000000..b32c976 --- /dev/null +++ b/tests/scripts/targets/clean @@ -0,0 +1,50 @@ +# -*-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"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "all: \n"; +print MAKEFILE "\t\@echo This makefile did not clean the dir... good\n"; +print MAKEFILE "clean: \n"; +print MAKEFILE "\t$delete_command EXAMPLE_FILE\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&touch($example); + + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "This makefile did not clean the dir... good\n"; + +&compare_output($answer,&get_logfile(1)) || &error ("abort"); + + +$answer = "$delete_command $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/tests/scripts/test_template b/tests/scripts/test_template new file mode 100644 index 0000000..3fd3f95 --- /dev/null +++ b/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/tests/scripts/variables/CURDIR b/tests/scripts/variables/CURDIR new file mode 100644 index 0000000..ee7cacb --- /dev/null +++ b/tests/scripts/variables/CURDIR @@ -0,0 +1,20 @@ +# -*-perl-*- + +$description = "This tests the CURDIR varaible."; + +$details = "Echo CURDIR both with and without -C. Also ensure overrides work."; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE "all: ; \@echo \$(CURDIR)\n"; +close(MAKEFILE); + + +# TEST #1 +# ------- + +&run_make_with_options($makefile,"",&get_logfile); +$answer = "$pwd\n"; +&compare_output($answer,&get_logfile(1)); + + +1; diff --git a/tests/scripts/variables/DEFAULT_GOAL b/tests/scripts/variables/DEFAULT_GOAL new file mode 100644 index 0000000..8188ce7 --- /dev/null +++ b/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/tests/scripts/variables/GNUMAKEFLAGS b/tests/scripts/variables/GNUMAKEFLAGS new file mode 100644 index 0000000..6e50794 --- /dev/null +++ b/tests/scripts/variables/GNUMAKEFLAGS @@ -0,0 +1,42 @@ +# -*-perl-*- + +$description = "Test proper behavior of GNUMAKEFLAGS"; + +# Accept flags from GNUMAKEFLAGS as well as MAKEFLAGS +# Results always go in MAKEFLAGS + +$extraENV{'GNUMAKEFLAGS'} = '-e -r -R'; + +run_make_test(q! +all: ; @echo $(MAKEFLAGS) +!, + '', 'erR'); + +# Long arguments mean everything is prefixed with "-" + +$extraENV{'GNUMAKEFLAGS'} = '--no-print-directory -e -r -R --trace'; + +run_make_test(q! +all: ; @echo $(MAKEFLAGS) +!, + '', "#MAKEFILE#:2: target 'all' does not exist +echo erR --trace --no-print-directory +erR --trace --no-print-directory"); + +# Verify that re-exec / recursion doesn't duplicate flags from GNUMAKEFLAGS + +unlink('x.mk'); + +$extraENV{GNUMAKEFLAGS} = '-Itst/bad'; + +run_make_test(q! +recurse: ; @echo $@; echo MAKEFLAGS = $$MAKEFLAGS; echo GNUMAKEFLAGS = $$GNUMAKEFLAGS; #MAKEPATH# -f #MAKEFILE# all +all: ; @echo $@; echo MAKEFLAGS = $$MAKEFLAGS; echo GNUMAKEFLAGS = $$GNUMAKEFLAGS +-include x.mk +x.mk: ; @echo $@; echo MAKEFLAGS = $$MAKEFLAGS; echo GNUMAKEFLAGS = $$GNUMAKEFLAGS; echo > $@ +!, + "", "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/tests/scripts/variables/INCLUDE_DIRS b/tests/scripts/variables/INCLUDE_DIRS new file mode 100644 index 0000000..c9662e9 --- /dev/null +++ b/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/tests/scripts/variables/LIBPATTERNS b/tests/scripts/variables/LIBPATTERNS new file mode 100644 index 0000000..9182954 --- /dev/null +++ b/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/tests/scripts/variables/MAKE b/tests/scripts/variables/MAKE new file mode 100644 index 0000000..dc62160 --- /dev/null +++ b/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/tests/scripts/variables/MAKECMDGOALS b/tests/scripts/variables/MAKECMDGOALS new file mode 100644 index 0000000..879283b --- /dev/null +++ b/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/tests/scripts/variables/MAKEFILES b/tests/scripts/variables/MAKEFILES new file mode 100644 index 0000000..b23da8e --- /dev/null +++ b/tests/scripts/variables/MAKEFILES @@ -0,0 +1,53 @@ +# -*-perl-*- + +$description = "Test the MAKEFILES variable."; + +$makefile2 = &get_tmpfile; +$makefile3 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE 'all: ; @echo DEFAULT RULE: M2=$(M2) M3=$(M3)', "\n"; +close(MAKEFILE); + + +open(MAKEFILE,"> $makefile2"); +print MAKEFILE < $makefile3"); +print MAKEFILE < $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE < $@ +bar.x: ; @touch $@ +', + '', 'MAKE_RESTARTS= +#MAKEFILE#:4: foo.x: No such file or directory +MAKE_RESTARTS=1 +foo.x:1: bar.x: No such file or directory +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= +#MAKEFILE#:8: foo.x: No such file or directory +MAKE_RESTARTS=1 +foo.x:1: bar.x: No such file or directory +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; diff --git a/tests/scripts/variables/MFILE_LIST b/tests/scripts/variables/MFILE_LIST new file mode 100644 index 0000000..076e42d --- /dev/null +++ b/tests/scripts/variables/MFILE_LIST @@ -0,0 +1,30 @@ +# -*-perl-*- + +$description = "Test the MAKEFILE_LIST variable."; + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE < $makefile2"); +print MAKEFILE "m2 := \$(MAKEFILE_LIST)\n"; +close(MAKEFILE); + + +&run_make_with_options($makefile, "", &get_logfile); +$answer = "$makefile\n$makefile $makefile2\n$makefile $makefile2\n"; +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/tests/scripts/variables/SHELL b/tests/scripts/variables/SHELL new file mode 100644 index 0000000..1d01ba3 --- /dev/null +++ b/tests/scripts/variables/SHELL @@ -0,0 +1,103 @@ +# -*-perl-*- + +$description = "Test proper handling of SHELL."; + +# Find the default value when SHELL is not set. On UNIX it will be /bin/sh, +# but on other platforms who knows? +resetENV(); +delete $ENV{SHELL}; +$mshell = `echo 'all:;\@echo \$(SHELL)' | $make_path -f-`; +chop $mshell; + +# 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; + +run_make_test("SHELL := /./$mshell\n".' +all:;@echo "$(SHELL) $$SHELL" +', '', "/./$mshell $mshell"); + +# As a GNU make extension, if make's SHELL variable is explicitly exported, +# then we really _DO_ export it. + +$extraENV{SHELL} = $mshell; + +run_make_test("export SHELL := /./$mshell\n".' +all:;@echo "$(SHELL) $$SHELL" +', '', "/./$mshell /./$mshell"); + + +# Test out setting of SHELL, both exported and not, as a target-specific +# variable. + +$extraENV{SHELL} = $mshell; + +run_make_test("all: SHELL := /./$mshell\n".' +all:;@echo "$(SHELL) $$SHELL" +', '', "/./$mshell $mshell"); + +$extraENV{SHELL} = $mshell; + +run_make_test(" +SHELL := /././$mshell +one: two +two: export SHELL := /./$mshell\n".' +one two:;@echo "$@: $(SHELL) $$SHELL" +', '', "two: /./$mshell /./$mshell\none: /././$mshell $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 = `/bin/sh $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 = `/bin/sh -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 = `/bin/sh $flags '$script' 2>&1`; +my $err = $? >> 8; + +run_make_test(qq! +.SHELLFLAGS = $flags +all: ; \@$script +!, + '', "$out#MAKEFILE#:3: recipe for target 'all' failed +#MAKE#: *** [all] Error $err\n", 512); + +1; diff --git a/tests/scripts/variables/automatic b/tests/scripts/variables/automatic new file mode 100644 index 0000000..33c482d --- /dev/null +++ b/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\n\y\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/tests/scripts/variables/define b/tests/scripts/variables/define new file mode 100644 index 0000000..7324cbc --- /dev/null +++ b/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/tests/scripts/variables/flavors b/tests/scripts/variables/flavors new file mode 100644 index 0000000..ba133ea --- /dev/null +++ b/tests/scripts/variables/flavors @@ -0,0 +1,96 @@ +# -*-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"); + +1; diff --git a/tests/scripts/variables/negative b/tests/scripts/variables/negative new file mode 100644 index 0000000..16a72b8 --- /dev/null +++ b/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/tests/scripts/variables/private b/tests/scripts/variables/private new file mode 100644 index 0000000..8967ffb --- /dev/null +++ b/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/tests/scripts/variables/special b/tests/scripts/variables/special new file mode 100644 index 0000000..a5ab93a --- /dev/null +++ b/tests/scripts/variables/special @@ -0,0 +1,141 @@ +# -*-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"); + + + +# $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/tests/scripts/variables/undefine b/tests/scripts/variables/undefine new file mode 100644 index 0000000..38707b8 --- /dev/null +++ b/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/tests/test_driver.pl b/tests/test_driver.pl new file mode 100644 index 0000000..91141eb --- /dev/null +++ b/tests/test_driver.pl @@ -0,0 +1,1474 @@ +#!/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-2014 Free 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$ + + +# 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; + +# %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', + # 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("/", $pwd); + + 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/") + || &error ("Couldn't wipe out $workpath\n"); + } + else + { + mkdir ($workpath, 0777) || &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" + || mkdir ("$workpath/$dir", 0777) + || &error ("Couldn't mkdir $workpath/$dir: $!\n"); + } + } + } + else + { + print "Finding tests...\n"; + opendir (SCRIPTDIR, $scriptpath) + || &error ("Couldn't opendir $scriptpath: $!\n"); + @dirs = grep (!/^(\..*|CVS|RCS)$/, readdir (SCRIPTDIR) ); + closedir (SCRIPTDIR); + foreach $dir (@dirs) + { + next if ($dir =~ /^(\..*|CVS|RCS)$/ || ! -d "$scriptpath/$dir"); + push (@rmdirs, $dir); + # VMS can have overlayed file systems, so directories may repeat. + next if -d "$workpath/$dir"; + mkdir ("$workpath/$dir", 0777) + || &error ("Couldn't mkdir $workpath/$dir: $!\n"); + opendir (SCRIPTDIR, "$scriptpath/$dir") + || &error ("Couldn't opendir $scriptpath/$dir: $!\n"); + @files = grep (!/^(\..*|CVS|RCS|.*~)$/, readdir (SCRIPTDIR) ); + closedir (SCRIPTDIR); + foreach $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 $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; + } + else + { + print "\n$total_tests_passed Test"; + print "s" unless $total_tests_passed == 1; + print " in $categories_passed Categor"; + print ($categories_passed == 1 ? "y" : "ies"); + print " Complete ... No Failures :-)\n\n"; + return 1; + } +} + +sub get_osname +{ + # Set up an initial value. In perl5 we can do it the easy way. + $osname = defined($^O) ? $^O : ''; + + 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") && close (TOUCHFD)) + || ($short_filenames = 1); + unlink ("fancy.file.name") || ($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) || &error ("Couldn't create .ostest: $!\n", 1); + open (TOUCHFD, "> .ostest>ick") && close (TOUCHFD); + chdir (".ostest") || &error ("Couldn't chdir to .ostest: $!\n", 1); + } + + if (! $short_filenames && -f "ick") + { + $osname = "vos"; + $vos = 1; + $pathsep = ">"; + } + else + { + # the following is regrettably knarly, 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 ("..") || &error ("Couldn't chdir to ..: $!\n", 1); + unlink (".ostest>ick"); + rmdir (".ostest") || &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 =~ /^-debug$/i) + { + print "\nDEBUG ON\n"; + $debug = 1; + } + elsif ($option =~ /^-usage$/i) + { + &print_usage; + exit 0; + } + elsif ($option =~ /^-(h|help)$/i) + { + &print_help; + exit 0; + } + 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 +{ + local($num) = shift @_; + local($newnum); + + while (@_) + { + $newnum = shift @_; + if ($newnum > $num) + { + $num = $newnum; + } + } + + return $num; +} + +sub print_centered +{ + local($width, $string) = @_; + local($pad); + + if (length ($string)) + { + $pad = " " x ( ($width - length ($string) + 1) / 2); + print "$pad$string"; + } +} + +sub print_banner +{ + local($info); + local($line); + local($len); + + $info = "Running tests for $testee on $osname\n"; # $testee is suite-defined + $len = &max (length ($line), length ($testee_version), + length ($banner_info), 73) + 5; + $line = ("-" x $len) . "\n"; + if ($len < 78) + { + $len = 78; + } + + &print_centered ($len, $line); + &print_centered ($len, $info); + &print_centered ($len, $testee_version); # suite-defined + &print_centered ($len, $banner_info); # suite-defined + &print_centered ($len, $line); + print "\n"; +} + +sub run_all_tests +{ + $categories_run = 0; + + $lasttest = ''; + foreach $testname (sort @TESTS) { + # Skip duplicates on VMS caused by logical name search lists. + next if $testname eq $lasttest; + $lasttest = $testname; + $suite_passed = 1; # reset by test on failure + $num_of_logfiles = 0; + $num_of_tmpfiles = 0; + $description = ""; + $details = ""; + $old_makefile = undef; + $testname =~ s/^$scriptpath$pathsep//; + $perl_testname = "$scriptpath$pathsep$testname"; + $testname =~ s/(\.pl|\.perl)$//; + $testpath = "$workpath$pathsep$testname"; + # Leave enough space in the extensions to append a number, even + # though it needs to fit into 8+3 limits. + if ($short_filenames) { + $logext = 'l'; + $diffext = 'd'; + $baseext = 'b'; + $runext = 'r'; + $extext = ''; + } else { + $logext = 'log'; + $diffext = 'diff'; + $baseext = 'base'; + $runext = 'run'; + $extext = '.'; + } + $extext = '_' if $^O eq 'VMS'; + $log_filename = "$testpath.$logext"; + $diff_filename = "$testpath.$diffext"; + $base_filename = "$testpath.$baseext"; + $run_filename = "$testpath.$runext"; + $tmp_filename = "$testpath.$tmpfilesuffix"; + + setup_for_test(); + + $output = "........................................................ "; + + substr($output,0,length($testname)) = "$testname "; + + print $output; + + $tests_run = 0; + $tests_passed = 0; + + # 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 +{ + local(@files) = @_; + + if (!$keep) + { + return (unlink @files); + } + + return 1; +} + +sub print_standard_usage +{ + local($plname,@moreusage) = @_; + local($line); + + 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 +{ + local(@morehelp) = @_; + local($line); + local($tline); + local($t) = " "; + + $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) + { + $tline = $line; + if (substr ($tline, 0, 1) eq "\t") + { + substr ($tline, 0, 1) = $t; + } + print "$tline\n"; + } +} + +####################################################################### +########### Generic Test Driver Subroutines ########### +####################################################################### + +sub get_caller +{ + local($depth); + local($package); + local($filename); + local($linenum); + + $depth = defined ($_[0]) ? $_[0] : 1; + ($package, $filename, $linenum) = caller ($depth + 1); + return "$filename: $linenum"; +} + +sub error +{ + local($message) = $_[0]; + local($caller) = &get_caller (1); + + if (defined ($_[1])) + { + $caller = &get_caller ($_[1] + 1) . " -> $caller"; + } + + die "$caller: $message"; +} + +sub compare_output +{ + local($answer,$logfile) = @_; + local($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 + local ($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 + + local($command) = "diff -c " . &get_basefile . " " . $logfile; + &run_command_with_output(&get_difffile,$command); + } + + return 0; +} + +sub read_file_into_string +{ + local($filename) = @_; + local($oldslash) = $/; + + undef $/; + + open (RFISFILE, $filename) || return ""; + local ($slurp) = ; + close (RFISFILE); + + $/ = $oldslash; + + return $slurp; +} + +my @OUTSTACK = (); +my @ERRSTACK = (); + +sub attach_default_output +{ + local ($filename) = @_; + local ($code); + + if ($vos) + { + $code = system "++attach_default_output_hack $filename"; + $code == -2 || &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 +{ + local ($code); + + if ($vos) + { + $code = system "++detach_default_output_hack"; + $code == -2 || &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); +} + +# This runs a command without any debugging info. +sub _run_command +{ + my $code; + + # We reset this before every invocation. On Windows I think there is only + # one environment, not one per process, so I think that variables set in + # test scripts might leak into subsequent tests if this isn't reset--??? + resetENV(); + + eval { + if ($^O eq 'VMS') { + local $SIG{ALRM} = sub { + my $e = $ERRSTACK[0]; + print $e "\nTest timed out after $test_timeout seconds\n"; + die "timeout\n"; }; +# alarm $test_timeout; + system(@_); + my $severity = ${^CHILD_ERROR_NATIVE} & 7; + $code = 0; + if (($severity & 1) == 0) { + $code = 512; + } + + # Get the vms status. + my $vms_code = ${^CHILD_ERROR_NATIVE}; + + # Remove the print status bit + $vms_code &= ~0x10000000; + + # Posix code translation. + if (($vms_code & 0xFFFFF000) == 0x35a000) { + $code = (($vms_code & 0xFFF) >> 3) * 256; + } + } else { + my $pid = fork(); + if (! $pid) { + exec(@_) or die "Cannot execute $_[0]\n"; + } + local $SIG{ALRM} = sub { my $e = $ERRSTACK[0]; print $e "\nTest timed out after $test_timeout seconds\n"; die "timeout\n"; }; + alarm $test_timeout; + waitpid($pid, 0) > 0 or die "No such pid: $pid\n"; + $code = $?; + } + alarm 0; + }; + if ($@) { + # The eval failed. If it wasn't SIGALRM then die. + $@ eq "timeout\n" or die "Command failed: $@"; + + # Timed out. Resend the alarm to our process group to kill the children. + $SIG{ALRM} = 'IGNORE'; + kill -14, $$; + $code = 14; + } + + 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 +{ + local ($targetdir) = @_; + local ($nuketop) = 1; + local ($ch); + + $ch = substr ($targetdir, length ($targetdir) - 1); + if ($ch eq "/" || $ch eq $pathsep) + { + $targetdir = substr ($targetdir, 0, length ($targetdir) - 1); + $nuketop = 0; + } + + if (! -e $targetdir) + { + return 1; + } + + &remove_directory_tree_inner ("RDT00", $targetdir) || return 0; + if ($nuketop) + { + rmdir $targetdir || return 0; + } + + return 1; +} + +sub remove_directory_tree_inner +{ + local ($dirhandle, $targetdir) = @_; + local ($object); + local ($subdirhandle); + + opendir ($dirhandle, $targetdir) || return 0; + $subdirhandle = $dirhandle; + $subdirhandle++; + while ($object = readdir ($dirhandle)) + { + if ($object =~ /^(\.\.?|CVS|RCS)$/) + { + next; + } + + $object = "$targetdir$pathsep$object"; + lstat ($object); + + if (-d _ && &remove_directory_tree_inner ($subdirhandle, $object)) + { + rmdir $object || return 0; + } + else + { + if ($^O ne 'VMS') + { + unlink $object || return 0; + } + 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 +#{ +# local (@filenames) = @_; +# local ($now) = time; +# local ($file); +# +# foreach $file (@filenames) +# { +# utime ($now, $now, $file) +# || (open (TOUCHFD, ">> $file") && close (TOUCHFD)) +# || &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 +{ + local ($file); + + foreach $file (@_) { + (open(T, ">> $file") && print(T "\n") && close(T)) + || &error("Couldn't touch $file: $!\n", 1); + } +} + +# 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 +{ + local ($off) = shift; + local ($file); + + &touch(@_); + + local (@s) = stat($_[0]); + + utime($s[8]+$off, $s[9]+$off, @_); +} + +# open a file, write some stuff to it, and close it. + +sub create_file +{ + local ($filename, @lines) = @_; + + open (CF, "> $filename") || &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 +{ + local ($basedir, %dirtree) = @_; + local ($path); + + &remove_directory_tree ("$basedir"); + mkdir ($basedir, 0777) || &error ("Couldn't mkdir $basedir: $!\n", 1); + + foreach $path (sort keys (%dirtree)) + { + if ($dirtree {$path} =~ /^DIR$/) + { + mkdir ("$basedir/$path", 0777) + || &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") + || &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 +{ + local ($basedir, %dirtree) = @_; + local ($path); + local ($i); + local ($bogus) = 0; + local ($contents); + local ($target); + local ($fulltarget); + local ($found); + local (@files); + local (@allfiles); + + opendir (DIR, $basedir) || &error ("Couldn't open $basedir: $!\n", 1); + @allfiles = grep (!/^(\.\.?|CVS|RCS)$/, readdir (DIR) ); + closedir (DIR); + if ($debug) + { + print "dirtree: (%dirtree)\n$basedir: (@allfiles)\n"; + } + + foreach $path (sort keys (%dirtree)) + { + if ($debug) + { + print "Checking $path ($dirtree{$path}).\n"; + } + + $found = 0; + foreach $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") ) + { + @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 "*") + { + $contents = &read_file_into_string ("$basedir/$path"); + if ($contents ne "$1\n") + { + print "compare_dir_tree: $path contains wrong stuff." + . " Is:\n$contentsShould be:\n$1\n"; + $bogus = 1; + } + } + } + elsif ($dirtree {$path} =~ /^LINK:(.*)$/) + { + $target = $1; + if (!-l _) + { + print "compare_dir_tree: $path is not a link.\n"; + $bogus = 1; + next; + } + + $contents = readlink ("$basedir/$path"); + $contents =~ tr/>/\//; + $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 $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 +{ + local($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 +{ + local($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 +{ + local($no_increment) = @_; + + $num_of_tmpfiles += !$no_increment; + + return ($tmp_filename . &num_suffix ($num_of_tmpfiles)); +} + +1; diff --git a/variable.c b/variable.c new file mode 100644 index 0000000..01b6d89 --- /dev/null +++ b/variable.c @@ -0,0 +1,1772 @@ +/* Internals of variables for GNU Make. +Copyright (C) 1988-2014 Free 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" + +/* Chain of all pattern-specific variables. */ + +static struct pattern_var *pattern_vars; + +/* Pointer to the last struct in the pack of a specific size, from 1 to 255.*/ + +static struct pattern_var *last_pattern_vars[256]; + +/* Create a new pattern-specific variable struct. The new variable is + inserted into the PATTERN_VARS list in the shortest patterns first + order to support the shortest stem matching (the variables are + matched in the reverse order so the ones with the longest pattern + will be considered first). Variables with the same pattern length + are inserted in the definition order. */ + +struct pattern_var * +create_pattern_var (const char *target, const char *suffix) +{ + register unsigned int len = strlen (target); + register struct pattern_var *p = xmalloc (sizeof (struct pattern_var)); + + if (pattern_vars != 0) + { + if (len < 256 && last_pattern_vars[len] != 0) + { + p->next = last_pattern_vars[len]->next; + last_pattern_vars[len]->next = p; + } + else + { + /* Find the position where we can insert this variable. */ + register struct pattern_var **v; + + for (v = &pattern_vars; ; v = &(*v)->next) + { + /* Insert at the end of the pack so that patterns with the + same length appear in the order they were defined .*/ + + if (*v == 0 || (*v)->len > len) + { + p->next = *v; + *v = p; + break; + } + } + } + } + else + { + pattern_vars = p; + p->next = 0; + } + + p->target = target; + p->len = len; + p->suffix = suffix + 1; + + if (len < 256) + last_pattern_vars[len] = p; + + return p; +} + +/* Look up a target in the pattern-specific variable list. */ + +static struct pattern_var * +lookup_pattern_var (struct pattern_var *start, const char *target) +{ + struct pattern_var *p; + unsigned int targlen = strlen (target); + + for (p = start ? start->next : pattern_vars; p != 0; p = p->next) + { + const char *stem; + unsigned int stemlen; + + if (p->len > targlen) + /* It can't possibly match. */ + continue; + + /* From the lengths of the filename and the pattern parts, + find the stem: the part of the filename that matches the %. */ + stem = target + (p->suffix - p->target - 1); + stemlen = targlen - p->len + 1; + + /* Compare the text in the pattern before the stem, if any. */ + if (stem > target && !strneq (p->target, target, stem - target)) + continue; + + /* Compare the text in the pattern after the stem, if any. + We could test simply using streq, but this way we compare the + first two characters immediately. This saves time in the very + common case where the first character matches because it is a + period. */ + if (*p->suffix == stem[stemlen] + && (*p->suffix == '\0' || streq (&p->suffix[1], &stem[stemlen+1]))) + break; + } + + return p; +} + +/* 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, unsigned int length, + const char *value, enum variable_origin origin, + int recursive, struct variable_set *set, + const gmk_floc *flocp) +{ + struct variable *v; + struct variable **var_slot; + struct variable var_key; + + if (set == NULL) + set = &global_variable_set; + + var_key.name = (char *) name; + var_key.length = length; + var_slot = (struct variable **) hash_find_slot (&set->table, &var_key); + + 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; + + /* A variable of this name is already defined. + If the old definition is from a stronger source + than this one, don't redefine it. */ + if ((int) origin >= (int) v->origin) + { + free (v->value); + v->value = xstrdup (value); + if (flocp != 0) + v->fileinfo = *flocp; + else + v->fileinfo.filenm = 0; + v->origin = origin; + v->recursive = recursive; + } + return v; + } + + /* Create a new variable definition and add it to the hash table. */ + + v = xmalloc (sizeof (struct variable)); + v->name = xstrndup (name, length); + v->length = length; + hash_insert_at (&set->table, v, var_slot); + v->value = xstrdup (value); + if (flocp != 0) + v->fileinfo = *flocp; + else + v->fileinfo.filenm = 0; + v->origin = origin; + v->recursive = recursive; + v->special = 0; + v->expanding = 0; + v->exp_count = 0; + v->per_target = 0; + v->append = 0; + v->private_var = 0; + v->export = v_default; + + v->exportable = 1; + if (*name != '_' && (*name < 'A' || *name > 'Z') + && (*name < 'a' || *name > 'z')) + v->exportable = 0; + else + { + for (++name; *name != '\0'; ++name) + if (*name != '_' && (*name < 'a' || *name > 'z') + && (*name < 'A' || *name > 'Z') && !ISDIGIT(*name)) + break; + + if (*name != '\0') + v->exportable = 0; + } + + return v; +} + + +/* Undefine variable named NAME in SET. LENGTH is the length of NAME, which + does not need to be null-terminated. ORIGIN specifies the origin of the + variable (makefile, command line or environment). */ + +static void +free_variable_name_and_value (const void *item) +{ + struct variable *v = (struct variable *) item; + free (v->name); + free (v->value); +} + +void +free_variable_set (struct variable_set_list *list) +{ + hash_map (&list->set->table, free_variable_name_and_value); + hash_free (&list->set->table, 1); + free (list->set); + free (list); +} + +void +undefine_variable_in_set (const char *name, unsigned int length, + enum variable_origin origin, + struct variable_set *set) +{ + struct variable *v; + struct variable **var_slot; + struct variable var_key; + + if (set == NULL) + set = &global_variable_set; + + var_key.name = (char *) name; + var_key.length = length; + var_slot = (struct variable **) hash_find_slot (&set->table, &var_key); + + if (env_overrides && origin == o_env) + origin = o_env_override; + + v = *var_slot; + if (! HASH_VACANT (v)) + { + if (env_overrides && v->origin == o_env) + /* V came from in the environment. Since it was defined + before the switches were parsed, it wasn't affected by -e. */ + v->origin = o_env_override; + + /* If the definition is from a stronger source than this one, don't + undefine it. */ + if ((int) origin >= (int) v->origin) + { + hash_delete_at (&set->table, var_slot); + free_variable_name_and_value (v); + } + } +} + +/* 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_var_count = 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 (streq (var->name, ".VARIABLES") + && global_variable_set.table.ht_fill != last_var_count) + { + unsigned long max = EXPANSION_INCREMENT (strlen (var->value)); + unsigned long len; + char *p; + struct variable **vp = (struct variable **) global_variable_set.table.ht_vec; + struct variable **end = &vp[global_variable_set.table.ht_size]; + + /* Make sure we have at least MAX bytes in the allocated buffer. */ + var->value = xrealloc (var->value, max); + + /* Walk through the hash of variables, constructing a list of names. */ + p = var->value; + len = 0; + for (; vp < end; ++vp) + if (!HASH_VACANT (*vp)) + { + struct variable *v = *vp; + int l = v->length; + + len += l + 1; + if (len > max) + { + unsigned long off = p - var->value; + + max += EXPANSION_INCREMENT (l + 1); + var->value = xrealloc (var->value, max); + p = &var->value[off]; + } + + memcpy (p, v->name, l); + p += l; + *(p++) = ' '; + } + *(p-1) = '\0'; + + /* Remember how many variables are in our current count. Since we never + remove variables from the list, this is a reliable way to know whether + the list is up to date or needs to be recomputed. */ + + last_var_count = global_variable_set.table.ht_fill; + } + + 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, unsigned int length) +{ + const struct variable_set_list *setlist; + struct variable var_key; + int is_parent = 0; + + var_key.name = (char *) name; + var_key.length = length; + + for (setlist = current_variable_set_list; + setlist != 0; setlist = setlist->next) + { + const struct variable_set *set = setlist->set; + struct variable *v; + + v = (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key); + if (v && (!is_parent || !v->private_var)) + return v->special ? lookup_special_var (v) : v; + + is_parent |= setlist->next_is_parent; + } + +#ifdef VMS + /* since we don't read envp[] on startup, try to get the + variable via getenv() here. */ + { + 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, unsigned int length, + const struct variable_set *set) +{ + struct variable var_key; + + var_key.name = (char *) name; + var_key.length = length; + + return (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key); +} + +/* 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) +{ + register struct variable_set_list *setlist; + register struct variable_set *set; + + set = xmalloc (sizeof (struct variable_set)); + hash_init (&set->table, SMALL_SCOPE_VARIABLE_BUCKETS, + variable_hash_1, variable_hash_2, variable_hash_cmp); + + setlist = (struct variable_set_list *) + xmalloc (sizeof (struct variable_set_list)); + setlist->set = set; + setlist->next = current_variable_set_list; + setlist->next_is_parent = 0; + + return setlist; +} + +/* Create a new variable set and push it on the current setlist. + If we're pushing a global scope (that is, the current scope is the global + scope) then we need to "push" it the other way: file variable sets point + directly to the global_setlist so we need to replace that with the new one. + */ + +struct variable_set_list * +push_new_variable_scope (void) +{ + current_variable_set_list = create_new_variable_set (); + if (current_variable_set_list->next == &global_setlist) + { + /* It was the global, so instead of new -> &global we want to replace + &global with the new one and have &global -> new, with current still + pointing to &global */ + struct variable_set *set = current_variable_set_list->set; + current_variable_set_list->set = global_setlist.set; + global_setlist.set = set; + current_variable_set_list->next = global_setlist.next; + global_setlist.next = current_variable_set_list; + current_variable_set_list = &global_setlist; + } + return (current_variable_set_list); +} + +void +pop_variable_scope (void) +{ + struct variable_set_list *setlist; + struct variable_set *set; + + /* Can't call this if there's no scope to pop! */ + assert (current_variable_set_list->next != NULL); + + if (current_variable_set_list != &global_setlist) + { + /* We're not pointing to the global setlist, so pop this one. */ + setlist = current_variable_set_list; + set = setlist->set; + current_variable_set_list = setlist->next; + } + else + { + /* This set is the one in the global_setlist, but there is another global + set beyond that. We want to copy that set to global_setlist, then + delete what used to be in global_setlist. */ + setlist = global_setlist.next; + set = global_setlist.set; + global_setlist.set = setlist->set; + global_setlist.next = setlist->next; + global_setlist.next_is_parent = setlist->next_is_parent; + } + + /* Free the one we no longer need. */ + free (setlist); + hash_map (&set->table, free_variable_name_and_value); + hash_free (&set->table, 1); + free (set); +} + +/* 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; + + 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); + else + { + /* GKM FIXME: delete in from_set->table */ + free (from_var->value); + free (from_var); + } + } +} + +/* Merge SETLIST1 into SETLIST0, freeing unused storage in SETLIST1. */ + +void +merge_variable_set_lists (struct variable_set_list **setlist0, + struct variable_set_list *setlist1) +{ + struct variable_set_list *to = *setlist0; + struct variable_set_list *last0 = 0; + + /* If there's nothing to merge, stop now. */ + if (!setlist1) + return; + + /* This loop relies on the fact that all setlists terminate with the global + setlist (before NULL). If that's not true, arguably we SHOULD die. */ + if (to) + while (setlist1 != &global_setlist && to != &global_setlist) + { + struct variable_set_list *from = setlist1; + setlist1 = setlist1->next; + + merge_variable_sets (to->set, from->set); + + last0 = to; + to = to->next; + } + + if (setlist1 != &global_setlist) + { + if (last0 == 0) + *setlist0 = setlist1; + else + last0->next = setlist1; + } +} + +/* Define the automatic variables, and record the addresses + of their structures so we can change their values quickly. */ + +void +define_automatic_variables (void) +{ + extern const char* default_shell; + 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. */ + +#ifdef VMS + define_variable_cname ("@D", "$(dir $@)", o_automatic, 1); + define_variable_cname ("%D", "$(dir $%)", o_automatic, 1); + define_variable_cname ("*D", "$(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. */ + extern struct variable shell_var; + 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 = xstrdup (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. */ + +char * +shell_result (const char *p) +{ + char *buf; + unsigned int len; + char *args[2]; + char *result; + + install_variable_buffer (&buf, &len); + + args[0] = (char *) p; + args[1] = NULL; + variable_buffer_output (func_shell_base (variable_buffer, args, 0), "\0", 1); + result = strdup (variable_buffer); + + restore_variable_buffer (buf, len); + return result; +} + +/* 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 gmk_floc *flocp, const char *varname, + const char *value, enum variable_origin origin, + enum variable_flavor flavor, int target_var) +{ + const char *p; + char *alloc_value = NULL; + struct variable *v; + int append = 0; + int conditional = 0; + + /* Calculate the variable's new value in VALUE. */ + + switch (flavor) + { + default: + case f_bogus: + /* Should not be possible. */ + abort (); + case f_simple: + /* A simple variable definition "var := value". Expand the value. + We have to allocate memory since otherwise it'll clobber the + variable buffer, and we may still need that if we're looking at a + target-specific variable. */ + p = alloc_value = allocated_variable_expand (value); + break; + case f_shell: + { + /* A shell definition "var != value". Expand value, pass it to + the shell, and store the result in recursively-expanded var. */ + char *q = allocated_variable_expand (value); + p = alloc_value = shell_result (q); + free (q); + flavor = f_recursive; + break; + } + case f_conditional: + /* A conditional variable definition "var ?= value". + The value is set IFF the variable is not defined yet. */ + v = lookup_variable (varname, strlen (varname)); + if (v) + return v->special ? set_special_var (v) : v; + + conditional = 1; + flavor = f_recursive; + /* FALLTHROUGH */ + case f_recursive: + /* A recursive variable definition "var = value". + The value is used verbatim. */ + p = value; + break; + case f_append: + { + /* If we have += but we're in a target variable context, we want to + append only with other variables in the context of this target. */ + if (target_var) + { + append = 1; + v = lookup_variable_in_set (varname, strlen (varname), + current_variable_set_list->set); + + /* Don't append from the global set if a previous non-appending + target-specific variable definition exists. */ + if (v && !v->append) + append = 0; + } + else + v = lookup_variable (varname, strlen (varname)); + + if (v == 0) + { + /* There was no old value. + This becomes a normal recursive definition. */ + p = value; + flavor = f_recursive; + } + else + { + /* Paste the old and new values together in VALUE. */ + + unsigned int oldlen, vallen; + const char *val; + char *tp = NULL; + + val = value; + if (v->recursive) + /* The previous definition of the variable was recursive. + The new value is the unexpanded old and new values. */ + flavor = f_recursive; + else + /* The previous definition of the variable was simple. + The new value comes from the old value, which was expanded + when it was set; and from the expanded new value. Allocate + memory for the expansion as we may still need the rest of the + buffer if we're looking at a target-specific variable. */ + val = tp = allocated_variable_expand (val); + + oldlen = strlen (v->value); + vallen = strlen (val); + p = alloc_value = xmalloc (oldlen + 1 + vallen + 1); + memcpy (alloc_value, v->value, oldlen); + alloc_value[oldlen] = ' '; + memcpy (&alloc_value[oldlen + 1], val, vallen + 1); + + free (tp); + } + } + } + +#ifdef __MSDOS__ + /* Many Unix Makefiles include a line saying "SHELL=/bin/sh", but + non-Unix systems don't conform to this default configuration (in + fact, most of them don't even have '/bin'). On the other hand, + $SHELL in the environment, if set, points to the real pathname of + the shell. + Therefore, we generally won't let lines like "SHELL=/bin/sh" from + the Makefile override $SHELL from the environment. But first, we + look for the basename of the shell in the directory where SHELL= + points, and along the $PATH; if it is found in any of these places, + we define $SHELL to be the actual pathname of the shell. Thus, if + you have bash.exe installed as d:/unix/bash.exe, and d:/unix is on + your $PATH, then SHELL=/usr/local/bin/bash will have the effect of + defining SHELL to be "d:/unix/bash.exe". */ + if ((origin == o_file || origin == o_override) + && strcmp (varname, "SHELL") == 0) + { + PATH_VAR (shellpath); + extern char * __dosexec_find_on_path (const char *, char *[], char *); + + /* See if we can find "/bin/sh.exe", "/bin/sh.com", etc. */ + if (__dosexec_find_on_path (p, NULL, shellpath)) + { + char *tp; + + for (tp = shellpath; *tp; tp++) + if (*tp == '\\') + *tp = '/'; + + v = define_variable_loc (varname, strlen (varname), + shellpath, origin, flavor == f_recursive, + flocp); + } + else + { + const char *shellbase, *bslash; + struct variable *pathv = lookup_variable ("PATH", 4); + char *path_string; + char *fake_env[2]; + size_t pathlen = 0; + + shellbase = strrchr (p, '/'); + bslash = strrchr (p, '\\'); + if (!shellbase || bslash > shellbase) + shellbase = bslash; + if (!shellbase && p[1] == ':') + shellbase = p + 1; + if (shellbase) + shellbase++; + else + shellbase = p; + + /* Search for the basename of the shell (with standard + executable extensions) along the $PATH. */ + if (pathv) + pathlen = strlen (pathv->value); + path_string = xmalloc (5 + pathlen + 2 + 1); + /* On MSDOS, current directory is considered as part of $PATH. */ + sprintf (path_string, "PATH=.;%s", pathv ? pathv->value : ""); + fake_env[0] = path_string; + fake_env[1] = 0; + if (__dosexec_find_on_path (shellbase, fake_env, shellpath)) + { + char *tp; + + for (tp = shellpath; *tp; tp++) + if (*tp == '\\') + *tp = '/'; + + v = define_variable_loc (varname, strlen (varname), + shellpath, origin, + flavor == f_recursive, flocp); + } + else + v = lookup_variable (varname, strlen (varname)); + + free (path_string); + } + } + else +#endif /* __MSDOS__ */ +#ifdef WINDOWS32 + if ((origin == o_file || origin == o_override || origin == o_command) + && streq (varname, "SHELL")) + { + extern const char *default_shell; + + /* Call shell locator function. If it returns TRUE, then + set no_default_sh_exe to indicate sh was found and + set new value for SHELL variable. */ + + if (find_and_set_default_shell (p)) + { + v = define_variable_in_set (varname, strlen (varname), default_shell, + origin, flavor == f_recursive, + (target_var + ? current_variable_set_list->set + : NULL), + flocp); + no_default_sh_exe = 0; + } + else + { + char *tp = alloc_value; + + alloc_value = allocated_variable_expand (p); + + if (find_and_set_default_shell (alloc_value)) + { + v = define_variable_in_set (varname, strlen (varname), p, + origin, flavor == f_recursive, + (target_var + ? current_variable_set_list->set + : NULL), + flocp); + no_default_sh_exe = 0; + } + else + v = lookup_variable (varname, strlen (varname)); + + free (tp); + } + } + else +#endif + + /* If we are defining variables inside an $(eval ...), we might have a + different variable context pushed, not the global context (maybe we're + inside a $(call ...) or something. Since this function is only ever + invoked in places where we want to define globally visible variables, + make sure we define this variable in the global set. */ + + v = define_variable_in_set (varname, strlen (varname), p, + origin, flavor == f_recursive, + (target_var + ? current_variable_set_list->set : NULL), + flocp); + v->append = append; + v->conditional = conditional; + + free (alloc_value); + + return v->special ? set_special_var (v) : v; +} + +/* 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; + + p = 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; + int count; + c = *p++; + if (c == '(') + closeparen = ')'; + else if (c == '{') + closeparen = '}'; + 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. */ + count = 0; + for (; *p != '\0'; ++p) + { + if (*p == c) + ++count; + else if (*p == closeparen && --count < 0) + { + ++p; + break; + } + } + continue; + } + + /* If we find whitespace skip it, and remember we found it. */ + if (isblank ((unsigned char)c)) + { + wspace = 1; + e = p - 1; + p = next_token (p); + c = *p; + if (c == '\0') + return NULL; + ++p; + } + + + if (c == '=') + { + var->flavor = f_recursive; + if (! e) + e = p - 1; + break; + } + + /* Match assignment variants (:=, +=, ?=, !=) */ + if (*p == '=') + { + switch (c) + { + case ':': + var->flavor = f_simple; + break; + case '+': + var->flavor = f_append; + break; + case '?': + var->flavor = f_conditional; + break; + case '!': + var->flavor = f_shell; + break; + default: + /* If we skipped whitespace, non-assignments means no var. */ + if (wspace) + return NULL; + + /* Might be assignment, or might be $= or #=. Check. */ + continue; + } + if (! e) + e = p - 1; + ++p; + break; + } + + /* Check for POSIX ::= syntax */ + if (c == ':') + { + /* A colon other than :=/::= is not a variable defn. */ + if (*p != ':' || p[1] != '=') + return NULL; + + /* POSIX allows ::= to be the same as GNU make's := */ + var->flavor = f_simple; + if (! e) + e = p - 1; + p += 2; + break; + } + + /* If we skipped whitespace, non-assignments means no var. */ + if (wspace) + return NULL; + } + + var->length = e - var->name; + var->value = next_token (p); + return (char *)p; +} + +/* 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 gmk_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); + 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; + int rules = 0; + + for (p = pattern_vars; p != 0; p = p->next) + { + ++rules; + printf ("\n%s :\n", p->target); + print_variable (&p->variable, (void *)"# "); + } + + if (rules == 0) + puts (_("\n# No pattern-specific variable values.")); + else + printf (_("\n# %u pattern-specific variable values"), rules); + } +} + + +/* Print all the local variables of FILE. */ + +void +print_file_variables (const struct file *file) +{ + if (file->variables != 0) + print_variable_set (file->variables->set, "# ", 1); +} + +void +print_target_variables (const struct file *file) +{ + if (file->variables != 0) + { + int l = strlen (file->name); + char *t = alloca (l + 3); + + strcpy (t, file->name); + t[l] = ':'; + t[l+1] = ' '; + t[l+2] = '\0'; + + hash_map_arg (&file->variables->set->table, print_noauto_variable, t); + } +} + +#ifdef WINDOWS32 +void +sync_Path_environment (void) +{ + char *path = allocated_variable_expand ("$(PATH)"); + static char *environ_path = NULL; + + if (!path) + return; + + /* If done this before, free the previous entry before allocating new one. */ + free (environ_path); + + /* Create something WINDOWS32 world can grok. */ + convert_Path_to_windows32 (path, ';'); + environ_path = xstrdup (concat (3, "PATH", "=", path)); + putenv (environ_path); + free (path); +} +#endif diff --git a/variable.h b/variable.h new file mode 100644 index 0000000..fa2dbbd --- /dev/null +++ b/variable.h @@ -0,0 +1,236 @@ +/* Definitions for using variables in GNU Make. +Copyright (C) 1988-2014 Free 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 (!=) */ + }; + +/* 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; + unsigned int len; + struct variable variable; + }; + +extern char *variable_buffer; +extern struct variable_set_list *current_variable_set_list; +extern struct variable *default_goal_var; + +/* expand.c */ +char *variable_buffer_output (char *ptr, const char *string, unsigned int length); +char *variable_expand (const char *line); +char *variable_expand_for_file (const char *line, struct file *file); +char *allocated_variable_expand_for_file (const char *line, struct file *file); +#define allocated_variable_expand(line) \ + allocated_variable_expand_for_file (line, (struct file *) 0) +char *expand_argument (const char *str, const char *end); +char *variable_expand_string (char *line, const char *string, long length); +void install_variable_buffer (char **bufp, unsigned int *lenp); +void restore_variable_buffer (char *buf, unsigned int len); + +/* function.c */ +int handle_function (char **op, const char **stringp); +int pattern_matches (const char *pattern, const char *percent, const char *str); +char *subst_expand (char *o, const char *text, const char *subst, + const char *replace, unsigned int slen, unsigned int rlen, + int by_word); +char *patsubst_expand_pat (char *o, const char *text, const char *pattern, + const char *replace, const char *pattern_percent, + const char *replace_percent); +char *patsubst_expand (char *o, const char *text, char *pattern, char *replace); +char *func_shell_base (char *o, char **argv, int trim_newlines); + + +/* 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_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 gmk_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 gmk_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 gmk_floc *flocp, const char *name, + unsigned int min, unsigned int max, unsigned int flags, + gmk_func_ptr func); +struct variable *lookup_variable (const char *name, unsigned int length); +struct variable *lookup_variable_in_set (const char *name, unsigned int length, + const struct variable_set *set); + +struct variable *define_variable_in_set (const char *name, unsigned int length, + const char *value, + enum variable_origin origin, + int recursive, + struct variable_set *set, + const gmk_floc *flocp); + +/* Define a variable in the current variable set. */ + +#define define_variable(n,l,v,o,r) \ + define_variable_in_set((n),(l),(v),(o),(r),\ + current_variable_set_list->set,NILF) + +/* Define a variable with a constant name in the current variable set. */ + +#define define_variable_cname(n,v,o,r) \ + define_variable_in_set((n),(sizeof (n) - 1),(v),(o),(r),\ + current_variable_set_list->set,NILF) + +/* Define a variable with a location in the current variable set. */ + +#define define_variable_loc(n,l,v,o,r,f) \ + define_variable_in_set((n),(l),(v),(o),(r),\ + current_variable_set_list->set,(f)) + +/* Define a variable with a location in the global variable set. */ + +#define define_variable_global(n,l,v,o,r,f) \ + define_variable_in_set((n),(l),(v),(o),(r),NULL,(f)) + +/* Define a variable in FILE's variable set. */ + +#define define_variable_for_file(n,l,v,o,r,f) \ + define_variable_in_set((n),(l),(v),(o),(r),(f)->variables->set,NILF) + +void undefine_variable_in_set (const char *name, unsigned int length, + enum variable_origin origin, + struct variable_set *set); + +/* Remove variable from the current variable set. */ + +#define undefine_variable_global(n,l,o) \ + undefine_variable_in_set((n),(l),(o),NULL) + +/* Warn that NAME is an undefined variable. */ + +#define warn_undefined(n,l) do{\ + if (warn_undefined_variables_flag) \ + error (reading_file, (l), \ + _("warning: undefined variable '%.*s'"), \ + (int)(l), (n)); \ + }while(0) + +char **target_environment (struct file *file); + +struct pattern_var *create_pattern_var (const char *target, + const char *suffix); + +extern int export_all_variables; + +#define MAKELEVEL_NAME "MAKELEVEL" +#define MAKELEVEL_LENGTH (CSTRLEN (MAKELEVEL_NAME)) diff --git a/version.c b/version.c new file mode 100644 index 0000000..d94ecec --- /dev/null +++ b/version.c @@ -0,0 +1,33 @@ +/* Record version and build host architecture for GNU make. +Copyright (C) 1988-2014 Free 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/vmsdir.h b/vmsdir.h new file mode 100644 index 0000000..3be3f0c --- /dev/null +++ b/vmsdir.h @@ -0,0 +1,76 @@ +/* dirent.h for vms +Copyright (C) 1996-2014 Free 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/vmsfunctions.c b/vmsfunctions.c new file mode 100644 index 0000000..6ed136c --- /dev/null +++ b/vmsfunctions.c @@ -0,0 +1,226 @@ +/* VMS functions +Copyright (C) 1996-2014 Free 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/vmsify.c b/vmsify.c new file mode 100644 index 0000000..02bdbf5 --- /dev/null +++ b/vmsify.c @@ -0,0 +1,1005 @@ +/* vmsify.c -- Module for vms <-> unix file name conversion +Copyright (C) 1996-2014 Free 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 Kämpf (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/vmsjobs.c b/vmsjobs.c new file mode 100644 index 0000000..b11bca1 --- /dev/null +++ b/vmsjobs.c @@ -0,0 +1,928 @@ +/* --------------- Moved here from job.c --------------- + This file must be #included in job.c, as it accesses static functions. + +Copyright (C) 1996-2014 Free 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 + +char *vmsify (char *name, int type); + +static int vms_jobsefnmask = 0; + +/* 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; +} + +/* Set up IO redirection. */ + +static char * +vms_redirect (struct dsc$descriptor_s *desc, char *fname, char *ibuf) +{ + char *fptr; + char saved; + + ibuf++; + while (isspace ((unsigned char)*ibuf)) + ibuf++; + fptr = ibuf; + while (*ibuf && !isspace ((unsigned char)*ibuf)) + ibuf++; + saved = *ibuf; + *ibuf = 0; + if (strcmp (fptr, "/dev/null") != 0) + { + strcpy (fname, vmsify (fptr, 0)); + if (strchr (fname, '.') == 0) + strcat (fname, "."); + } + desc->dsc$w_length = strlen (fname); + desc->dsc$a_pointer = fname; + desc->dsc$b_dtype = DSC$K_DTYPE_T; + desc->dsc$b_class = DSC$K_CLASS_S; + + if (*fname == 0) + printf (_("Warning: Empty redirection\n")); + if (saved=='\0') + return ibuf; + *ibuf = saved; + return --ibuf; +} + + +/* found apostrophe at (p-1) + inc p until after closing apostrophe. +*/ + +static char * +vms_handle_apos (char *p) +{ + int alast; + alast = 0; + + while (*p != 0) + if (*p == '"') + if (alast) + { + alast = 0; + p++; + } + else + { + p++; + if (*p!='"') + break; + alast = 1; + } + else + p++; + + return p; +} + +static int ctrlYPressed= 0; +/* This is called at main or AST level. It is at AST level for DONTWAITFORCHILD + and at main level otherwise. In any case it is called when a child process + terminated. At AST level it won't get interrupted by anything except a + inner mode level AST. +*/ +static int +vmsHandleChildTerm(struct child *child) +{ + int exit_code; + register struct child *lastc, *c; + int child_failed; + + 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); + + child_failed = !(child->cstatus & 1); + 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 (child_failed && !c->noerror && !ignore_errors_flag) + { + /* The commands failed. Write an error message, + delete non-precious targets, and abort. */ + child_error (c, c->cstatus, 0, 0, 0); + c->file->update_status = us_failed; + delete_child_targets (c); + } + else + { + if (child_failed) + { + /* The commands failed, but we don't care. */ + child_error (c, c->cstatus, 0, 0, 1); + child_failed = 0; + } + +#if defined(RECURSIVEJOBS) /* I've had problems with recursive stuff and process handling */ + /* If there are more commands to run, try to start them. */ + start_job (c); + + switch (c->file->command_state) + { + case cs_running: + /* Successfully started. */ + break; + + case cs_finished: + if (c->file->update_status != us_success) + /* We failed to start the commands. */ + delete_child_targets (c); + break; + + default: + OS (error, NILF, + _("internal error: '%s' command_state"), c->file->name); + abort (); + break; + } +#endif /* RECURSIVEJOBS */ + } + + /* Set the state flag to say the commands have finished. */ + c->file->command_state = cs_finished; + notice_finished_file (c->file); + +#if defined(RECURSIVEJOBS) /* I've had problems with recursive stuff and process handling */ + /* Remove the child from the chain and free it. */ + if (lastc == 0) + children = c->next; + else + lastc->next = c->next; + free_child (c); +#endif /* RECURSIVEJOBS */ + + /* There is now another slot open. */ + if (job_slots_used > 0) + --job_slots_used; + + /* If the job failed, and the -k flag was not given, die. */ + if (child_failed && !keep_going_flag) + die (exit_code); + + (void) sigsetmask (sigblock (0) & ~(fatal_signal_mask)); + + return 1; +} + +/* VMS: + Spawn a process executing the command in ARGV and return its pid. */ + +#define MAXCMDLEN 200 + +/* 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) + 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; +} + +static int +nextnl(char *cmd, int l) +{ + int instring; + instring = 0; + while (cmd[l]) + { + if (cmd[l]=='"') + instring = !instring; + else if (cmd[l]=='\n' && !instring) + return ++l; + ++l; + } + return l; +} +int +child_execute_job (char *argv, struct child *child) +{ + int i; + static struct dsc$descriptor_s cmddsc; + static struct dsc$descriptor_s pnamedsc; + static struct dsc$descriptor_s ifiledsc; + static struct dsc$descriptor_s ofiledsc; + static struct dsc$descriptor_s efiledsc; + int have_redirection = 0; + int have_append = 0; + int have_newline = 0; + + int spflags = CLI$M_NOWAIT; + int status; + char *cmd = alloca (strlen (argv) + 512), *p, *q; + char ifile[256], ofile[256], efile[256]; + int comnamelen; + char procname[100]; + int in_string; + + /* Parse IO redirection. */ + + ifile[0] = 0; + ofile[0] = 0; + efile[0] = 0; + child->comname = NULL; + + DB (DB_JOBS, ("child_execute_job (%s)\n", argv)); + + while (isspace ((unsigned char)*argv)) + argv++; + + if (*argv == 0) + return 0; + + 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; + + in_string = 0; + /* 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. */ + for (p = argv, q = cmd; *p; p++, q++) + { + if (*p == '"') + in_string = !in_string; + if (in_string) + { + *q = *p; + continue; + } + switch (*p) + { + case '#': + *p-- = 0; + *q-- = 0; + break; + case '\\': + p++; + if (*p == '\n') + p++; + if (isspace ((unsigned char)*p)) + { + do { p++; } while (isspace ((unsigned char)*p)); + p--; + } + *q = *p; + break; + case '<': + if (have_newline==0) + { + p = vms_redirect (&ifiledsc, ifile, p); + *q = ' '; + have_redirection = 1; + } + else + *q = *p; + break; + case '>': + if (have_newline==0) + { + have_redirection = 1; + if (*(p-1) == '2') + { + q--; + if (strncmp (p, ">&1", 3) == 0) + { + p += 2; + strcpy (efile, "sys$output"); + efiledsc.dsc$w_length = strlen(efile); + efiledsc.dsc$a_pointer = efile; + efiledsc.dsc$b_dtype = DSC$K_DTYPE_T; + efiledsc.dsc$b_class = DSC$K_CLASS_S; + } + else + p = vms_redirect (&efiledsc, efile, p); + } + else + { + if (*(p+1) == '>') + { + have_append = 1; + p += 1; + } + p = vms_redirect (&ofiledsc, ofile, p); + } + *q = ' '; + } + else + *q = *p; + break; + case '\n': + have_newline++; + default: + *q = *p; + break; + } + } + *q = *p; + while (isspace ((unsigned char)*--q)) + *q = '\0'; + + +#define VMS_EMPTY_ECHO "write sys$output \"\"" + if (have_newline == 0) + { + /* multiple shells */ + if (strncmp(cmd, "builtin_", 8) == 0) + { + child->pid = 270163; + child->efn = 0; + child->cstatus = 1; + + DB(DB_JOBS, (_("BUILTIN [%s][%s]\n"), cmd, cmd + 8)); + + p = cmd + 8; + + if ((*(p) == 'c') && (*(p + 1) == 'd') + && ((*(p + 2) == ' ') || (*(p + 2) == '\t'))) + { + p += 3; + while ((*p == ' ') || (*p == '\t')) + p++; + DB(DB_JOBS, (_("BUILTIN CD %s\n"), p)); + if (chdir(p)) + return 0; + else + return 1; + } + else if ((*(p) == 'e') + && (*(p+1) == 'c') + && (*(p+2) == 'h') + && (*(p+3) == 'o') + && ((*(p+4) == ' ') || (*(p+4) == '\t') || (*(p+4) == '\0'))) + { + /* This is not a real builtin, it is a built in pre-processing + for the VMS/DCL echo (write sys$output) to ensure the to be echoed + string is correctly quoted (with the DCL quote character '"'). */ + char *vms_echo; + p += 4; + if (*p == '\0') + cmd = VMS_EMPTY_ECHO; + else + { + p++; + while ((*p == ' ') || (*p == '\t')) + p++; + if (*p == '\0') + cmd = VMS_EMPTY_ECHO; + else + { + vms_echo = alloca(strlen(p) + sizeof VMS_EMPTY_ECHO); + strcpy(vms_echo, VMS_EMPTY_ECHO); + vms_echo[sizeof VMS_EMPTY_ECHO - 2] = '\0'; + strcat(vms_echo, p); + strcat(vms_echo, "\""); + cmd = vms_echo; + } + } + DB (DB_JOBS, (_("BUILTIN ECHO %s->%s\n"), p, cmd)); + } + else + { + printf(_("Unknown builtin command '%s'\n"), cmd); + fflush(stdout); + return 0; + } + } + /* expand ':' aka 'do nothing' builtin for bash and friends */ + else if (cmd[0]==':' && cmd[1]=='\0') + { + cmd = "continue"; + } + } + else + { + /* todo: expand ':' aka 'do nothing' builtin for bash and friends */ + /* For 'one shell' expand all the + builtin_echo + to + write sys$output "" + where one is ......7 bytes longer. + At the same time ensure that the echo string is properly terminated. + For that, allocate a command buffer big enough for all possible expansions + (have_newline is the count), then expand, copy and terminate. */ + char *tmp_cmd; + int nloff = 0; + int vlen = 0; + int clen = 0; + int inecho; + + tmp_cmd = alloca(strlen(cmd) + (have_newline + 1) * 7 + 1); + tmp_cmd[0] = '\0'; + inecho = 0; + while (cmd[nloff]) + { + if (inecho) + { + if (clen < nloff - 1) + { + memcpy(&tmp_cmd[vlen], &cmd[clen], nloff - clen - 1); + vlen += nloff - clen - 1; + clen = nloff; + } + inecho = 0; + tmp_cmd[vlen] = '"'; + vlen++; + tmp_cmd[vlen] = '\n'; + vlen++; + } + if (strncmp(&cmd[nloff], "builtin_", 8) == 0) + { + /* ??? */ + child->pid = 270163; + child->efn = 0; + child->cstatus = 1; + + DB (DB_JOBS, (_("BUILTIN [%s][%s]\n"), &cmd[nloff], &cmd[nloff+8])); + p = &cmd[nloff + 8]; + if ((*(p) == 'e') + && (*(p + 1) == 'c') + && (*(p + 2) == 'h') + && (*(p + 3) == 'o') + && ((*(p + 4) == ' ') || (*(p + 4) == '\t') || (*(p + 4) == '\0'))) + { + if (clen < nloff - 1) + { + memcpy(&tmp_cmd[vlen], &cmd[clen], nloff - clen - 1); + vlen += nloff - clen - 1; + clen = nloff; + if (inecho) + { + inecho = 0; + tmp_cmd[vlen] = '"'; + vlen++; + } + tmp_cmd[vlen] = '\n'; + vlen++; + } + inecho = 1; + p += 4; + while ((*p == ' ') || (*p == '\t')) + p++; + clen = p - cmd; + memcpy(&tmp_cmd[vlen], VMS_EMPTY_ECHO, + sizeof VMS_EMPTY_ECHO - 2); + vlen += sizeof VMS_EMPTY_ECHO - 2; + } + else + { + printf (_("Builtin command is unknown or unsupported in .ONESHELL: '%s'\n"), &cmd[nloff]); + fflush(stdout); + return 0; + } + } + nloff = nextnl(cmd, nloff + 1); + } + if (clen < nloff) + { + memcpy(&tmp_cmd[vlen], &cmd[clen], nloff - clen); + vlen += nloff - clen; + clen = nloff; + if (inecho) + { + inecho = 0; + tmp_cmd[vlen] = '"'; + vlen++; + } + } + + tmp_cmd[vlen] = '\0'; + + cmd = tmp_cmd; + } + +#ifdef USE_DCL_COM_FILE + /* Enforce the creation of a command file. + Then all the make environment variables are written as DCL symbol + assignments into the command file as well, so that they are visible + in the sub-process but do not affect the current process. + 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. */ +#else + /* Create a *.com file if either the command is too long for + lib$spawn, or the command contains a newline, or if redirection + is desired. Forcing commands with newlines into DCLs allows to + store search lists on user mode logicals. */ + if (strlen (cmd) > MAXCMDLEN + || (have_redirection != 0) + || (have_newline != 0)) +#endif + { + FILE *outfile; + char c; + char *sep; + int alevel = 0; /* apostrophe level */ + int tmpstrlen; + char *tmpstr; + if (strlen (cmd) == 0) + { + printf (_("Error, empty command\n")); + fflush (stdout); + return 0; + } + + outfile = output_tmpfile (&child->comname, "sys$scratch:CMDXXXXXX.COM"); + /* 012345678901234567890 */ +#define TMP_OFFSET 12 +#define TMP_LEN 9 + if (outfile == 0) + pfatal_with_name (_("fopen (temporary file)")); + comnamelen = strlen (child->comname); + tmpstr = &child->comname[TMP_OFFSET]; + tmpstrlen = TMP_LEN; + /* 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, "$ %.*s_1 = \"''f$verify(0)'\"\n", tmpstrlen, tmpstr); + if (ifile[0]) + { + fprintf (outfile, "$ assign/user %s sys$input\n", ifile); + DB (DB_JOBS, (_("Redirected input from %s\n"), ifile)); + ifiledsc.dsc$w_length = 0; + } + + if (efile[0]) + { + fprintf (outfile, "$ define sys$error %s\n", efile); + DB (DB_JOBS, (_("Redirected error to %s\n"), efile)); + efiledsc.dsc$w_length = 0; + } + + if (ofile[0]) + if (have_append) + { + fprintf (outfile, "$ define sys$output %.*s\n", comnamelen-3, child->comname); + fprintf (outfile, "$ on error then $ goto %.*s\n", tmpstrlen, tmpstr); + DB (DB_JOBS, (_("Append output to %s\n"), ofile)); + ofiledsc.dsc$w_length = 0; + } + else + { + fprintf (outfile, "$ define sys$output %s\n", ofile); + DB (DB_JOBS, (_("Redirected output to %s\n"), ofile)); + ofiledsc.dsc$w_length = 0; + } +#ifdef USE_DCL_COM_FILE + /* Export the child environment into DCL symbols */ + if (child->environment != 0) + { + char **ep = child->environment; + char *valstr; + while (*ep != 0) + { + valstr = strchr(*ep, '='); + if (valstr == NULL) + continue; + fprintf(outfile, "$ %.*s=\"%s\"\n", valstr - *ep, *ep, + valstr + 1); + ep++; + } + } +#endif + fprintf (outfile, "$ %.*s_ = f$verify(%.*s_1)\n", tmpstrlen, tmpstr, tmpstrlen, tmpstr); + + /* TODO: give 78 a name! Whether 78 is a good number is another question. + Trim, split and write the command lines. + Splitting of a command is done after 78 output characters at an + appropriate place (after strings, after comma or space and + before slash): appending a hyphen indicates that the DCL command + is being continued. + Trimming is to skip any whitespace around - including - a + leading $ from the command to ensure writing exactly one "$ " + at the beginning of the line of the output file. Trimming is + done when a new command is seen, indicated by a '\n' (outside + of a string). + The buffer so far is written and reset, when a new command is + seen, when a split was done and at the end of the command. + Only for ONESHELL there will be several commands separated by + '\n'. But there can always be multiple continuation lines. */ + p = sep = q = cmd; + for (c = '\n'; c; c = *q++) + { + switch (c) + { + case '\n': + if (q > p) + { + fwrite(p, 1, q - p, outfile); + p = q; + } + fputc('$', outfile); + fputc(' ', outfile); + while (isspace((unsigned char) *p)) + p++; + if (*p == '$') + p++; + while (isspace((unsigned char) *p)) + p++; + q = sep = p; + break; + case '"': + q = vms_handle_apos(q); + sep = q; + break; + case ',': + case ' ': + sep = q; + break; + case '/': + case '\0': + sep = q - 1; + break; + default: + break; + } + if (sep - p > 78) + { + /* Enough stuff for a line. */ + fwrite(p, 1, sep - p, outfile); + p = sep; + if (*sep) + { + /* The command continues. */ + fputc('-', outfile); + } + fputc('\n', outfile); + } + } + + if (*p) + { + fwrite(p, 1, --q - p, outfile); + fputc('\n', outfile); + } + + if (have_append) + { + fprintf (outfile, "$ %.*s: ! 'f$verify(0)\n", tmpstrlen, tmpstr); + fprintf (outfile, "$ %.*s_2 = $status\n", tmpstrlen, tmpstr); + fprintf (outfile, "$ on error then $ exit\n"); + fprintf (outfile, "$ deassign sys$output\n"); + if (efile[0]) + fprintf (outfile, "$ deassign sys$error\n"); + fprintf (outfile, "$ append:=append\n"); + fprintf (outfile, "$ delete:=delete\n"); + fprintf (outfile, "$ append/new %.*s %s\n", comnamelen-3, child->comname, ofile); + fprintf (outfile, "$ delete %.*s;*\n", comnamelen-3, child->comname); + fprintf (outfile, "$ exit '%.*s_2 + (0*f$verify(%.*s_1))\n", tmpstrlen, tmpstr, tmpstrlen, tmpstr); + DB (DB_JOBS, (_("Append %.*s and cleanup\n"), comnamelen-3, child->comname)); + } + + fclose (outfile); + + sprintf (cmd, "$ @%s", child->comname); + + DB (DB_JOBS, (_("Executing %s instead\n"), cmd)); + } + + cmddsc.dsc$w_length = strlen(cmd); + cmddsc.dsc$a_pointer = cmd; + cmddsc.dsc$b_dtype = DSC$K_DTYPE_T; + cmddsc.dsc$b_class = DSC$K_CLASS_S; + + child->efn = 0; + while (child->efn < 32 || child->efn > 63) + { + status = lib$get_ef ((unsigned long *)&child->efn); + if (!(status & 1)) + { + if (child->comname) + { + if (!ISDB (DB_JOBS)) + unlink (child->comname); + free (child->comname); + } + return 0; + } + } + + sys$clref (child->efn); + + vms_jobsefnmask |= (1 << (child->efn - 32)); + + /* + 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(); + status = lib$spawn (&cmddsc, /* cmd-string */ + (ifiledsc.dsc$w_length == 0)?0:&ifiledsc, /* input-file */ + (ofiledsc.dsc$w_length == 0)?0:&ofiledsc, /* output-file */ + &spflags, /* flags */ + &pnamedsc, /* proc name */ + &child->pid, &child->cstatus, &child->efn, + 0, 0, + 0, 0, 0); + if (status & 1) + { + status= sys$waitfr (child->efn); + vmsHandleChildTerm(child); + } +#else + status = lib$spawn (&cmddsc, + (ifiledsc.dsc$w_length == 0)?0:&ifiledsc, + (ofiledsc.dsc$w_length == 0)?0:&ofiledsc, + &spflags, + &pnamedsc, + &child->pid, &child->cstatus, &child->efn, + vmsHandleChildTerm, child, + 0, 0, 0); +#endif + + if (!(status & 1)) + { + printf (_("Error spawning, %d\n") ,status); + fflush (stdout); + switch (status) + { + case 0x1c: + errno = EPROCLIM; + break; + default: + errno = EFAIL; + } + } + + return (status & 1); +} diff --git a/vpath.c b/vpath.c new file mode 100644 index 0000000..1bcba04 --- /dev/null +++ b/vpath.c @@ -0,0 +1,617 @@ +/* Implementation of pattern-matching file search paths for GNU Make. +Copyright (C) 1988-2014 Free 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. */ + unsigned int patlen;/* Length of the pattern. */ + const char **searchpath; /* Null-terminated list of directories. */ + unsigned int maxlen;/* Maximum length of any entry in the list. */ + }; + +/* Linked-list of all selective VPATHs. */ + +static struct vpath *vpaths; + +/* Structure for the general VPATH given in the variable. */ + +static struct vpath *general_vpath; + +/* Structure for GPATH given in the variable. */ + +static struct vpath *gpaths; + + +/* 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 () +{ + register struct vpath *new = 0; + register struct vpath *old, *nexto; + register char *p; + + /* Reverse the chain. */ + for (old = vpaths; old != 0; old = nexto) + { + nexto = old->next; + old->next = new; + new = old; + } + + vpaths = new; + + /* If there is a VPATH variable with a nonnull value, construct the + general VPATH list from it. We use variable_expand rather than just + calling lookup_variable so that it will be recursively expanded. */ + + { + /* Turn off --warn-undefined-variables while we expand SHELL and IFS. */ + int save = warn_undefined_variables_flag; + warn_undefined_variables_flag = 0; + + p = variable_expand ("$(strip $(VPATH))"); + + warn_undefined_variables_flag = save; + } + + if (*p != '\0') + { + /* Save the list of vpaths. */ + struct vpath *save_vpaths = vpaths; + char gp[] = "%"; + + /* Empty 'vpaths' so the new one will have no next, and 'vpaths' + will still be nil if P contains no existing directories. */ + vpaths = 0; + + /* Parse P. */ + construct_vpath_list (gp, p); + + /* Store the created path as the general path, + and restore the old list of vpaths. */ + general_vpath = vpaths; + vpaths = save_vpaths; + } + + /* If there is a GPATH variable with a nonnull value, construct the + GPATH list from it. We use variable_expand rather than just + calling lookup_variable so that it will be recursively expanded. */ + + { + /* Turn off --warn-undefined-variables while we expand SHELL and IFS. */ + int save = warn_undefined_variables_flag; + warn_undefined_variables_flag = 0; + + p = variable_expand ("$(strip $(GPATH))"); + + warn_undefined_variables_flag = save; + } + + if (*p != '\0') + { + /* Save the list of vpaths. */ + struct vpath *save_vpaths = vpaths; + char gp[] = "%"; + + /* Empty 'vpaths' so the new one will have no next, and 'vpaths' + will still be nil if P contains no existing directories. */ + vpaths = 0; + + /* Parse P. */ + construct_vpath_list (gp, p); + + /* Store the created path as the GPATH, + and restore the old list of vpaths. */ + gpaths = vpaths; + vpaths = save_vpaths; + } +} + +/* Construct the VPATH listing for the PATTERN and DIRPATH given. + + This function is called to generate selective VPATH lists and also for + the general VPATH list (which is in fact just a selective VPATH that + is applied to everything). The returned pointer is either put in the + linked list of all selective VPATH lists or in the GENERAL_VPATH + variable. + + If DIRPATH is nil, remove all previous listings with the same + pattern. If PATTERN is nil, remove all VPATH listings. Existing + and readable directories that are not "." given in the DIRPATH + separated by the path element separator (defined in makeint.h) are + loaded into the directory hash table if they are not there already + and put in the VPATH searchpath for the given pattern with trailing + slashes stripped off if present (and if the directory is not the + root, "/"). The length of the longest entry in the list is put in + the structure as well. The new entry will be at the head of the + VPATHS chain. */ + +void +construct_vpath_list (char *pattern, char *dirpath) +{ + unsigned int elem; + char *p; + const char **vpath; + unsigned int maxvpath; + unsigned int maxelem; + const char *percent = NULL; + + if (pattern != 0) + percent = find_percent (pattern); + + if (dirpath == 0) + { + /* Remove matching listings. */ + struct vpath *path, *lastpath; + + lastpath = 0; + path = vpaths; + while (path != 0) + { + struct vpath *next = path->next; + + if (pattern == 0 + || (((percent == 0 && path->percent == 0) + || (percent - pattern == path->percent - path->pattern)) + && streq (pattern, path->pattern))) + { + /* Remove it from the linked list. */ + if (lastpath == 0) + vpaths = path->next; + else + lastpath->next = next; + + /* Free its unused storage. */ + /* MSVC erroneously warns without a cast here. */ + free ((void *)path->searchpath); + free (path); + } + else + lastpath = path; + + path = next; + } + + return; + } + +#ifdef WINDOWS32 + convert_vpath_to_windows32 (dirpath, ';'); +#endif + + /* Skip over any initial separators and blanks. */ + while (*dirpath == PATH_SEPARATOR_CHAR || isblank ((unsigned char)*dirpath)) + ++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 (*p++ == PATH_SEPARATOR_CHAR || isblank ((unsigned char)*p)) + ++maxelem; + + vpath = xmalloc (maxelem * sizeof (const char *)); + maxvpath = 0; + + elem = 0; + p = dirpath; + while (*p != '\0') + { + char *v; + unsigned int len; + + /* Find the end of this entry. */ + v = p; + while (*p != '\0' +#if defined(HAVE_DOS_PATHS) && (PATH_SEPARATOR_CHAR == ':') + /* Platforms whose PATH_SEPARATOR_CHAR is ':' and which + also define HAVE_DOS_PATHS would like us to recognize + colons after the drive letter in the likes of + "D:/foo/bar:C:/xyzzy". */ + && (*p != PATH_SEPARATOR_CHAR + || (p == v + 1 && (p[1] == '/' || p[1] == '\\'))) +#else + && *p != PATH_SEPARATOR_CHAR +#endif + && !isblank ((unsigned char)*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 (*p == PATH_SEPARATOR_CHAR || isblank ((unsigned char)*p)) + ++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, unsigned int len) +{ + if (gpaths && (len <= gpaths->maxlen)) + { + const char **gp; + for (gp = gpaths->searchpath; *gp != NULL; ++gp) + if (strneq (*gp, file, len) && (*gp)[len] == '\0') + return 1; + } + + return 0; +} + + +/* Search the given VPATH list for a directory where the name pointed to by + FILE exists. If it is found, we return a cached name of the existing file + and set *MTIME_PTR (if MTIME_PTR is not NULL) to its modtime (or zero if no + stat call was done). Also set the matching directory index in PATH_INDEX + if it is not NULL. Otherwise we return NULL. */ + +static const char * +selective_vpath_search (struct vpath *path, const char *file, + FILE_TIMESTAMP *mtime_ptr, unsigned int* path_index) +{ + int not_target; + char *name; + const char *n; + const char *filename; + const char **vpath = path->searchpath; + unsigned int maxvpath = path->maxlen; + unsigned int i; + unsigned int flen, name_dplen; + int exists = 0; + + /* Find out if *FILE is a target. + If and only if it is NOT a target, we will accept prospective + files that don't exist but are mentioned in a makefile. */ + { + struct file *f = lookup_file (file); + not_target = f == 0 || !f->is_target; + } + + flen = strlen (file); + + /* Split *FILE into a directory prefix and a name-within-directory. + NAME_DPLEN gets the length of the prefix; FILENAME gets the pointer to + the name-within-directory and FLEN is its length. */ + + n = strrchr (file, '/'); +#ifdef HAVE_DOS_PATHS + /* We need the rightmost slash or backslash. */ + { + const char *bslash = strrchr (file, '\\'); + if (!n || bslash > n) + n = bslash; + } +#endif + name_dplen = n != 0 ? n - file : 0; + filename = name_dplen > 0 ? n + 1 : file; + if (name_dplen > 0) + flen -= name_dplen + 1; + + /* Get enough space for the biggest VPATH entry, a slash, the directory + prefix that came with FILE, another slash (although this one may not + always be necessary), the filename, and a null terminator. */ + name = alloca (maxvpath + 1 + name_dplen + 1 + flen + 1); + + /* Try each VPATH entry. */ + for (i = 0; vpath[i] != 0; ++i) + { + int exists_in_cache = 0; + char *p = name; + unsigned int vlen = strlen (vpath[i]); + + /* Put the next VPATH entry into NAME at P and increment P past it. */ + memcpy (p, vpath[i], vlen); + p += vlen; + + /* Add the directory prefix already in *FILE. */ + if (name_dplen > 0) + { +#ifndef VMS + *p++ = '/'; +#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 +#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 + exists_in_cache = exists = dir_file_exists_p (vpath[i], filename); +#else + /* 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); +#endif + } + + 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 = '/'; +#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) + { + register unsigned int i; + + ++nvpaths; + + printf ("vpath %s ", v->pattern); + + for (i = 0; v->searchpath[i] != 0; ++i) + printf ("%s%c", v->searchpath[i], + v->searchpath[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR); + } + + if (vpaths == 0) + puts (_("# No 'vpath' search paths.")); + else + printf (_("\n# %u 'vpath' search paths.\n"), nvpaths); + + if (general_vpath == 0) + puts (_("\n# No general ('VPATH' variable) search path.")); + else + { + const char **path = general_vpath->searchpath; + unsigned int i; + + fputs (_("\n# General ('VPATH' variable) search path:\n# "), stdout); + + for (i = 0; path[i] != 0; ++i) + printf ("%s%c", path[i], + path[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR); + } +} diff --git a/w32/Makefile.am b/w32/Makefile.am new file mode 100644 index 0000000..a2c4063 --- /dev/null +++ b/w32/Makefile.am @@ -0,0 +1,25 @@ +# Makefile.am to create libw32.a for mingw32 host. +# Copyright (C) 1997-2014 Free 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 = subdir-objects + +noinst_LIBRARIES = libw32.a + +libw32_a_SOURCES = subproc/misc.c subproc/sub_proc.c subproc/w32err.c \ + compat/posixfcn.c pathstuff.c + +libw32_a_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/subproc -I$(top_srcdir) diff --git a/w32/Makefile.in b/w32/Makefile.in new file mode 100644 index 0000000..4760541 --- /dev/null +++ b/w32/Makefile.in @@ -0,0 +1,696 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile.am to create libw32.a for mingw32 host. +# Copyright (C) 1997-2014 Free 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = w32 +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/config/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/intlmacosx.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libw32_a_AR = $(AR) $(ARFLAGS) +libw32_a_LIBADD = +am__dirstamp = $(am__leading_dot)dirstamp +am_libw32_a_OBJECTS = subproc/libw32_a-misc.$(OBJEXT) \ + subproc/libw32_a-sub_proc.$(OBJEXT) \ + subproc/libw32_a-w32err.$(OBJEXT) \ + compat/libw32_a-posixfcn.$(OBJEXT) \ + libw32_a-pathstuff.$(OBJEXT) +libw32_a_OBJECTS = $(am_libw32_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libw32_a_SOURCES) +DIST_SOURCES = $(libw32_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLOBINC = @GLOBINC@ +GLOBLIB = @GLOBLIB@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GUILE_CFLAGS = @GUILE_CFLAGS@ +GUILE_LIBS = @GUILE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +KMEM_GROUP = @KMEM_GROUP@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_HOST = @MAKE_HOST@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEED_SETGID = @NEED_SETGID@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +REMOTE = @REMOTE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +noinst_LIBRARIES = libw32.a +libw32_a_SOURCES = subproc/misc.c subproc/sub_proc.c subproc/w32err.c \ + compat/posixfcn.c pathstuff.c + +libw32_a_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/subproc -I$(top_srcdir) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign w32/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign w32/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +subproc/$(am__dirstamp): + @$(MKDIR_P) subproc + @: > subproc/$(am__dirstamp) +subproc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) subproc/$(DEPDIR) + @: > subproc/$(DEPDIR)/$(am__dirstamp) +subproc/libw32_a-misc.$(OBJEXT): subproc/$(am__dirstamp) \ + subproc/$(DEPDIR)/$(am__dirstamp) +subproc/libw32_a-sub_proc.$(OBJEXT): subproc/$(am__dirstamp) \ + subproc/$(DEPDIR)/$(am__dirstamp) +subproc/libw32_a-w32err.$(OBJEXT): subproc/$(am__dirstamp) \ + subproc/$(DEPDIR)/$(am__dirstamp) +compat/$(am__dirstamp): + @$(MKDIR_P) compat + @: > compat/$(am__dirstamp) +compat/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) compat/$(DEPDIR) + @: > compat/$(DEPDIR)/$(am__dirstamp) +compat/libw32_a-posixfcn.$(OBJEXT): compat/$(am__dirstamp) \ + compat/$(DEPDIR)/$(am__dirstamp) + +libw32.a: $(libw32_a_OBJECTS) $(libw32_a_DEPENDENCIES) $(EXTRA_libw32_a_DEPENDENCIES) + $(AM_V_at)-rm -f libw32.a + $(AM_V_AR)$(libw32_a_AR) libw32.a $(libw32_a_OBJECTS) $(libw32_a_LIBADD) + $(AM_V_at)$(RANLIB) libw32.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f compat/*.$(OBJEXT) + -rm -f subproc/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libw32_a-pathstuff.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/libw32_a-posixfcn.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@subproc/$(DEPDIR)/libw32_a-misc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@subproc/$(DEPDIR)/libw32_a-sub_proc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@subproc/$(DEPDIR)/libw32_a-w32err.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +subproc/libw32_a-misc.o: subproc/misc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-misc.o -MD -MP -MF subproc/$(DEPDIR)/libw32_a-misc.Tpo -c -o subproc/libw32_a-misc.o `test -f 'subproc/misc.c' || echo '$(srcdir)/'`subproc/misc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-misc.Tpo subproc/$(DEPDIR)/libw32_a-misc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subproc/misc.c' object='subproc/libw32_a-misc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-misc.o `test -f 'subproc/misc.c' || echo '$(srcdir)/'`subproc/misc.c + +subproc/libw32_a-misc.obj: subproc/misc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-misc.obj -MD -MP -MF subproc/$(DEPDIR)/libw32_a-misc.Tpo -c -o subproc/libw32_a-misc.obj `if test -f 'subproc/misc.c'; then $(CYGPATH_W) 'subproc/misc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/misc.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-misc.Tpo subproc/$(DEPDIR)/libw32_a-misc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subproc/misc.c' object='subproc/libw32_a-misc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-misc.obj `if test -f 'subproc/misc.c'; then $(CYGPATH_W) 'subproc/misc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/misc.c'; fi` + +subproc/libw32_a-sub_proc.o: subproc/sub_proc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-sub_proc.o -MD -MP -MF subproc/$(DEPDIR)/libw32_a-sub_proc.Tpo -c -o subproc/libw32_a-sub_proc.o `test -f 'subproc/sub_proc.c' || echo '$(srcdir)/'`subproc/sub_proc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-sub_proc.Tpo subproc/$(DEPDIR)/libw32_a-sub_proc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subproc/sub_proc.c' object='subproc/libw32_a-sub_proc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-sub_proc.o `test -f 'subproc/sub_proc.c' || echo '$(srcdir)/'`subproc/sub_proc.c + +subproc/libw32_a-sub_proc.obj: subproc/sub_proc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-sub_proc.obj -MD -MP -MF subproc/$(DEPDIR)/libw32_a-sub_proc.Tpo -c -o subproc/libw32_a-sub_proc.obj `if test -f 'subproc/sub_proc.c'; then $(CYGPATH_W) 'subproc/sub_proc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/sub_proc.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-sub_proc.Tpo subproc/$(DEPDIR)/libw32_a-sub_proc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subproc/sub_proc.c' object='subproc/libw32_a-sub_proc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-sub_proc.obj `if test -f 'subproc/sub_proc.c'; then $(CYGPATH_W) 'subproc/sub_proc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/sub_proc.c'; fi` + +subproc/libw32_a-w32err.o: subproc/w32err.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-w32err.o -MD -MP -MF subproc/$(DEPDIR)/libw32_a-w32err.Tpo -c -o subproc/libw32_a-w32err.o `test -f 'subproc/w32err.c' || echo '$(srcdir)/'`subproc/w32err.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-w32err.Tpo subproc/$(DEPDIR)/libw32_a-w32err.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subproc/w32err.c' object='subproc/libw32_a-w32err.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-w32err.o `test -f 'subproc/w32err.c' || echo '$(srcdir)/'`subproc/w32err.c + +subproc/libw32_a-w32err.obj: subproc/w32err.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-w32err.obj -MD -MP -MF subproc/$(DEPDIR)/libw32_a-w32err.Tpo -c -o subproc/libw32_a-w32err.obj `if test -f 'subproc/w32err.c'; then $(CYGPATH_W) 'subproc/w32err.c'; else $(CYGPATH_W) '$(srcdir)/subproc/w32err.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-w32err.Tpo subproc/$(DEPDIR)/libw32_a-w32err.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subproc/w32err.c' object='subproc/libw32_a-w32err.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-w32err.obj `if test -f 'subproc/w32err.c'; then $(CYGPATH_W) 'subproc/w32err.c'; else $(CYGPATH_W) '$(srcdir)/subproc/w32err.c'; fi` + +compat/libw32_a-posixfcn.o: compat/posixfcn.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT compat/libw32_a-posixfcn.o -MD -MP -MF compat/$(DEPDIR)/libw32_a-posixfcn.Tpo -c -o compat/libw32_a-posixfcn.o `test -f 'compat/posixfcn.c' || echo '$(srcdir)/'`compat/posixfcn.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/libw32_a-posixfcn.Tpo compat/$(DEPDIR)/libw32_a-posixfcn.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/posixfcn.c' object='compat/libw32_a-posixfcn.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o compat/libw32_a-posixfcn.o `test -f 'compat/posixfcn.c' || echo '$(srcdir)/'`compat/posixfcn.c + +compat/libw32_a-posixfcn.obj: compat/posixfcn.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT compat/libw32_a-posixfcn.obj -MD -MP -MF compat/$(DEPDIR)/libw32_a-posixfcn.Tpo -c -o compat/libw32_a-posixfcn.obj `if test -f 'compat/posixfcn.c'; then $(CYGPATH_W) 'compat/posixfcn.c'; else $(CYGPATH_W) '$(srcdir)/compat/posixfcn.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/libw32_a-posixfcn.Tpo compat/$(DEPDIR)/libw32_a-posixfcn.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/posixfcn.c' object='compat/libw32_a-posixfcn.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o compat/libw32_a-posixfcn.obj `if test -f 'compat/posixfcn.c'; then $(CYGPATH_W) 'compat/posixfcn.c'; else $(CYGPATH_W) '$(srcdir)/compat/posixfcn.c'; fi` + +libw32_a-pathstuff.o: pathstuff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-pathstuff.o -MD -MP -MF $(DEPDIR)/libw32_a-pathstuff.Tpo -c -o libw32_a-pathstuff.o `test -f 'pathstuff.c' || echo '$(srcdir)/'`pathstuff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libw32_a-pathstuff.Tpo $(DEPDIR)/libw32_a-pathstuff.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pathstuff.c' object='libw32_a-pathstuff.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-pathstuff.o `test -f 'pathstuff.c' || echo '$(srcdir)/'`pathstuff.c + +libw32_a-pathstuff.obj: pathstuff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-pathstuff.obj -MD -MP -MF $(DEPDIR)/libw32_a-pathstuff.Tpo -c -o libw32_a-pathstuff.obj `if test -f 'pathstuff.c'; then $(CYGPATH_W) 'pathstuff.c'; else $(CYGPATH_W) '$(srcdir)/pathstuff.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libw32_a-pathstuff.Tpo $(DEPDIR)/libw32_a-pathstuff.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pathstuff.c' object='libw32_a-pathstuff.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-pathstuff.obj `if test -f 'pathstuff.c'; then $(CYGPATH_W) 'pathstuff.c'; else $(CYGPATH_W) '$(srcdir)/pathstuff.c'; fi` + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f compat/$(DEPDIR)/$(am__dirstamp) + -rm -f compat/$(am__dirstamp) + -rm -f subproc/$(DEPDIR)/$(am__dirstamp) + -rm -f subproc/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) compat/$(DEPDIR) subproc/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) compat/$(DEPDIR) subproc/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/w32/compat/dirent.c b/w32/compat/dirent.c new file mode 100644 index 0000000..56407dd --- /dev/null +++ b/w32/compat/dirent.c @@ -0,0 +1,206 @@ +/* Directory entry code for Window platforms. +Copyright (C) 1996-2014 Free 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; + int nBufferLen; + + /* sanity checks */ + if (!pDirName) { + errno = EINVAL; + return NULL; + } + if (stat(pDirName, &sb) != 0) { + errno = ENOENT; + return NULL; + } + if ((sb.st_mode & S_IFMT) != S_IFDIR) { + errno = ENOTDIR; + return NULL; + } + + /* allocate a DIR structure to return */ + pDir = (DIR *) malloc(sizeof (DIR)); + + if (!pDir) + return NULL; + + /* input directory name length */ + nBufferLen = strlen(pDirName); + + /* copy input directory name to DIR buffer */ + strcpy(pDir->dir_pDirectoryName, pDirName); + + /* point to end of the copied directory name */ + pEndDirName = &pDir->dir_pDirectoryName[nBufferLen - 1]; + + /* if directory name did not end in '/' or '\', add '/' */ + if ((*pEndDirName != '/') && (*pEndDirName != '\\')) { + pEndDirName++; + *pEndDirName = '/'; + } + + /* now append the wildcard character to the buffer */ + pEndDirName++; + *pEndDirName = '*'; + pEndDirName++; + *pEndDirName = '\0'; + + /* other values defaulted */ + pDir->dir_nNumFiles = 0; + pDir->dir_hDirHandle = INVALID_HANDLE_VALUE; + pDir->dir_ulCookie = __DIRENT_COOKIE; + + return pDir; +} + +void +closedir(DIR *pDir) +{ + /* got a valid pointer? */ + if (!pDir) { + errno = EINVAL; + return; + } + + /* sanity check that this is a DIR pointer */ + if (pDir->dir_ulCookie != __DIRENT_COOKIE) { + errno = EINVAL; + return; + } + + /* close the WINDOWS32 directory handle */ + if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE) + FindClose(pDir->dir_hDirHandle); + + free(pDir); + + return; +} + +struct dirent * +readdir(DIR* pDir) +{ + WIN32_FIND_DATA wfdFindData; + + if (!pDir) { + errno = EINVAL; + return NULL; + } + + /* sanity check that this is a DIR pointer */ + if (pDir->dir_ulCookie != __DIRENT_COOKIE) { + errno = EINVAL; + return NULL; + } + + if (pDir->dir_nNumFiles == 0) { + pDir->dir_hDirHandle = FindFirstFile(pDir->dir_pDirectoryName, &wfdFindData); + if (pDir->dir_hDirHandle == INVALID_HANDLE_VALUE) + return NULL; + } else if (!FindNextFile(pDir->dir_hDirHandle, &wfdFindData)) + return NULL; + + /* bump count for next call to readdir() or telldir() */ + pDir->dir_nNumFiles++; + + /* fill in struct dirent values */ + pDir->dir_sdReturn.d_ino = (ino_t)-1; + strcpy(pDir->dir_sdReturn.d_name, wfdFindData.cFileName); + + return &pDir->dir_sdReturn; +} + +void +rewinddir(DIR* pDir) +{ + if (!pDir) { + errno = EINVAL; + return; + } + + /* sanity check that this is a DIR pointer */ + if (pDir->dir_ulCookie != __DIRENT_COOKIE) { + errno = EINVAL; + return; + } + + /* close the WINDOWS32 directory handle */ + if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE) + if (!FindClose(pDir->dir_hDirHandle)) + errno = EBADF; + + /* reset members which control readdir() */ + pDir->dir_hDirHandle = INVALID_HANDLE_VALUE; + pDir->dir_nNumFiles = 0; + + return; +} + +int +telldir(DIR* pDir) +{ + if (!pDir) { + errno = EINVAL; + return -1; + } + + /* sanity check that this is a DIR pointer */ + if (pDir->dir_ulCookie != __DIRENT_COOKIE) { + errno = EINVAL; + return -1; + } + + /* return number of times readdir() called */ + return pDir->dir_nNumFiles; +} + +void +seekdir(DIR* pDir, long nPosition) +{ + if (!pDir) + return; + + /* sanity check that this is a DIR pointer */ + if (pDir->dir_ulCookie != __DIRENT_COOKIE) + return; + + /* go back to beginning of directory */ + rewinddir(pDir); + + /* loop until we have found position we care about */ + for (--nPosition; nPosition && readdir(pDir); nPosition--); + + /* flag invalid nPosition value */ + if (nPosition) + errno = EINVAL; + + return; +} diff --git a/w32/compat/posixfcn.c b/w32/compat/posixfcn.c new file mode 100644 index 0000000..b366399 --- /dev/null +++ b/w32/compat/posixfcn.c @@ -0,0 +1,486 @@ +/* Replacements for Posix functions and Posix functionality for MS-Windows. + +Copyright (C) 2013-2014 Free 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/w32/include/dirent.h b/w32/include/dirent.h new file mode 100644 index 0000000..13308de --- /dev/null +++ b/w32/include/dirent.h @@ -0,0 +1,59 @@ +/* Windows version of dirent.h +Copyright (C) 1996-2014 Free 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 + + +struct dirent +{ + ino_t d_ino; /* unused - no equivalent on WINDOWS32 */ + char d_name[NAME_MAX+1]; +}; + +typedef struct dir_struct { + ULONG dir_ulCookie; + HANDLE dir_hDirHandle; + DWORD dir_nNumFiles; + char dir_pDirectoryName[NAME_MAX+1]; + struct dirent dir_sdReturn; +} DIR; + +DIR *opendir(const char *); +struct dirent *readdir(DIR *); +void rewinddir(DIR *); +void closedir(DIR *); +int telldir(DIR *); +void seekdir(DIR *, long); + +#endif /* !__MINGW32__ */ +#endif diff --git a/w32/include/dlfcn.h b/w32/include/dlfcn.h new file mode 100644 index 0000000..c64ac7b --- /dev/null +++ b/w32/include/dlfcn.h @@ -0,0 +1,29 @@ +/* dlfcn.h replacement for MS-Windows build. +Copyright (C) 2013-2014 Free 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/w32/include/pathstuff.h b/w32/include/pathstuff.h new file mode 100644 index 0000000..fb03f12 --- /dev/null +++ b/w32/include/pathstuff.h @@ -0,0 +1,25 @@ +/* Definitions for Windows path manipulation. +Copyright (C) 1996-2014 Free 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/w32/include/sub_proc.h b/w32/include/sub_proc.h new file mode 100644 index 0000000..1e1b213 --- /dev/null +++ b/w32/include/sub_proc.h @@ -0,0 +1,71 @@ +/* Definitions for Windows process invocation. +Copyright (C) 1996-2014 Free 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(int process_used_slots, (VOID_DECL)); + +/* support routines */ +EXTERN_DECL(long process_errno, (HANDLE proc)); +EXTERN_DECL(long process_last_err, (HANDLE proc)); +EXTERN_DECL(long process_exit_code, (HANDLE proc)); +EXTERN_DECL(long process_signal, (HANDLE proc)); +EXTERN_DECL(char * process_outbuf, (HANDLE proc)); +EXTERN_DECL(char * process_errbuf, (HANDLE proc)); +EXTERN_DECL(int process_outcnt, (HANDLE proc)); +EXTERN_DECL(int process_errcnt, (HANDLE proc)); +EXTERN_DECL(void process_pipes, (HANDLE proc, int pipes[3])); +EXTERN_DECL(void process_noinherit, (int fildes)); + +/* jobserver routines */ +EXTERN_DECL(int open_jobserver_semaphore, (const char* name)); +EXTERN_DECL(int create_jobserver_semaphore, (int tokens)); +EXTERN_DECL(void free_jobserver_semaphore, (VOID_DECL)); +EXTERN_DECL(int acquire_jobserver_semaphore, (VOID_DECL)); +EXTERN_DECL(int release_jobserver_semaphore, (VOID_DECL)); +EXTERN_DECL(int has_jobserver_semaphore, (VOID_DECL)); +EXTERN_DECL(char* get_jobserver_semaphore_name, (VOID_DECL)); +EXTERN_DECL(int wait_for_semaphore_or_child_process, (VOID_DECL)); + +#endif diff --git a/w32/include/w32err.h b/w32/include/w32err.h new file mode 100644 index 0000000..7d72226 --- /dev/null +++ b/w32/include/w32err.h @@ -0,0 +1,26 @@ +/* Definitions for Windows error handling. +Copyright (C) 1996-2014 Free 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/w32/pathstuff.c b/w32/pathstuff.c new file mode 100644 index 0000000..55332ab --- /dev/null +++ b/w32/pathstuff.c @@ -0,0 +1,266 @@ +/* Path conversion for Windows pathnames. +Copyright (C) 1996-2014 Free 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, ":;"))) { + /* found one to count, handle drive letter */ + *etok = to_delim; + p = ++etok; + } else + /* all finished, force abort */ + p += strlen(p); + } else if (*p == '"') { /* a quoted directory */ + for (p++; *p && *p != '"'; p++) /* skip quoted part */ + ; + etok = strpbrk(p, ":;"); /* find next delimiter */ + if (etok) { + *etok = to_delim; + p = ++etok; + } else + p += strlen(p); + } else { + /* found another one, no drive letter */ + *etok = to_delim; + p = ++etok; + } + + return Path; +} + +/* + * Convert to forward slashes. Resolve to full pathname optionally + */ +char * +w32ify(const char *filename, int resolve) +{ + static char w32_path[FILENAME_MAX]; + char *p; + + if (resolve) + _fullpath(w32_path, filename, sizeof (w32_path)); + else + strncpy(w32_path, filename, sizeof (w32_path)); + + for (p = w32_path; p && *p; p++) + if (*p == '\\') + *p = '/'; + + return w32_path; +} + +char * +getcwd_fs(char* buf, int len) +{ + char *p = getcwd(buf, len); + + if (p) { + char *q = w32ify(buf, 0); + strncpy(buf, q, len); + } + + return p; +} + +#ifdef unused +/* + * Convert delimiter separated pathnames (e.g. PATH) or single file pathname + * (e.g. c:/foo, c:\bar) to NutC format. If we are handed a string that + * _NutPathToNutc() fails to convert, just return the path we were handed + * and assume the caller will know what to do with it (It was probably + * a mistake to try and convert it anyway due to some of the bizarre things + * that might look like pathnames in makefiles). + */ +char * +convert_path_to_nutc(char *path) +{ + int count; /* count of path elements */ + char *nutc_path; /* new NutC path */ + int nutc_path_len; /* length of buffer to allocate for new path */ + char *pathp; /* pointer to nutc_path used to build it */ + char *etok; /* token separator for old path */ + char *p; /* points to element of old path */ + char sep; /* what flavor of separator used in old path */ + char *rval; + + /* is this a multi-element path ? */ + for (p = path, etok = strpbrk(p, ":;"), count = 0; + etok; + etok = strpbrk(p, ":;")) + if ((etok - p) == 1) { + if (*(etok - 1) == ';' || + *(etok - 1) == ':') { + p = ++etok; + continue; /* ignore empty bucket */ + } else if (etok = strpbrk(etok+1, ":;")) + /* found one to count, handle drive letter */ + p = ++etok, count++; + else + /* all finished, force abort */ + p += strlen(p); + } else + /* found another one, no drive letter */ + p = ++etok, count++; + + if (count) { + count++; /* x1;x2;x3 <- need to count x3 */ + + /* + * Hazard a guess on how big the buffer needs to be. + * We have to convert things like c:/foo to /c=/foo. + */ + nutc_path_len = strlen(path) + (count*2) + 1; + nutc_path = xmalloc(nutc_path_len); + pathp = nutc_path; + *pathp = '\0'; + + /* + * Loop through PATH and convert one elemnt of the path at at + * a time. Single file pathnames will fail this and fall + * to the logic below loop. + */ + for (p = path, etok = strpbrk(p, ":;"); + etok; + etok = strpbrk(p, ":;")) { + + /* don't trip up on device specifiers or empty path slots */ + if ((etok - p) == 1) + if (*(etok - 1) == ';' || + *(etok - 1) == ':') { + p = ++etok; + continue; + } else if ((etok = strpbrk(etok+1, ":;")) == NULL) + break; /* thing found was a WINDOWS32 pathname */ + + /* save separator */ + sep = *etok; + + /* terminate the current path element -- temporarily */ + *etok = '\0'; + +#ifdef __NUTC__ + /* convert to NutC format */ + if (_NutPathToNutc(p, pathp, 0) == FALSE) { + free(nutc_path); + rval = savestring(path, strlen(path)); + return rval; + } +#else + *pathp++ = '/'; + *pathp++ = p[0]; + *pathp++ = '='; + *pathp++ = '/'; + strcpy(pathp, &p[2]); +#endif + + pathp += strlen(pathp); + *pathp++ = ':'; /* use Unix style path separtor for new path */ + *pathp = '\0'; /* make sure we are null terminaed */ + + /* restore path separator */ + *etok = sep; + + /* point p to first char of next path element */ + p = ++etok; + + } + } else { + nutc_path_len = strlen(path) + 3; + nutc_path = xmalloc(nutc_path_len); + pathp = nutc_path; + *pathp = '\0'; + p = path; + } + + /* + * OK, here we handle the last element in PATH (e.g. c of a;b;c) + * or the path was a single filename and will be converted + * here. Note, testing p here assures that we don't trip up + * on paths like a;b; which have trailing delimiter followed by + * nothing. + */ + if (*p != '\0') { +#ifdef __NUTC__ + if (_NutPathToNutc(p, pathp, 0) == FALSE) { + free(nutc_path); + rval = savestring(path, strlen(path)); + return rval; + } +#else + *pathp++ = '/'; + *pathp++ = p[0]; + *pathp++ = '='; + *pathp++ = '/'; + strcpy(pathp, &p[2]); +#endif + } else + *(pathp-1) = '\0'; /* we're already done, don't leave trailing : */ + + rval = savestring(nutc_path, strlen(nutc_path)); + free(nutc_path); + return rval; +} + +#endif diff --git a/w32/subproc/NMakefile b/w32/subproc/NMakefile new file mode 100644 index 0000000..ebf516d --- /dev/null +++ b/w32/subproc/NMakefile @@ -0,0 +1,60 @@ +# NOTE: If you have no 'make' program at all to process this makefile, run +# 'build.bat' instead. +# +# Copyright (C) 1996-2014 Free 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 . + +# +# NMakefile for GNU Make (subproc library) +# +LIB = lib +CC = cl +MAKE = nmake + +OUTDIR=. +MAKEFILE=NMakefile + +CFLAGS_any = /nologo /MT /W4 /GX /Z7 /YX /D WIN32 /D WINDOWS32 /D _WINDOWS -I. -I../include -I../../ +CFLAGS_debug = $(CFLAGS_any) /Od /D _DEBUG /FR.\WinDebug\ /Fp.\WinDebug\subproc.pch /Fo.\WinDebug/ +CFLAGS_release = $(CFLAGS_any) /O2 /FR.\WinRel\ /Fp.\WinRel\subproc.pch /Fo.\WinRel/ + +all: Release Debug + +Release: + $(MAKE) /f $(MAKEFILE) OUTDIR=WinRel CFLAGS="$(CFLAGS_release)" WinRel/subproc.lib +Debug: + $(MAKE) /f $(MAKEFILE) OUTDIR=WinDebug CFLAGS="$(CFLAGS_debug)" WinDebug/subproc.lib + +clean: + rmdir /s /q WinRel WinDebug + erase *.pdb + +$(OUTDIR): + if not exist .\$@\nul mkdir .\$@ + +OBJS = $(OUTDIR)/misc.obj $(OUTDIR)/w32err.obj $(OUTDIR)/sub_proc.obj + +$(OUTDIR)/subproc.lib: $(OUTDIR) $(OBJS) + $(LIB) -out:$@ @<< + $(OBJS) +<< + +.c{$(OUTDIR)}.obj: + $(CC) $(CFLAGS) /c $< + +$(OUTDIR)/misc.obj: misc.c proc.h +$(OUTDIR)/sub_proc.obj: sub_proc.c ../include/sub_proc.h ../include/w32err.h proc.h +$(OUTDIR)/w32err.obj: w32err.c ../include/w32err.h diff --git a/w32/subproc/build.bat b/w32/subproc/build.bat new file mode 100644 index 0000000..f8604ce --- /dev/null +++ b/w32/subproc/build.bat @@ -0,0 +1,34 @@ +@if "%COMPILER%" == "gcc" GoTo GCCBuild +if not exist .\WinDebug\nul mkdir .\WinDebug +cl.exe /nologo /MT /W4 /GX /Z7 /YX /Od /I .. /I . /I ../include /I ../.. /D WIN32 /D WINDOWS32 /D _DEBUG /D _WINDOWS /FR.\WinDebug/ /Fp.\WinDebug/subproc.pch /Fo.\WinDebug/ /c misc.c +cl.exe /nologo /MT /W4 /GX /Z7 /YX /Od /I .. /I . /I ../include /I ../.. /D WIN32 /D WINDOWS32 /D _DEBUG /D _WINDOWS /FR.\WinDebug/ /Fp.\WinDebug/subproc.pch /Fo.\WinDebug/ /c sub_proc.c +cl.exe /nologo /MT /W4 /GX /Z7 /YX /Od /I .. /I . /I ../include /I ../.. /D WIN32 /D WINDOWS32 /D _DEBUG /D _WINDOWS /FR.\WinDebug/ /Fp.\WinDebug/subproc.pch /Fo.\WinDebug/ /c w32err.c +lib.exe /NOLOGO /OUT:.\WinDebug\subproc.lib .\WinDebug/misc.obj .\WinDebug/sub_proc.obj .\WinDebug/w32err.obj +if not exist .\WinRel\nul mkdir .\WinRel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I .. /I . /I ../include /I ../.. /D WIN32 /D WINDOWS32 /D NDEBUG /D _WINDOWS /FR.\WinRel/ /Fp.\WinRel/subproc.pch /Fo.\WinRel/ /c misc.c +cl.exe /nologo /MT /W4 /GX /YX /O2 /I .. /I . /I ../include /I ../.. /D WIN32 /D WINDOWS32 /D NDEBUG /D _WINDOWS /FR.\WinRel/ /Fp.\WinRel/subproc.pch /Fo.\WinRel/ /c sub_proc.c +cl.exe /nologo /MT /W4 /GX /YX /O2 /I .. /I . /I ../include /I ../.. /D WIN32 /D WINDOWS32 /D NDEBUG /D _WINDOWS /FR.\WinRel/ /Fp.\WinRel/subproc.pch /Fo.\WinRel/ /c w32err.c +lib.exe /NOLOGO /OUT:.\WinRel\subproc.lib .\WinRel/misc.obj .\WinRel/sub_proc.obj .\WinRel/w32err.obj +GoTo BuildEnd +:GCCBuild +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I.. -I. -I../include -I../.. -DWINDOWS32 -c misc.c -o ../../w32_misc.o +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I.. -I. -I../include -I../.. -DWINDOWS32 -c sub_proc.c -o ../../sub_proc.o +gcc -mthreads -Wall -gdwarf-2 -g3 %OPT% -I.. -I. -I../include -I../.. -DWINDOWS32 -c w32err.c -o ../../w32err.o +:BuildEnd + +@echo off +rem Copyright (C) 1996-2014 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 . diff --git a/w32/subproc/misc.c b/w32/subproc/misc.c new file mode 100644 index 0000000..3f3bdf8 --- /dev/null +++ b/w32/subproc/misc.c @@ -0,0 +1,83 @@ +/* Process handling for Windows +Copyright (C) 1996-2014 Free 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, int *envsize_needed) +{ + char **tmp; + int size_needed; + int arrcnt; + char *ptr; + + arrcnt = 0; + while (arr[arrcnt]) { + arrcnt++; + } + + tmp = (char**) calloc(arrcnt + 1, sizeof(char *)); + if (!tmp) { + return FALSE; + } + + arrcnt = 0; + size_needed = *envsize_needed = 0; + while (arr[arrcnt]) { + tmp[arrcnt] = arr[arrcnt]; + size_needed += strlen(arr[arrcnt]) + 1; + arrcnt++; + } + size_needed++; + *envsize_needed = size_needed; + + qsort((void *) tmp, (size_t) arrcnt, sizeof (char*), compare); + + ptr = *envblk_out = calloc(size_needed, 1); + if (!ptr) { + free(tmp); + return FALSE; + } + + arrcnt = 0; + while (tmp[arrcnt]) { + strcpy(ptr, tmp[arrcnt]); + ptr += strlen(tmp[arrcnt]) + 1; + arrcnt++; + } + + free(tmp); + return TRUE; +} diff --git a/w32/subproc/proc.h b/w32/subproc/proc.h new file mode 100644 index 0000000..1e4054c --- /dev/null +++ b/w32/subproc/proc.h @@ -0,0 +1,29 @@ +/* Definitions for Windows +Copyright (C) 1996-2014 Free 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, int *envsize_needed); + +#endif diff --git a/w32/subproc/sub_proc.c b/w32/subproc/sub_proc.c new file mode 100644 index 0000000..5496c7e --- /dev/null +++ b/w32/subproc/sub_proc.c @@ -0,0 +1,1561 @@ +/* Process handling for Windows. +Copyright (C) 1996-2014 Free 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 /* 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" + +static char *make_command_line(char *shell_name, char *exec_path, char **argv); + +typedef struct sub_process_t { + intptr_t sv_stdin[2]; + intptr_t sv_stdout[2]; + intptr_t sv_stderr[2]; + int using_pipes; + char *inp; + DWORD incnt; + char * volatile outp; + volatile DWORD outcnt; + char * volatile errp; + volatile DWORD errcnt; + pid_t pid; + int exit_code; + int signal; + long last_err; + long lerrno; +} sub_process; + +/* keep track of children so we can implement a waitpid-like routine */ +static sub_process *proc_array[MAXIMUM_WAIT_OBJECTS]; +static int proc_index = 0; +static int fake_exits_pending = 0; + +/* Windows jobserver implementation variables */ +static char jobserver_semaphore_name[MAX_PATH + 1]; +static HANDLE jobserver_semaphore = NULL; + +/* Open existing jobserver semaphore */ +int open_jobserver_semaphore(const char* name) +{ + jobserver_semaphore = OpenSemaphore( + SEMAPHORE_ALL_ACCESS, // Semaphore access setting + FALSE, // Child processes DON'T inherit + name); // Semaphore name + + if (jobserver_semaphore == NULL) + return 0; + + return 1; +} + +/* Create new jobserver semaphore */ +int create_jobserver_semaphore(int tokens) +{ + sprintf(jobserver_semaphore_name, "gmake_semaphore_%d", _getpid()); + + jobserver_semaphore = CreateSemaphore( + NULL, // Use default security descriptor + tokens, // Initial count + tokens, // Maximum count + jobserver_semaphore_name); // Semaphore name + + if (jobserver_semaphore == NULL) + return 0; + + return 1; +} + +/* Close jobserver semaphore */ +void free_jobserver_semaphore() +{ + if (jobserver_semaphore != NULL) + { + CloseHandle(jobserver_semaphore); + jobserver_semaphore = NULL; + } +} + +/* Decrement semaphore count */ +int acquire_jobserver_semaphore() +{ + DWORD dwEvent = WaitForSingleObject( + jobserver_semaphore, // Handle to semaphore + 0); // DON'T wait on semaphore + + return (dwEvent == WAIT_OBJECT_0); +} + +/* Increment semaphore count */ +int release_jobserver_semaphore() +{ + BOOL bResult = ReleaseSemaphore( + jobserver_semaphore, // handle to semaphore + 1, // increase count by one + NULL); // not interested in previous count + + return (bResult); +} + +int has_jobserver_semaphore() +{ + return (jobserver_semaphore != NULL); +} + +char* get_jobserver_semaphore_name() +{ + return (jobserver_semaphore_name); +} + +/* Wait for either the jobserver semaphore to become signalled or one of our + * child processes to terminate. + */ +int wait_for_semaphore_or_child_process() +{ + HANDLE handles[MAXIMUM_WAIT_OBJECTS]; + DWORD dwHandleCount = 1; + DWORD dwEvent; + int i; + + /* Add jobserver semaphore to first slot. */ + handles[0] = jobserver_semaphore; + + /* 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[dwHandleCount++] = (HANDLE) proc_array[i]->pid; + } + + dwEvent = WaitForMultipleObjects( + dwHandleCount, // number of objects in array + handles, // array of objects + FALSE, // wait for any object + INFINITE); // wait until object is signalled + + switch(dwEvent) + { + case WAIT_FAILED: + return -1; + + case WAIT_OBJECT_0: + /* Indicate that the semaphore was signalled */ + return 1; + + default: + /* Assume that one or more of the child processes terminated. */ + return 0; + } +} + +/* + * When a process has been waited for, adjust the wait state + * array so that we don't wait for it again + */ +static void +process_adjust_wait_state(sub_process* pproc) +{ + int i; + + if (!proc_index) + return; + + for (i = 0; i < proc_index; i++) + if (proc_array[i]->pid == pproc->pid) + break; + + if (i < proc_index) { + proc_index--; + if (i != proc_index) + memmove(&proc_array[i], &proc_array[i+1], + (proc_index-i) * sizeof(sub_process*)); + proc_array[proc_index] = NULL; + } +} + +/* + * Waits for any of the registered child processes to finish. + */ +static sub_process * +process_wait_for_any_private(int block, DWORD* pdwWaitStatus) +{ + HANDLE handles[MAXIMUM_WAIT_OBJECTS]; + DWORD retval, which; + int i; + + if (!proc_index) + return NULL; + + /* build array of handles to wait for */ + for (i = 0; i < proc_index; i++) { + handles[i] = (HANDLE) proc_array[i]->pid; + + if (fake_exits_pending && proc_array[i]->exit_code) + break; + } + + /* wait for someone to exit */ + if (!fake_exits_pending) { + retval = WaitForMultipleObjects(proc_index, handles, FALSE, (block ? INFINITE : 0)); + which = retval - WAIT_OBJECT_0; + } else { + fake_exits_pending--; + retval = !WAIT_FAILED; + which = i; + } + + /* If the pointer is not NULL, set the wait status result variable. */ + if (pdwWaitStatus) + *pdwWaitStatus = retval; + + /* return pointer to process */ + if ((retval == WAIT_TIMEOUT) || (retval == WAIT_FAILED)) { + return NULL; + } + else { + sub_process* pproc = proc_array[which]; + process_adjust_wait_state(pproc); + return pproc; + } +} + +/* + * Terminate a process. + */ +BOOL +process_kill(HANDLE proc, int signal) +{ + sub_process* pproc = (sub_process*) proc; + pproc->signal = signal; + return (TerminateProcess((HANDLE) pproc->pid, signal)); +} + +/* + * Use this function to register processes you wish to wait for by + * calling process_file_io(NULL) or process_wait_any(). This must be done + * because it is possible for callers of this library to reuse the same + * handle for multiple processes launches :-( + */ +void +process_register(HANDLE proc) +{ + if (proc_index < MAXIMUM_WAIT_OBJECTS) + proc_array[proc_index++] = (sub_process *) proc; +} + +/* + * Return the number of processes that we are still waiting for. + */ +int +process_used_slots(void) +{ + return proc_index; +} + +/* + * Public function which works kind of like waitpid(). Wait for any + * of the children to die and return results. To call this function, + * you must do 1 of things: + * + * x = process_easy(...); + * + * or + * + * x = process_init_fd(); + * process_register(x); + * + * or + * + * x = process_init(); + * process_register(x); + * + * You must NOT then call process_pipe_io() because this function is + * not capable of handling automatic notification of any child + * death. + */ + +HANDLE +process_wait_for_any(int block, DWORD* pdwWaitStatus) +{ + sub_process* pproc = process_wait_for_any_private(block, pdwWaitStatus); + + if (!pproc) + return NULL; + else { + /* + * Ouch! can't tell caller if this fails directly. Caller + * will have to use process_last_err() + */ + (void) process_file_io(pproc); + return ((HANDLE) pproc); + } +} + +long +process_signal(HANDLE proc) +{ + if (proc == INVALID_HANDLE_VALUE) return 0; + return (((sub_process *)proc)->signal); +} + +long +process_last_err(HANDLE proc) +{ + if (proc == INVALID_HANDLE_VALUE) return ERROR_INVALID_HANDLE; + return (((sub_process *)proc)->last_err); +} + +long +process_exit_code(HANDLE proc) +{ + if (proc == INVALID_HANDLE_VALUE) return EXIT_FAILURE; + return (((sub_process *)proc)->exit_code); +} + +void +process_noinherit(int fd) +{ + HANDLE fh = (HANDLE)_get_osfhandle(fd); + + if (fh && fh != INVALID_HANDLE_VALUE) + SetHandleInformation(fh, HANDLE_FLAG_INHERIT, 0); +} + +/* +2006-02: +All the following functions are currently unused. +All of them would crash gmake if called with argument INVALID_HANDLE_VALUE. +Hence whoever wants to use one of this functions must invent and implement +a reasonable error handling for this function. + +char * +process_outbuf(HANDLE proc) +{ + return (((sub_process *)proc)->outp); +} + +char * +process_errbuf(HANDLE proc) +{ + return (((sub_process *)proc)->errp); +} + +int +process_outcnt(HANDLE proc) +{ + return (((sub_process *)proc)->outcnt); +} + +int +process_errcnt(HANDLE proc) +{ + return (((sub_process *)proc)->errcnt); +} + +void +process_pipes(HANDLE proc, int pipes[3]) +{ + pipes[0] = ((sub_process *)proc)->sv_stdin[0]; + pipes[1] = ((sub_process *)proc)->sv_stdout[0]; + pipes[2] = ((sub_process *)proc)->sv_stderr[0]; + return; +} +*/ + + HANDLE +process_init() +{ + sub_process *pproc; + /* + * open file descriptors for attaching stdin/stdout/sterr + */ + HANDLE stdin_pipes[2]; + HANDLE stdout_pipes[2]; + HANDLE stderr_pipes[2]; + SECURITY_ATTRIBUTES inherit; + BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH]; + + pproc = malloc(sizeof(*pproc)); + memset(pproc, 0, sizeof(*pproc)); + + /* We can't use NULL for lpSecurityDescriptor because that + uses the default security descriptor of the calling process. + Instead we use a security descriptor with no DACL. This + allows nonrestricted access to the associated objects. */ + + if (!InitializeSecurityDescriptor((PSECURITY_DESCRIPTOR)(&sd), + SECURITY_DESCRIPTOR_REVISION)) { + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + return((HANDLE)pproc); + } + + inherit.nLength = sizeof(inherit); + inherit.lpSecurityDescriptor = (PSECURITY_DESCRIPTOR)(&sd); + inherit.bInheritHandle = TRUE; + + // By convention, parent gets pipe[0], and child gets pipe[1] + // This means the READ side of stdin pipe goes into pipe[1] + // and the WRITE side of the stdout and stderr pipes go into pipe[1] + if (CreatePipe( &stdin_pipes[1], &stdin_pipes[0], &inherit, 0) == FALSE || + CreatePipe( &stdout_pipes[0], &stdout_pipes[1], &inherit, 0) == FALSE || + CreatePipe( &stderr_pipes[0], &stderr_pipes[1], &inherit, 0) == FALSE) { + + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + return((HANDLE)pproc); + } + + // + // Mark the parent sides of the pipes as non-inheritable + // + if (SetHandleInformation(stdin_pipes[0], + HANDLE_FLAG_INHERIT, 0) == FALSE || + SetHandleInformation(stdout_pipes[0], + HANDLE_FLAG_INHERIT, 0) == FALSE || + SetHandleInformation(stderr_pipes[0], + HANDLE_FLAG_INHERIT, 0) == FALSE) { + + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + return((HANDLE)pproc); + } + pproc->sv_stdin[0] = (intptr_t) stdin_pipes[0]; + pproc->sv_stdin[1] = (intptr_t) stdin_pipes[1]; + pproc->sv_stdout[0] = (intptr_t) stdout_pipes[0]; + pproc->sv_stdout[1] = (intptr_t) stdout_pipes[1]; + pproc->sv_stderr[0] = (intptr_t) stderr_pipes[0]; + pproc->sv_stderr[1] = (intptr_t) stderr_pipes[1]; + + pproc->using_pipes = 1; + + pproc->lerrno = 0; + + return((HANDLE)pproc); +} + + + HANDLE +process_init_fd(HANDLE stdinh, HANDLE stdouth, HANDLE stderrh) +{ + sub_process *pproc; + + pproc = malloc(sizeof(*pproc)); + if (pproc) { + memset(pproc, 0, sizeof(*pproc)); + + /* + * Just pass the provided file handles to the 'child + * side' of the pipe, bypassing pipes altogether. + */ + pproc->sv_stdin[1] = (intptr_t) stdinh; + pproc->sv_stdout[1] = (intptr_t) stdouth; + pproc->sv_stderr[1] = (intptr_t) stderrh; + + pproc->last_err = pproc->lerrno = 0; + } + + return((HANDLE)pproc); +} + + +static HANDLE +find_file(const char *exec_path, const char *path_var, + char *full_fname, DWORD full_len) +{ + HANDLE exec_handle; + char *fname; + char *ext; + DWORD req_len; + int i; + static const char *extensions[] = + /* Should .com come before no-extension case? */ + { ".exe", ".cmd", ".bat", "", ".com", NULL }; + + fname = xmalloc(strlen(exec_path) + 5); + strcpy(fname, exec_path); + ext = fname + strlen(fname); + + for (i = 0; extensions[i]; i++) { + strcpy(ext, extensions[i]); + if (((req_len = SearchPath (path_var, fname, NULL, full_len, + full_fname, NULL)) > 0 + /* For compatibility with previous code, which + used OpenFile, and with Windows operation in + general, also look in various default + locations, such as Windows directory and + Windows System directory. Warning: this also + searches PATH in the Make's environment, which + might not be what the Makefile wants, but it + seems to be OK as a fallback, after the + previous SearchPath failed to find on child's + PATH. */ + || (req_len = SearchPath (NULL, fname, NULL, full_len, + full_fname, NULL)) > 0) + && req_len <= full_len + && (exec_handle = + CreateFile(full_fname, + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL)) != INVALID_HANDLE_VALUE) { + free(fname); + return(exec_handle); + } + } + + free(fname); + return INVALID_HANDLE_VALUE; +} + +/* + * Return non-zero of FNAME specifies a batch file and its name + * includes embedded whitespace. + */ + +static int +batch_file_with_spaces(const char *fname) +{ + size_t fnlen = strlen(fname); + + return (fnlen > 4 + && (_strnicmp(fname + fnlen - 4, ".bat", 4) == 0 + || _strnicmp(fname + fnlen - 4, ".cmd", 4) == 0) + /* The set of characters in the 2nd arg to strpbrk + should be the same one used by make_command_line + below to decide whether an argv[] element needs + quoting. */ + && strpbrk(fname, " \t") != NULL); +} + + +/* + * Description: Create the child process to be helped + * + * Returns: success <=> 0 + * + * Notes/Dependencies: + */ +long +process_begin( + HANDLE proc, + char **argv, + char **envp, + char *exec_path, + char *as_user) +{ + sub_process *pproc = (sub_process *)proc; + char *shell_name = 0; + int file_not_found=0; + HANDLE exec_handle; + char exec_fname[MAX_PATH]; + const char *path_var = NULL; + char **ep; + char buf[MAX_PATH]; + DWORD bytes_returned; + DWORD flags; + char *command_line; + STARTUPINFO startInfo; + PROCESS_INFORMATION procInfo; + char *envblk=NULL; + int envsize_needed = 0; + int pass_null_exec_path = 0; + + /* + * Shell script detection... if the exec_path starts with #! then + * we want to exec shell-script-name exec-path, not just exec-path + * NT doesn't recognize #!/bin/sh or #!/etc/Tivoli/bin/perl. We do not + * hard-code the path to the shell or perl or whatever: Instead, we + * assume it's in the path somewhere (generally, the NT tools + * bin directory) + */ + + /* Use the Makefile's value of PATH to look for the program to + execute, because it could be different from Make's PATH + (e.g., if the target sets its own value. */ + if (envp) + for (ep = envp; *ep; ep++) { + if (strncmp (*ep, "PATH=", 5) == 0 + || strncmp (*ep, "Path=", 5) == 0) { + path_var = *ep + 5; + break; + } + } + exec_handle = find_file(exec_path, path_var, + exec_fname, sizeof(exec_fname)); + + /* + * If we couldn't open the file, just assume that Windows will be + * somehow able to find and execute it. If the first character + * of the command is '/', assume they set SHELL to a Unixy shell + * that have some magic mounts known only to it, and run the whole + * command via $SHELL -c "COMMAND" instead. + */ + if (exec_handle == INVALID_HANDLE_VALUE) { + if (exec_path[0] == '/') { + char *new_argv0; + char **argvi = argv; + int arglen = 0; + + strcpy(buf, variable_expand ("$(SHELL)")); + shell_name = &buf[0]; + strcpy(exec_fname, "-c"); + /* Construct a single command string in argv[0]. */ + while (*argvi) { + arglen += strlen(*argvi) + 1; + argvi++; + } + new_argv0 = xmalloc(arglen + 1); + new_argv0[0] = '\0'; + for (argvi = argv; *argvi; argvi++) { + strcat(new_argv0, *argvi); + strcat(new_argv0, " "); + } + /* Remove the extra blank at the end. */ + new_argv0[arglen-1] = '\0'; + free(argv[0]); + argv[0] = new_argv0; + argv[1] = NULL; + } + else + file_not_found++; + } + else { + /* Attempt to read the first line of the file */ + if (ReadFile( exec_handle, + buf, sizeof(buf) - 1, /* leave room for trailing NULL */ + &bytes_returned, 0) == FALSE || bytes_returned < 2) { + + pproc->last_err = GetLastError(); + pproc->lerrno = E_IO; + CloseHandle(exec_handle); + return(-1); + } + if (buf[0] == '#' && buf[1] == '!') { + /* + * This is a shell script... Change the command line from + * exec_path args to shell_name exec_path args + */ + char *p; + + /* Make sure buf is NULL terminated */ + buf[bytes_returned] = 0; + /* + * Depending on the file system type, etc. the first line + * of the shell script may end with newline or newline-carriage-return + * Whatever it ends with, cut it off. + */ + p= strchr(buf, '\n'); + if (p) + *p = 0; + p = strchr(buf, '\r'); + if (p) + *p = 0; + + /* + * Find base name of shell + */ + shell_name = strrchr( buf, '/'); + if (shell_name) { + shell_name++; + } else { + shell_name = &buf[2];/* skipping "#!" */ + } + + } + CloseHandle(exec_handle); + } + + flags = 0; + + if (file_not_found) + command_line = make_command_line( shell_name, exec_path, argv); + else { + /* If exec_fname includes whitespace, CreateProcess + behaves erratically and unreliably, and often fails + if argv[0] also includes whitespace (and thus will + be quoted by make_command_line below). So in that + case, we don't pass exec_fname as the 1st arg to + CreateProcess, but instead replace argv[0] with + exec_fname (to keep its leading directories and + extension as found by find_file), and pass NULL to + CreateProcess as its 1st arg. This works around + the bugs in CreateProcess, which are probably + caused by its passing the command to cmd.exe with + some incorrect quoting. */ + if (!shell_name + && batch_file_with_spaces(exec_fname) + && _stricmp(exec_path, argv[0]) == 0) { + pass_null_exec_path = 1; + free (argv[0]); + argv[0] = xstrdup(exec_fname); + } + 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->last_err = 0; + pproc->lerrno = E_NO_MEM; + free( command_line ); + if (pproc->last_err == ERROR_INVALID_PARAMETER + && envsize_needed > 32*1024) { + fprintf (stderr, "CreateProcess failed, probably because environment is too large (%d bytes).\n", + envsize_needed); + } + 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 + */ + GetStartupInfo(&startInfo); + startInfo.dwFlags = STARTF_USESTDHANDLES; + startInfo.lpReserved = 0; + startInfo.cbReserved2 = 0; + startInfo.lpReserved2 = 0; + startInfo.hStdInput = (HANDLE)pproc->sv_stdin[1]; + startInfo.hStdOutput = (HANDLE)pproc->sv_stdout[1]; + startInfo.hStdError = (HANDLE)pproc->sv_stderr[1]; + + if (as_user) { + free(envblk); + return -1; + } else { + DB (DB_JOBS, ("CreateProcess(%s,%s,...)\n", + exec_path ? exec_path : "NULL", + command_line ? command_line : "NULL")); + if (CreateProcess( + exec_path, + command_line, + NULL, + 0, /* default security attributes for thread */ + TRUE, /* inherit handles (e.g. helper pipes, oserv socket) */ + flags, + envblk, + 0, /* default starting directory */ + &startInfo, + &procInfo) == FALSE) { + + pproc->last_err = GetLastError(); + pproc->lerrno = E_FORK; + fprintf(stderr, "process_begin: CreateProcess(%s, %s, ...) failed.\n", + exec_path ? exec_path : "NULL", command_line); + free(envblk); + free( command_line ); + return(-1); + } + } + + pproc->pid = (pid_t)procInfo.hProcess; + /* Close the thread handle -- we'll just watch the process */ + CloseHandle(procInfo.hThread); + + /* Close the halves of the pipes we don't need */ + if ((HANDLE)pproc->sv_stdin[1] != INVALID_HANDLE_VALUE) + CloseHandle((HANDLE)pproc->sv_stdin[1]); + if ((HANDLE)pproc->sv_stdout[1] != INVALID_HANDLE_VALUE) + CloseHandle((HANDLE)pproc->sv_stdout[1]); + if ((HANDLE)pproc->sv_stderr[1] != INVALID_HANDLE_VALUE) + CloseHandle((HANDLE)pproc->sv_stderr[1]); + pproc->sv_stdin[1] = 0; + pproc->sv_stdout[1] = 0; + pproc->sv_stderr[1] = 0; + + free( command_line ); + free(envblk); + pproc->lerrno=0; + return 0; +} + + + +#if 0 /* unused */ +static DWORD +proc_stdin_thread(sub_process *pproc) +{ + DWORD in_done; + for (;;) { + if (WriteFile( (HANDLE) pproc->sv_stdin[0], pproc->inp, pproc->incnt, + &in_done, NULL) == FALSE) + _endthreadex(0); + // This if should never be true for anonymous pipes, but gives + // us a chance to change I/O mechanisms later + if (in_done < pproc->incnt) { + pproc->incnt -= in_done; + pproc->inp += in_done; + } else { + _endthreadex(0); + } + } + return 0; // for compiler warnings only.. not reached +} + +static DWORD +proc_stdout_thread(sub_process *pproc) +{ + DWORD bufsize = 1024; + char c; + DWORD nread; + pproc->outp = malloc(bufsize); + if (pproc->outp == NULL) + _endthreadex(0); + pproc->outcnt = 0; + + for (;;) { + if (ReadFile( (HANDLE)pproc->sv_stdout[0], &c, 1, &nread, NULL) + == FALSE) { +/* map_windows32_error_to_string(GetLastError());*/ + _endthreadex(0); + } + if (nread == 0) + _endthreadex(0); + if (pproc->outcnt + nread > bufsize) { + bufsize += nread + 512; + pproc->outp = realloc(pproc->outp, bufsize); + if (pproc->outp == NULL) { + pproc->outcnt = 0; + _endthreadex(0); + } + } + pproc->outp[pproc->outcnt++] = c; + } + return 0; +} + +static DWORD +proc_stderr_thread(sub_process *pproc) +{ + DWORD bufsize = 1024; + char c; + DWORD nread; + pproc->errp = malloc(bufsize); + if (pproc->errp == NULL) + _endthreadex(0); + pproc->errcnt = 0; + + for (;;) { + if (ReadFile( (HANDLE)pproc->sv_stderr[0], &c, 1, &nread, NULL) == FALSE) { + map_windows32_error_to_string(GetLastError()); + _endthreadex(0); + } + if (nread == 0) + _endthreadex(0); + if (pproc->errcnt + nread > bufsize) { + bufsize += nread + 512; + pproc->errp = realloc(pproc->errp, bufsize); + if (pproc->errp == NULL) { + pproc->errcnt = 0; + _endthreadex(0); + } + } + pproc->errp[pproc->errcnt++] = c; + } + return 0; +} + + +/* + * Purpose: collects output from child process and returns results + * + * Description: + * + * Returns: + * + * Notes/Dependencies: + */ + long +process_pipe_io( + HANDLE proc, + char *stdin_data, + int stdin_data_len) +{ + sub_process *pproc = (sub_process *)proc; + bool_t stdin_eof = FALSE, stdout_eof = FALSE, stderr_eof = FALSE; + HANDLE childhand = (HANDLE) pproc->pid; + HANDLE tStdin = NULL, tStdout = NULL, tStderr = NULL; + unsigned int dwStdin, dwStdout, dwStderr; + HANDLE wait_list[4]; + DWORD wait_count; + DWORD wait_return; + HANDLE ready_hand; + bool_t child_dead = FALSE; + BOOL GetExitCodeResult; + + /* + * Create stdin thread, if needed + */ + pproc->inp = stdin_data; + pproc->incnt = stdin_data_len; + if (!pproc->inp) { + stdin_eof = TRUE; + CloseHandle((HANDLE)pproc->sv_stdin[0]); + pproc->sv_stdin[0] = 0; + } else { + tStdin = (HANDLE) _beginthreadex( 0, 1024, + (unsigned (__stdcall *) (void *))proc_stdin_thread, + pproc, 0, &dwStdin); + if (tStdin == 0) { + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + goto done; + } + } + + /* + * Assume child will produce stdout and stderr + */ + tStdout = (HANDLE) _beginthreadex( 0, 1024, + (unsigned (__stdcall *) (void *))proc_stdout_thread, pproc, 0, + &dwStdout); + tStderr = (HANDLE) _beginthreadex( 0, 1024, + (unsigned (__stdcall *) (void *))proc_stderr_thread, pproc, 0, + &dwStderr); + + if (tStdout == 0 || tStderr == 0) { + + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + goto done; + } + + + /* + * Wait for all I/O to finish and for the child process to exit + */ + + while (!stdin_eof || !stdout_eof || !stderr_eof || !child_dead) { + wait_count = 0; + if (!stdin_eof) { + wait_list[wait_count++] = tStdin; + } + if (!stdout_eof) { + wait_list[wait_count++] = tStdout; + } + if (!stderr_eof) { + wait_list[wait_count++] = tStderr; + } + if (!child_dead) { + wait_list[wait_count++] = childhand; + } + + wait_return = WaitForMultipleObjects(wait_count, wait_list, + FALSE, /* don't wait for all: one ready will do */ + child_dead? 1000 :INFINITE); /* after the child dies, subthreads have + one second to collect all remaining output */ + + if (wait_return == WAIT_FAILED) { +/* map_windows32_error_to_string(GetLastError());*/ + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + goto done; + } + + ready_hand = wait_list[wait_return - WAIT_OBJECT_0]; + + if (ready_hand == tStdin) { + CloseHandle((HANDLE)pproc->sv_stdin[0]); + pproc->sv_stdin[0] = 0; + CloseHandle(tStdin); + tStdin = 0; + stdin_eof = TRUE; + + } else if (ready_hand == tStdout) { + + CloseHandle((HANDLE)pproc->sv_stdout[0]); + pproc->sv_stdout[0] = 0; + CloseHandle(tStdout); + tStdout = 0; + stdout_eof = TRUE; + + } else if (ready_hand == tStderr) { + + CloseHandle((HANDLE)pproc->sv_stderr[0]); + pproc->sv_stderr[0] = 0; + CloseHandle(tStderr); + tStderr = 0; + stderr_eof = TRUE; + + } else if (ready_hand == childhand) { + + DWORD ierr; + GetExitCodeResult = GetExitCodeProcess(childhand, &ierr); + if (ierr == CONTROL_C_EXIT) { + pproc->signal = SIGINT; + } else { + pproc->exit_code = ierr; + } + if (GetExitCodeResult == FALSE) { + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + goto done; + } + child_dead = TRUE; + + } else { + + /* ?? Got back a handle we didn't query ?? */ + pproc->last_err = 0; + pproc->lerrno = E_FAIL; + goto done; + } + } + + done: + if (tStdin != 0) + CloseHandle(tStdin); + if (tStdout != 0) + CloseHandle(tStdout); + if (tStderr != 0) + CloseHandle(tStderr); + + if (pproc->lerrno) + return(-1); + else + return(0); + +} +#endif /* unused */ + +/* + * Purpose: collects output from child process and returns results + * + * Description: + * + * Returns: + * + * Notes/Dependencies: + */ + long +process_file_io( + HANDLE proc) +{ + sub_process *pproc; + HANDLE childhand; + DWORD wait_return; + BOOL GetExitCodeResult; + DWORD ierr; + + if (proc == NULL) + pproc = process_wait_for_any_private(1, 0); + else + pproc = (sub_process *)proc; + + /* some sort of internal error */ + if (!pproc) + return -1; + + childhand = (HANDLE) pproc->pid; + + /* + * This function is poorly named, and could also be used just to wait + * for child death if you're doing your own pipe I/O. If that is + * the case, close the pipe handles here. + */ + if (pproc->sv_stdin[0]) { + CloseHandle((HANDLE)pproc->sv_stdin[0]); + pproc->sv_stdin[0] = 0; + } + if (pproc->sv_stdout[0]) { + CloseHandle((HANDLE)pproc->sv_stdout[0]); + pproc->sv_stdout[0] = 0; + } + if (pproc->sv_stderr[0]) { + CloseHandle((HANDLE)pproc->sv_stderr[0]); + pproc->sv_stderr[0] = 0; + } + + /* + * Wait for the child process to exit + */ + + wait_return = WaitForSingleObject(childhand, INFINITE); + + if (wait_return != WAIT_OBJECT_0) { +/* map_windows32_error_to_string(GetLastError());*/ + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + goto done2; + } + + GetExitCodeResult = GetExitCodeProcess(childhand, &ierr); + if (ierr == CONTROL_C_EXIT) { + pproc->signal = SIGINT; + } else { + pproc->exit_code = ierr; + } + if (GetExitCodeResult == FALSE) { + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + } + +done2: + if (pproc->lerrno) + return(-1); + else + return(0); + +} + +/* + * Description: Clean up any leftover handles, etc. It is up to the + * caller to manage and free the input, output, and stderr buffers. + */ + void +process_cleanup( + HANDLE proc) +{ + sub_process *pproc = (sub_process *)proc; + int i; + + if (pproc->using_pipes) { + for (i= 0; i <= 1; i++) { + if ((HANDLE)pproc->sv_stdin[i] + && (HANDLE)pproc->sv_stdin[i] != INVALID_HANDLE_VALUE) + CloseHandle((HANDLE)pproc->sv_stdin[i]); + if ((HANDLE)pproc->sv_stdout[i] + && (HANDLE)pproc->sv_stdout[i] != INVALID_HANDLE_VALUE) + CloseHandle((HANDLE)pproc->sv_stdout[i]); + if ((HANDLE)pproc->sv_stderr[i] + && (HANDLE)pproc->sv_stderr[i] != INVALID_HANDLE_VALUE) + CloseHandle((HANDLE)pproc->sv_stderr[i]); + } + } + if ((HANDLE)pproc->pid) + CloseHandle((HANDLE)pproc->pid); + + free(pproc); +} + + +/* + * Description: + * Create a command line buffer to pass to CreateProcess + * + * Returns: the buffer or NULL for failure + * Shell case: sh_name a:/full/path/to/script argv[1] argv[2] ... + * Otherwise: argv[0] argv[1] argv[2] ... + * + * Notes/Dependencies: + * CreateProcess does not take an argv, so this command creates a + * command line for the executable. + */ + +static char * +make_command_line( char *shell_name, char *full_exec_path, char **argv) +{ + int argc = 0; + char** argvi; + int* enclose_in_quotes = NULL; + int* enclose_in_quotes_i; + unsigned int bytes_required = 0; + char* command_line; + char* command_line_i; + int cygwin_mode = 0; /* HAVE_CYGWIN_SHELL */ + int have_sh = 0; /* HAVE_CYGWIN_SHELL */ + +#ifdef HAVE_CYGWIN_SHELL + have_sh = (shell_name != NULL || strstr(full_exec_path, "sh.exe")); + cygwin_mode = 1; +#endif + + if (shell_name && full_exec_path) { + bytes_required + = strlen(shell_name) + 1 + strlen(full_exec_path); + /* + * Skip argv[0] if any, when shell_name is given. + * The special case of "-c" in full_exec_path means + * argv[0] is not the shell name, but the command string + * to pass to the shell. + */ + if (*argv && strcmp(full_exec_path, "-c")) argv++; + /* + * Add one for the intervening space. + */ + if (*argv) bytes_required++; + } + + argvi = argv; + while (*(argvi++)) argc++; + + if (argc) { + enclose_in_quotes = (int*) calloc(1, argc * sizeof(int)); + + if (!enclose_in_quotes) { + return NULL; + } + } + + /* We have to make one pass through each argv[i] to see if we need + * to enclose it in ", so we might as well figure out how much + * memory we'll need on the same pass. + */ + + argvi = argv; + enclose_in_quotes_i = enclose_in_quotes; + while(*argvi) { + char* p = *argvi; + unsigned int backslash_count = 0; + + /* + * We have to enclose empty arguments in ". + */ + if (!(*p)) *enclose_in_quotes_i = 1; + + while(*p) { + switch (*p) { + case '\"': + /* + * We have to insert a backslash for each " + * and each \ that precedes the ". + */ + bytes_required += (backslash_count + 1); + backslash_count = 0; + break; + +#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL) + case '\\': + backslash_count++; + break; +#endif + /* + * At one time we set *enclose_in_quotes_i for '*' or '?' to suppress + * wildcard expansion in programs linked with MSVC's SETARGV.OBJ so + * that argv in always equals argv out. This was removed. Say you have + * such a program named glob.exe. You enter + * glob '*' + * at the sh command prompt. Obviously the intent is to make glob do the + * wildcarding instead of sh. If we set *enclose_in_quotes_i for '*' or '?', + * then the command line that glob would see would be + * glob "*" + * and the _setargv in SETARGV.OBJ would _not_ expand the *. + */ + case ' ': + case '\t': + *enclose_in_quotes_i = 1; + /* fall through */ + + default: + backslash_count = 0; + break; + } + + /* + * Add one for each character in argv[i]. + */ + bytes_required++; + + p++; + } + + if (*enclose_in_quotes_i) { + /* + * Add one for each enclosing ", + * and one for each \ that precedes the + * closing ". + */ + bytes_required += (backslash_count + 2); + } + + /* + * Add one for the intervening space. + */ + if (*(++argvi)) bytes_required++; + enclose_in_quotes_i++; + } + + /* + * Add one for the terminating NULL. + */ + bytes_required++; + + command_line = (char*) malloc(bytes_required); + + if (!command_line) { + free(enclose_in_quotes); + return NULL; + } + + command_line_i = command_line; + + if (shell_name && full_exec_path) { + while(*shell_name) { + *(command_line_i++) = *(shell_name++); + } + + *(command_line_i++) = ' '; + + while(*full_exec_path) { + *(command_line_i++) = *(full_exec_path++); + } + + if (*argv) { + *(command_line_i++) = ' '; + } + } + + argvi = argv; + enclose_in_quotes_i = enclose_in_quotes; + + while(*argvi) { + char* p = *argvi; + unsigned int backslash_count = 0; + + if (*enclose_in_quotes_i) { + *(command_line_i++) = '\"'; + } + + while(*p) { + if (*p == '\"') { + if (cygwin_mode && have_sh) { /* HAVE_CYGWIN_SHELL */ + /* instead of a \", cygwin likes "" */ + *(command_line_i++) = '\"'; + } else { + + /* + * We have to insert a backslash for the " + * and each \ that precedes the ". + */ + backslash_count++; + + while(backslash_count) { + *(command_line_i++) = '\\'; + backslash_count--; + }; + } +#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL) + } else if (*p == '\\') { + backslash_count++; + } else { + backslash_count = 0; +#endif + } + + /* + * Copy the character. + */ + *(command_line_i++) = *(p++); + } + + if (*enclose_in_quotes_i) { +#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL) + /* + * Add one \ for each \ that precedes the + * closing ". + */ + while(backslash_count--) { + *(command_line_i++) = '\\'; + }; +#endif + *(command_line_i++) = '\"'; + } + + /* + * Append an intervening space. + */ + if (*(++argvi)) { + *(command_line_i++) = ' '; + } + + enclose_in_quotes_i++; + } + + /* + * Append the terminating NULL. + */ + *command_line_i = '\0'; + + free(enclose_in_quotes); + return command_line; +} + +/* + * Description: Given an argv and optional envp, launch the process + * using the default stdin, stdout, and stderr handles. + * Also, register process so that process_wait_for_any_private() + * can be used via process_file_io(NULL) or + * process_wait_for_any(). + * + * Returns: + * + * Notes/Dependencies: + */ +HANDLE +process_easy( + char **argv, + char **envp, + int outfd, + int errfd) +{ + HANDLE hIn = INVALID_HANDLE_VALUE; + HANDLE hOut = INVALID_HANDLE_VALUE; + HANDLE hErr = INVALID_HANDLE_VALUE; + HANDLE hProcess, tmpIn, tmpOut, tmpErr; + DWORD e; + + if (proc_index >= MAXIMUM_WAIT_OBJECTS) { + DB (DB_JOBS, ("process_easy: All process slots used up\n")); + return INVALID_HANDLE_VALUE; + } + /* Standard handles returned by GetStdHandle can be NULL or + INVALID_HANDLE_VALUE if the parent process closed them. If that + happens, we open the null device and pass its handle to + CreateProcess as the corresponding handle to inherit. */ + tmpIn = GetStdHandle(STD_INPUT_HANDLE); + if (DuplicateHandle(GetCurrentProcess(), + tmpIn, + GetCurrentProcess(), + &hIn, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) { + if ((e = GetLastError()) == ERROR_INVALID_HANDLE) { + tmpIn = CreateFile("NUL", GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (tmpIn != INVALID_HANDLE_VALUE + && DuplicateHandle(GetCurrentProcess(), + tmpIn, + GetCurrentProcess(), + &hIn, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) + CloseHandle(tmpIn); + } + if (hIn == INVALID_HANDLE_VALUE) { + fprintf(stderr, "process_easy: DuplicateHandle(In) failed (e=%ld)\n", e); + return INVALID_HANDLE_VALUE; + } + } + if (outfd >= 0) + tmpOut = (HANDLE)_get_osfhandle (outfd); + else + tmpOut = GetStdHandle (STD_OUTPUT_HANDLE); + if (DuplicateHandle(GetCurrentProcess(), + tmpOut, + GetCurrentProcess(), + &hOut, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) { + if ((e = GetLastError()) == ERROR_INVALID_HANDLE) { + tmpOut = CreateFile("NUL", GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (tmpOut != INVALID_HANDLE_VALUE + && DuplicateHandle(GetCurrentProcess(), + tmpOut, + GetCurrentProcess(), + &hOut, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) + CloseHandle(tmpOut); + } + if (hOut == INVALID_HANDLE_VALUE) { + fprintf(stderr, "process_easy: DuplicateHandle(Out) failed (e=%ld)\n", e); + return INVALID_HANDLE_VALUE; + } + } + if (errfd >= 0) + tmpErr = (HANDLE)_get_osfhandle (errfd); + else + tmpErr = GetStdHandle(STD_ERROR_HANDLE); + if (DuplicateHandle(GetCurrentProcess(), + tmpErr, + GetCurrentProcess(), + &hErr, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) { + if ((e = GetLastError()) == ERROR_INVALID_HANDLE) { + tmpErr = CreateFile("NUL", GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (tmpErr != INVALID_HANDLE_VALUE + && DuplicateHandle(GetCurrentProcess(), + tmpErr, + GetCurrentProcess(), + &hErr, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) + CloseHandle(tmpErr); + } + if (hErr == INVALID_HANDLE_VALUE) { + fprintf(stderr, "process_easy: DuplicateHandle(Err) failed (e=%ld)\n", e); + return INVALID_HANDLE_VALUE; + } + } + + hProcess = process_init_fd(hIn, hOut, hErr); + + if (process_begin(hProcess, argv, envp, argv[0], NULL)) { + fake_exits_pending++; + /* process_begin() failed: make a note of that. */ + if (!((sub_process*) hProcess)->last_err) + ((sub_process*) hProcess)->last_err = -1; + ((sub_process*) hProcess)->exit_code = process_last_err(hProcess); + + /* close up unused handles */ + if (hIn != INVALID_HANDLE_VALUE) + CloseHandle(hIn); + if (hOut != INVALID_HANDLE_VALUE) + CloseHandle(hOut); + if (hErr != INVALID_HANDLE_VALUE) + CloseHandle(hErr); + } + + process_register(hProcess); + + return hProcess; +} diff --git a/w32/subproc/w32err.c b/w32/subproc/w32err.c new file mode 100644 index 0000000..9ff4f4c --- /dev/null +++ b/w32/subproc/w32err.c @@ -0,0 +1,85 @@ +/* Error handling for Windows +Copyright (C) 1996-2014 Free 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; +} -- cgit v1.2.1